POJ 2528 Mayor's posters (线段树 离散化+区间更新+区间求值 )
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2528 Mayor's posters (线段树 离散化+区间更新+区间求值 )相关的知识,希望对你有一定的参考价值。
题目链接:http://poj.org/problem?id=2528
题意:涂色问题,给定n个要涂色的区间(每次用的颜色不一样,颜色覆盖性极强),问最后能看到多少种颜色。(贴海报问题转换)
题解:TLE+MLE(o(╥﹏╥)o),TLE线段树解决,MLE离散化解决
离散化:[1,4],[2,6],[8,10],[3,4],[7,10] 离散化得 1,2,3,4,6,7,8,10
1 2 3 4 5 6 7 8
1 2 3 4 6 7 8 10
新的区间[1,4] [2,5] [7,8] [3,4] [6,8]
原来的要10个空间,现在离散化只要8个空间,时间复杂度骤减(离散化个人感觉就是去重,排序一下)
这道题目还要考虑一个点其实表示的是一个单位长度,所以我们可以在相邻两个点之间加个数,以体现这个长度
线段树:Lazy标记,向下更新时更新完下面的节点,该节点直接涂上-1的颜色,使得查询的时候尽可能往下查询
挺好玩的一道题目
1 //POJ 2528 Mayor‘s posters 2 //离散化 区间更新 区间求值 3 #include <cmath> 4 #include <cstdio> 5 #include <cstring> 6 #include <iostream> 7 #include <algorithm> 8 using namespace std; 9 10 const int N=40000+10; 11 int X[4*N],tree[4*N]; 12 int li[N],ri[N]; 13 bool vis[4*N]; 14 int ans; 15 16 void pushdown(int x){ //Lazy 17 int tmp=x<<1; 18 tree[tmp]=tree[tmp+1]=tree[x]; 19 tree[x]=-1; //向下更新,更新到每个叶子 20 //使得查询的时候查询叶子颜色 21 } 22 23 void update(int l,int r,int x,int y,int col,int p){ 24 if(x<=l&&y>=r){ 25 tree[p]=col; 26 return ; 27 } 28 if(tree[p]!=-1) pushdown(p); 29 int mid=(l+r)>>1; 30 int tmp=p<<1; 31 if(y<=mid) update(l,mid,x,y,col,tmp); 32 else if(x>mid) update(mid+1,r,x,y,col,tmp+1); 33 else{ 34 update(l,mid,x,mid,col,tmp); 35 update(mid+1,r,mid+1,y,col,tmp+1); 36 } 37 } 38 39 void query(int l,int r,int x){ 40 if(tree[x]!=-1){ 41 if(!vis[tree[x]]){ 42 ans++; 43 vis[tree[x]]=1; 44 } 45 return ; 46 } 47 if(l==r) return ; 48 int mid=(l+r)>>1; 49 int tmp=x<<1; 50 query(l,mid,tmp); 51 query(mid+1,r,tmp+1); 52 } 53 54 int main(){ 55 int T,n; 56 scanf("%d",&T); 57 58 while(T--){ 59 memset(tree,-1,sizeof(tree)); //标记颜色 60 memset(vis,0,sizeof(vis)); 61 scanf("%d",&n); 62 int k=0; 63 for(int i=0;i<n;i++){ 64 scanf("%d %d",&li[i],&ri[i]); 65 X[k++]=li[i];X[k++]=ri[i]; 66 } 67 //离散化 68 sort(X,X+k); 69 int m=unique(X,X+k)-X; 70 int tmp=m; 71 for(int i=1;i<tmp;i++){ 72 if(X[i]>X[i-1]+1) X[m++]=X[i-1]+1; 73 } 74 sort(X,X+m); 75 for(int i=0;i<n;i++){ 76 int x=lower_bound(X,X+m,li[i])-X; 77 int y=lower_bound(X,X+m,ri[i])-X; 78 update(0,m-1,x,y,i,1); 79 } 80 ans=0; 81 query(0,m-1,1); 82 printf("%d\n",ans); 83 } 84 return 0; 85 }
以上是关于POJ 2528 Mayor's posters (线段树 离散化+区间更新+区间求值 )的主要内容,如果未能解决你的问题,请参考以下文章