首页 > 代码库 > POJ--2528--Mayor's posters【线段树+离散化】
POJ--2528--Mayor's posters【线段树+离散化】
题意:在一块木板上贴海报,每次贴海报给一个横坐标范围,在这个范围内贴,按照它给的顺序,海报可以被覆盖,问最后还能看见几张海报。
都说这是线段树入门题。。。。结果我还是出翔了,不是在线段树部分,是在离散化部分。
我之前看到一个很飘逸的离散化写法,可惜找不到了,这回是这么写的:去重之后再把每个点的后一个值也加入离散化后的数组(如果这个值之前没有的话),这样避免了漏掉中间没被覆盖的情况。
然后样例都没调通,后来发现lowwer_bound返回值有可能是0,而我的线段树是以1为左边界的,每次这么更新难免会漏掉0的值,后来找到更新区间后给它们+1,终于把样例调通了。然后开始RE出翔,我确信线段树部分写的没问题,问题出在了离散化部分,可就算这样,我还是没找到RE在哪。找不出来的时候,索性重写一遍,写到lowwer_bound时想起来RE代码的lowwer_bound数组上限似乎是离散化之前的数组上限,OJ上看了一眼,果然是这样。。改之,AC
这一题我出现了两个问题:一个是lowwer_bound返回值可能为0,而线段树是从1开始,需要把操作区间+1,或者让线段树从0开始。第二个是lowwer_bound中数组上限,顺手写成了离散化之前的,RE出翔都没发现错在哪。
#include<cstring> #include<string> #include<fstream> #include<iostream> #include<iomanip> #include<cstdio> #include<cctype> #include<algorithm> #include<queue> #include<map> #include<set> #include<vector> #include<stack> #include<ctime> #include<cstdlib> #include<functional> #include<cmath> using namespace std; #define PI acos(-1.0) #define MAXN 2000010 #define eps 1e-7 #define INF 0x7FFFFFFF #define seed 131 //#define ll long long #define ull unsigned ll #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 int n; int x[MAXN]; int sum[MAXN<<2]; int l[MAXN],r[MAXN]; map<int,int>mp; int ans; void pushdown(int rt){ if(sum[rt]){ sum[rt<<1] = sum[rt<<1|1] = sum[rt]; sum[rt] = 0; } } void build(int l,int r,int rt){ sum[rt] = 0; if(l==r) return ; int m = (l+r)>>1; build(lson); build(rson); } void update(int L,int R,int c,int l,int r,int rt){ if(L<=l&&r<=R){ sum[rt] = c; return ; } pushdown(rt); int m = (l+r)>>1; if(L<=m) update(L,R,c,lson); if(R>m) update(L,R,c,rson); } void query(int L,int R,int l,int r,int rt){ if(l==r){ if(sum[rt]&&mp[sum[rt]]!=0){ ans++; } mp[sum[rt]] = 0; sum[rt] = 0; return ; } pushdown(rt); int m = (l+r)>>1; if(L<=m) query(L,R,lson); if(R>m) query(L,R,rson); } int main(){ int t,i,m; scanf("%d",&t); while(t--){ ans = 0; m = 0; if(!mp.empty()) mp.clear(); scanf("%d",&n); if(n==0) continue; for(i=0;i<n;i++){ scanf("%d%d",&l[i],&r[i]); x[m++] = l[i]; x[m++] = r[i]; } sort(x,x+m); int xl = unique(x,x+m) - x; x[xl++] = x[xl-1] + 1; for(i=xl-1;i>0;i--){ if(x[i]!=x[i-1]+1) x[xl++] = x[i-1] + 1; } sort(x,x+xl); build(1,xl,1); for(i=0;i<n;i++){ int L = lower_bound(x,x+xl,l[i]) - x; int R = lower_bound(x,x+xl,r[i]) - x; update(L+1,R+1,i+1,1,xl,1); mp[i+1] = 1; } query(1,xl,1,xl,1); printf("%d\n",ans); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。