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 (线段树 离散化+区间更新+区间求值 )的主要内容,如果未能解决你的问题,请参考以下文章

[POJ2528]Mayor's posters

poj~2528 Mayor's posters

Mayor's posters POJ - 2528

POJ-2528-Mayor's posters

POJ2528Mayor's posters[线段树 离散化]

线段树+离散化POJ2528 Mayor's posters