线段树(需离散化)之poj-2528
2013-06-07 18:01
260 查看
#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,r const 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
相关文章推荐
- POJ 2528 Mayor's posters(线段树+离散化)
- POJ - 2528 Mayor's posters (线段树离散化+区间更新)
- poj(2528)——Mayor's posters(线段树+离散化)
- POJ 2528 Mayor's posters (线段树,染色问题,离散化要注意)
- poj 2528 Mayor's posters(线段树+离散化)
- 【线段树 + 离散化 + 详细注释】北大 poj 2528 Mayor's posters
- POJ 2528 Mayor's posters 区间离散化线段树
- poj 2528 离散化+线段树 hdu 1698 线段树 线段树题目类型一:染色计数 外加离散化
- POJ 2528 Mayor's posters(离散化+线段树)
- poj 2528 Mayor's posters (线段树+离散化+hash)
- poj-----(2528)Mayor's posters(线段树区间更新及区间统计+离散化)
- poj 2528 Mayor's posters(线段树+离散化)
- poj 2528 特殊离散化+线段树
- 【POJ - 2528】Mayor's posters 【离散化+线段树 】
- POJ 2528 Mayor's posters(线段树染色+离散化)
- POJ 2528 线段树成段更新,数据离散化
- POJ 2528 【线段树--离散化,区间覆盖】
- POJ 2528 Mayor's posters (离散化和线段树使用)
- POJ 2528 Mayor's posters(线段树:区间set,整体查询+离散化)
- POJ 2528 Mayor's Poster(还是线段树,外加离散化)