poj 2528 Mayor's posters

离散话和区间修改:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN= 100010;
int t[MAXN][2],s[MAXN<<3];
struct tree{
    int l,r;
    int color;
}a[MAXN<<3];
int ans=0;
int vis[MAXN<<3];
void Build(int l,int r,int k){
    a[k].l=l,a[k].r=r,a[k].color=0;
    if(l == r){
        return ;
    }
    else{
        int mid=(a[k].l+a[k].r)>>1;
        Build(l,mid,k<<1);
        Build(mid+1,r,k<<1|1);
    }
}
void pushdown(int k){
    if(a[k].color){
        a[k<<1].color=a[k].color;
        a[k<<1|1].color=a[k].color;
        a[k].color=0;
    }
}
void insertp(int l,int r,int col,int k){
    if(s[a[k].l]==l && s[a[k].r]==r){
        a[k].color=col;
        return ;
    }
    else{
        pushdown(k);
        int mid=(a[k].l+a[k].r)>>1;
        if(r<=s[mid]){
            insertp(l,r,col,k<<1);
        }
        else if(l>s[mid]){
            insertp(l,r,col,k<<1|1);
        }
        else{
            insertp(l,s[mid],col,k<<1);
            insertp(s[mid+1],r,col,k<<1|1);
        }
    }
}
void query(int k){
    if(a[k].color){
        if(!vis[a[k].color]){
            vis[a[k].color]=1;
            ans++;
        }
        return ;
    }
    query(k<<1);
    query(k<<1|1);
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        int n;
        scanf("%d",&n);
        int counter=0;
        for(int i=1;i<=n;i++){
            scanf("%d%d",&t[i][0],&t[i][1]);
            s[counter++]=t[i][0];
            s[counter++]=t[i][1];
        }
        sort(s,s+counter);
        counter=unique(s,s+counter)-s;
        Build(0,counter-1,1);
        for(int i=1;i<=n;i++){
            insertp(t[i][0],t[i][1],i,1);
        }
        memset(vis,0,sizeof(vis));
        ans=0;
        query(1);
        printf("%d\n",ans);
    }
    return 0;
}


posted @ 2014-11-08 18:31  Scale_the_heights  阅读(124)  评论(0)    收藏  举报