线段树(需离散化)之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
- 线段树(需离散化)之poj-2528
- POJ 2528 (线段树 离散化)
- poj-2528(线段树+离散化)
- poj 2528 (线段树+离散化)
- poj 2528 线段树+离散化
- POJ 2528 (线段树+离散化)
- poj 2528 (线段树+离散化)
- poj~2528~离散化线段树
- POJ 2528 线段树+离散化
- Poj 2528 线段树+离散化
- 线段树 poj 2528 离散化处理
- poj 2528 线段树 离散化
- POJ 2528 离散化+线段树染色
- poj 2528 坐标离散化+线段树
- POJ 2528 线段树+离散化
- POJ 2528 QAQ线段树+离散化
- poj 2528--经典线段树+离散化
- poj 2528 离散化+线段树
- MySql修改数据库编码为UTF8
- http://kms.lenovots.com/kb/index.php
- java数组的一点总结
- WINREG.H 编译出错
- Android socket 编程
- 线段树(需离散化)之poj-2528
- Sum Root to Leaf Numbers
- rpm 命令详解
- 高质量C++编程_第9章_类的构造函数、析构函数与赋值函数
- VB中产生10个不重复的随机数
- JBoss AS Administrative Console Password Disclosure
- maven 简单实用教程
- oracle RAC常用操作-----转自Dave(纯属粘贴-----主要为了分享资源)
- Socket网络编程常用函数