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

来源:互联网 发布:超级基因优化液第二部 编辑:程序博客网 时间:2024/06/14 03:28

大概题意:城市里要竞选市长,然后在一块墙上可以贴海报为自己拉票,每个人可以贴连续的一块区域,后来帖的可以覆盖前面的,问到最后一共可以看到多少张海报。

刚学的离散化姿势,vector+unique去重,然后lower_bound查找下标...离散化就是只记录出现过的端点..附上弱渣代码:

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<set>#include<vector>#include<iterator>#include<map>using namespace std;#define LL long long#define N 100007int l[N],r[N];struct data{    int l,r,cover;}data[N];map<int,int>mp;void build(int l,int r,int k){    data[k].l=l;    data[k].r=r;    data[k].cover=0;    if(l==r)    {        return;    }    int mid=(l+r)/2;    build(l,mid,k*2);    build(mid+1,r,k*2+1);}void updata(int l,int r,int k,int x){    if(data[k].l==l&&data[k].r==r)    {        data[k].cover=x;        return ;    }    if(data[k].cover!=0)    {        data[k*2].cover=data[k*2+1].cover=data[k].cover;        data[k].cover=0;    }    int mid=(data[k].l+data[k].r)/2;    if(r<=mid)        updata(l,r,k*2,x);    else if(l>mid)        updata(l,r,k*2+1,x);    else    {        updata(l,mid,k*2,x);        updata(mid+1,r,k*2+1,x);    }}int query(int k){    int ans=0;    if(data[k].cover!=0)    {        if(mp[data[k].cover]==0)        {            ans++;            mp[data[k].cover]=1;        }    }    else    {        ans+=query(k*2);        ans+=query(k*2+1);    }    return ans;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        mp.clear();        vector<int> v;        vector<int>::iterator it;        int n;        scanf("%d",&n);        for(int i=1;i<=n;i++)        {            scanf("%d %d",&l[i],&r[i]);            v.push_back(l[i]);            v.push_back(r[i]);        }        sort(v.begin(),v.end());        it=unique(v.begin(),v.end());        v.erase(it,v.end());        int k=v.size();        build(1,k,1);        for(int i=1;i<=n;i++)        {            int x=lower_bound(v.begin(),v.end(),l[i])-v.begin();            int y=lower_bound(v.begin(),v.end(),r[i])-v.begin();            updata(x+1,y+1,1,i);        }        int ans=query(1);        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击