线段树(需离散化)之poj-2528

来源:互联网 发布:sql delete相同数据 编辑:程序博客网 时间:2024/05/12 10:33
#include <iostream>#include <cstdio>#include <cstring>#include <map>#include <cmath>#include <algorithm>using namespace std;#define lz 2*u,l,mid#define rz 2*u+1,mid+1,rconst int maxn=20005;int flag[4*maxn];int A[maxn], B[2*maxn];int visit[2*maxn];int ans=0;struct node{    int l, r;} f[maxn];void build(int u, int l, int r){    flag[u]=0;    if(l==r)  return ;    int mid=(l+r)>>1;    build(2*u,l,mid);    build(2*u+1,mid+1,r);}void Update(int u, int l, int r, int tl, int tr, int c){    if(flag[u]) return ;  //此段已经贴满了海报,不必再查询下去了    if(tl<=l&&r<=tr)//如果张贴的海报左右端点的区间,大于树的区间    {        flag[u]=1;  //标记该段区间已经被覆盖过了        if(!visit[c])        {            ans++;            visit[c]=1;        }        return ;    }    int mid=(l+r)>>1;    if(tr<=mid) Update(lz,tl,tr,c);    else if(tl>mid) Update(rz,tl,tr,c);    else    {        Update(lz,tl,mid,c);        Update(rz,mid+1,tr,c);    }    if(flag[2*u]&&flag[2*u+1]) flag[u]=1; ///!!标记上传}int getid(int x, int n){    int l=1, r=n, mid;    while(l<=r)    {        mid=(l+r)>>1;        if(B[mid]==x) return mid;        else if(B[mid]<x) l=mid+1;        else r=mid-1;    }}int main(){    int T, n;    cin >> T;    while(T--)    {        cin >> n;        memset(visit,0,sizeof(visit));        int num=0;        for(int i=0; i<n; i++)//将端点保存在A数组中        {            scanf("%d%d",&f[i].l,&f[i].r);            A[++num]=f[i].l;            A[++num]=f[i].r;        }        sort(A+1,A+num+1);//对A数组排序        int ep=1;        B[1]=A[1];        for(int i=2; i<=num; i++)  //把A中重复的去掉,通过数组下标与数组的值建立映射            if(B[ep]!=A[i]) B[++ep]=A[i];        for(int i=ep; i>1; i--)//如果相邻数字间距大于1的话,在其中加上任意一个数字            if(B[i]!=B[i-1]+1) B[++ep]=B[i-1]+1;        sort(B+1,B+ep+1);//排序        build(1,1,ep);        ans=0;        for(int i=n-1; i>=0; i--)        {            int l=getid(f[i].l,ep);//通过值映射到下标            int r=getid(f[i].r,ep);            Update(1,1,ep,l,r,i+1);        }        printf("%d\n",ans);    }    return 0;}

转载注明出处:http://www.cnblogs.com/kane0526/archive/2013/03/11/2952952.html
原创粉丝点击