POJ2528 Mayor's posters线段树

来源:互联网 发布:linux 上传hdfs 编辑:程序博客网 时间:2024/06/14 07:25

用线段树解题。。。刚开始不知道要离散化这些点,只感觉开的数组太大了。。。Orz。。一开始运行就把电脑卡爆了!

后来再网上搜了一个,说是要离散化这些点。。。其实就是把原数据给映射到1——t。因为输入的数据组不多,而数字范围太大了。

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define INF 100000007int setv[100000],b[20010],n,vis[10001],ans;struct node{int no;int num;}a[20003];bool cmp(node &t,node &b){return t.num <b.num;}void pushdown(int rt,int l,int r){if(setv[rt]){setv[rt*2]=setv[rt*2+1]=setv[rt];setv[rt]=0;}}void update(int rt,int l,int r,int u,int v,int i){if(u<=l&&r<=v){setv[rt]=i;//懒惰标记。return;}pushdown(rt,l,r);int mid=(l+r)>>1;if(u<=mid)update(rt*2,l,mid,u,v,i);if(v>mid)update(rt*2+1,mid+1,r,u,v,i);}void query(int rt,int l,int r){int mid=(l+r)>>1;if(!setv[rt]){query(rt*2,l,mid);query(rt*2+1,mid+1,r);}else{if(!vis[setv[rt]]){vis[setv[rt]]=1;ans++;}}}int main(){int T;scanf("%d",&T);while(T--){memset(setv,0,sizeof(setv));scanf("%d",&n);memset(vis,0,sizeof(vis[0])*(n+1));int i,k=1,j;for(i=1;i<=n;i++){scanf("%d%d",&a[k].num,&a[k+1].num);a[k].no=k;k++;a[k].no=k;k++;}sort(a+1,a+k,cmp);int temp=-1,count=1;for(i=1;i<k;i++)if(temp!=a[i].num){b[a[i].no]=count++;temp=a[i].num;}else b[a[i].no]=count-1;j=1;for(i=1;i<=n;i++){update(1,1,count-1,b[j],b[j+1],i);j+=2;}ans=0;query(1,1,count-1);printf("%d\n",ans);}return 0;}


0 0
原创粉丝点击