博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
贴海报 (线段树染色-离散化
阅读量:5124 次
发布时间:2019-06-13

本文共 2460 字,大约阅读时间需要 8 分钟。

n(n<=10000) 个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000) 。求出最后还能看见多少张海报。

虽然之前学过离散化,但用的时候就想不起来 emm;

10000个海报 最多有10000个区间 20000个坐标值,远少于10000000,因此采用离散化

将离散化后的坐标对应数组下标储存到线段树中 ;

染色区间是整段的,本身就可以看做 lazy标记 ,需要下推函数;

 

下推 :

void push_down(int pos){     if(  col[pos]==-1 )return ;     col[pos<<1]=col[pos<<1|1]=col[pos];     col[pos]=-1;     return ;}

染色 :

void  updata ( int L  ,int R ,int l ,int r,int pos ,int c ){     if( l>=L && r<=R){
col[pos] = c; return ; } push_down(pos); int mid= (l+r)>>1; if( mid >= L) updata ( L ,R ,l ,mid ,pos<<1 ,c); if( mid < R) updata( L ,R ,mid+1 ,r ,pos<<1|1 ,c); return ;}

注意区间的染色情况,要在各区间坐标之间在增加一个取样;

eg: 线段树  仅采集坐标端点的线段树 1~10 -- 1~3  6~10 --1~1 3~3 6~6 10~10     

这样 如 3~6 这个区间之间的颜色就无法判断;

因此要增加离散化取样:

//离散化for( int i=0; i
1)p[cnt++] =pl[i]+1; } sort( p , p+cnt); int sz = unique( p ,p+cnt) - p;

查询:

void query( int L ,int R ,int  pos){      if( col[pos]!=-1 && ! vis[ col[pos]]){           // cout << col[pos]<<' '<
<<' '<
<
>1; query(L ,mid ,pos <<1 ); query( mid+1 ,R ,pos<<1|1); return ;}
#include 
#include
#include
#include
using namespace std;int pl[10050] ,pr[10050],p[40050];int col [160050],vis[160050];int ans =0;void push_down(int pos){ if( col[pos]==-1 )return ; col[pos<<1]=col[pos<<1|1]=col[pos]; col[pos]=-1; return ;}void updata ( int L ,int R ,int l ,int r,int pos ,int c ){ if( l>=L && r<=R){ // cout<< pos<<" "<
<
>1; if( mid >= L) updata ( L ,R ,l ,mid ,pos<<1 ,c); if( mid < R) updata( L ,R ,mid+1 ,r ,pos<<1|1 ,c); return ;}void query( int L ,int R ,int pos){ if( col[pos]!=-1 && ! vis[ col[pos]]){ // cout << col[pos]<<' '<
<<' '<
<
>1; query(L ,mid ,pos <<1 ); query( mid+1 ,R ,pos<<1|1); return ;}int bond( int n ,int x ,int y ){ int mid = x+(y-x)/2 ; while( p[mid] != n ){ if( p[mid] > n){ y = mid; } if( p[mid] < n){ x= mid+1; } mid = x+(y-x)/2 ; } return mid;}int main( ){ freopen( "out.txt" ,"w",stdout); int T; int n; scanf( "%d",&T ); while ( T--){ memset( col ,-1 ,sizeof(col)); memset( vis , 0 ,sizeof(vis)); scanf("%d",&n); int cnt=0; for( int i=0; i
1)p[cnt++] =pl[i]+1; } sort( p , p+cnt); int sz = unique( p ,p+cnt) - p; // for( int i=0 ;i

 

转载于:https://www.cnblogs.com/-ifrush/p/10614246.html

你可能感兴趣的文章
Eclipse相关集锦
查看>>
虚拟化架构中小型机构通用虚拟化架构
查看>>
继承条款effecitve c++ 条款41-45
查看>>
Java泛型的基本使用
查看>>
1076 Wifi密码 (15 分)
查看>>
noip模拟赛 党
查看>>
bzoj2038 [2009国家集训队]小Z的袜子(hose)
查看>>
Java反射机制及其Class类浅析
查看>>
Postman-----如何导入和导出
查看>>
移动设备显示尺寸大全 CSS3媒体查询
查看>>
图片等比例缩放及图片上下剧中
查看>>
【转载】Linux screen 命令详解
查看>>
background-clip,background-origin
查看>>
Android 高级UI设计笔记12:ImageSwitcher图片切换器
查看>>
【Linux】ping命令详解
查看>>
对团队成员公开感谢博客
查看>>
java学习第三天
查看>>
python目录
查看>>
django+uwsgi+nginx+sqlite3部署+screen
查看>>
Andriod小型管理系统(Activity,SQLite库操作,ListView操作)(源代码下载)
查看>>