POJ - 2528 线段树

#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define INF 1000001000

const int maxn = 51010;
int cover[maxn<<2];
void build(int l,int r,int rt){
cover[rt]=0;
if(l==r) return ;
int m=(l+r)>>1;
build(lson);
build(rson);
}
void pushdown(int rt){
if(cover[rt]){
    cover[rt<<1]=cover[rt<<1|1]=cover[rt];
    cover[rt]=0;
}
}
int ql,qr,val;
void update(int l,int r,int rt){
if(ql<=l&&r<=qr){
   cover[rt]=val;
   return ;
}
pushdown(rt);
int m=(l+r)>>1;
if(ql<=m) update(lson);
if(qr> m) update(rson);
}
int vis[maxn+1];
int ans;

void query(int l,int r,int rt){
if(cover[rt]){
    if(!vis[cover[rt]]) {ans++;
    vis[cover[rt] ]=1;
    }
    return ;
}
if(l==r) return ;
int m=(l+r)>>1;
if(ql<=m) query(lson);
if(qr> m) query(rson);
}
struct Seg{
int x,y;
Seg(int xx=0,int yy=0):x(xx),y(yy){}
}seg[10001];
int a[maxn],kk=0,m;
int b[maxn];
int find(int value){
int p=lower_bound(a,a+m,value) - a;
return b[p];
}
int lim=50001;
int main()
{
    int T,Q;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&Q);
        //int x,y;
        kk=0;
        for(int i=1;i<=Q;i++){
            scanf("%d %d",&seg[i].x,&seg[i].y);
            a[kk++]=seg[i].x;
            a[kk++]=seg[i].y;
        }
        sort(a,a+kk);
        m=unique(a,a+kk) - a;
        int tt=1;
        for(int i=0;i<m;i++){
            b[i]=tt++;
            if(i&&a[i]>a[i-1]+1) b[i]=tt++;
        }
        build(1,lim,1);
        int temp=1;
        for(int i=1;i<=Q;i++){
            ql=find(seg[i].x);
            qr=find(seg[i].y);
            val=temp++;
            update(1,lim,1);
        }
        ans=0;
        memset(vis,0,sizeof(vis));
        ql=1; qr=lim;
        query(1,lim,1);
        printf("%d\n",ans);
    }
    return 0;
}



你可能感兴趣的:(C++,poj)