首页 > 代码库 > POJ 2528 Mayor's posters --线段树+离散化
POJ 2528 Mayor's posters --线段树+离散化
题意:不讲了,线段树离散化的入门题。之所以贴出来只为吐槽几个地方:
1.最后统计颜色的时候,试了好几种方法都TLE,反正用vis就TLE,不知道别人的怎么行,最后没办法,学了网上一个机智的做法:用set记录ans个数,最后过了。
2.数据不对,离散化的时候如果排完序后相邻的元素值不相邻的话,是不能离散为相邻的两个元素的,比如数据:
3
1 10
1 3
6 10
答案应该为3,而普通离散化后的线段变为了 [1,4], [1,2], [3,4],就是说[1,4]被其他两个线段给覆盖了,输出为2,这是不对的,但是POJ竟然可以过。一个字,水!
代码: (922ms飘过~)
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <map>#include <set>using namespace std;#define N 10007int L[N],R[N],line[2*N];int tree[16*N],vis[N];map<int,int> mp;set<int> ans;void build(int l,int r,int rt){ tree[rt] = 0; if(l == r) return; int mid = (l+r)/2; build(l,mid,2*rt); build(mid+1,r,2*rt+1);}void pushdown(int rt,int col){ if(tree[rt] != col && tree[rt] > 0) { tree[2*rt] = tree[2*rt+1] = tree[rt]; tree[rt] = 0; }}void update(int l,int r,int aa,int bb,int col,int rt){ if(aa <= l && bb >= r) { tree[rt] = col; return; } pushdown(rt,col); int mid = (l+r)/2; if(aa <= mid) update(l,mid,aa,bb,col,2*rt); if(bb > mid) update(mid+1,r,aa,bb,col,2*rt+1);}int query(int l,int r,int rt) //Time Limit Exceeded{ if(tree[rt]) { if(!vis[tree[rt]]) { vis[tree[rt]] = 1; return 1; } return 0; } if(l == r) return 0; int mid = (l+r)/2; return query(l,mid,2*rt) + query(mid+1,r,2*rt+1);}int res;void Q(int l,int r,int rt) //Time Limit Exceeded{ if(tree[rt]) { if(!vis[tree[rt]]) { vis[tree[rt]] = 1; res++; } return; } if(l == r) return; int mid = (l+r)/2; Q(l,mid,2*rt); Q(mid+1,r,2*rt+1);}void SUM(int l,int r,int rt) //Accepted{ if(tree[rt]) { ans.insert(tree[rt]); return; } if(l == r) return; int mid = (l+r)/2; SUM(l,mid,2*rt); SUM(mid+1,r,2*rt+1);}int main(){ int t,n,i,j; scanf("%d",&t); while(t--) { scanf("%d",&n); mp.clear(); ans.clear(); for(i=1;i<=n;i++) { scanf("%d%d",&L[i],&R[i]); line[2*i-1] = L[i]; line[2*i] = R[i]; } sort(line+1,line+2*n+1); int ind = unique(line+1,line+2*n+1)-line-1; int now = 0; mp[line[1]] = ++now; for(i=2;i<=ind;i++) { if(line[i] > line[i-1]+1) mp[line[i]] = now+2,now+=2; else if(line[i] == line[i-1] + 1) mp[line[i]] = ++now; } build(1,now,1); for(i=1;i<=n;i++) update(1,now,mp[L[i]],mp[R[i]],i,1); SUM(1,now,1); printf("%d\n",ans.size()); } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。