POJ--2528--Mayor's posters【线段树+离散化】

来源:互联网 发布:looks for mac 编辑:程序博客网 时间:2024/05/26 07:28

题意:在一块木板上贴海报,每次贴海报给一个横坐标范围,在这个范围内贴,按照它给的顺序,海报可以被覆盖,问最后还能看见几张海报。


都说这是线段树入门题。。。。结果我还是出翔了,不是在线段树部分,是在离散化部分。

我之前看到一个很飘逸的离散化写法,可惜找不到了,这回是这么写的:去重之后再把每个点的后一个值也加入离散化后的数组(如果这个值之前没有的话),这样避免了漏掉中间没被覆盖的情况。

然后样例都没调通,后来发现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|1int 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;}


0 0