线段树典型例题--poj2528
2012-07-23 17:09
225 查看
此题的关键在于离散化。
对于线段(a,b),要将a-1,a,b三个量都考虑进去。
否则我们看这样一个例子:
答案是3
如果不考虑a-1,则答案会变成2。
【代码】
对于线段(a,b),要将a-1,a,b三个量都考虑进去。
否则我们看这样一个例子:
3 1 10 1 3 6 10
答案是3
如果不考虑a-1,则答案会变成2。
【代码】
#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <algorithm> using namespace std; const int N=10005; int a ,b ,col[N*10],g[N*3]; bool v ,pp[N*10]; int ans,tot,n,cc; void down(int i) { if (!pp[i]) return; col[i*2]=col[i*2+1]=col[i]; pp[i*2]=pp[i*2+1]=true; pp[i]=false; } void ins(int i,int l,int r,int x,int y,int c) { if (x<=l && y>=r) { col[i]=c; pp[i]=true; return; } down(i); int mid=(l+r)>>1; if (x<=mid) ins(i*2,l,mid,x,y,c); if (y>mid) ins(i*2+1,mid+1,r,x,y,c); if (col[i*2]!=col[i*2+1] || col[i*2]==-1 || col[i*2+1]==-1) col[i]=-1; } int get(int i,int l,int r,int x) { if (col[i]!=-1) return col[i]; down(i); int mid=(l+r)>>1; if (x<=mid) return get(i*2,l,mid,x); else return get(i*2+1,mid+1,r,x); } int main() { int i; freopen("in","r",stdin); scanf("%d",&cc); while (cc--) { memset(col,0,sizeof(col)); memset(pp,0,sizeof(pp)); memset(v,0,sizeof(v)); tot=ans=0; scanf("%d",&n); for (i=1;i<=n;i++) { scanf("%d%d",&a[i],&b[i]); g[tot++]=a[i]; g[tot++]=b[i]; if (a[i]>1) g[tot++]=a[i]-1; } sort(g,g+tot); tot=unique(g,g+tot)-g; for (i=1;i<=n;i++) { a[i]=lower_bound(g,g+tot,a[i])-g+1; b[i]=lower_bound(g,g+tot,b[i])-g+1; ins(1,1,tot,a[i],b[i],i); } for (i=1;i<=tot;i++) v[get(1,1,tot,i)]=true; for (i=1;i<=n;i++) ans+=v[i]; printf("%d\n",ans); } }
相关文章推荐
- 线段树典型例题--poj2482
- 线段树典型例题--poj2828
- 线段树-基础,典型例题的完整代码
- 线段树典型例题--poj3277
- 线段树典型例题--poj3667 hotel
- 线段树典型例题--poj2777
- 动态规划典型例题
- 递归与调用栈工作原理-典型递归例题实现
- POJ2528 Mayor's posters(线段树+离散化+染色)
- poj2528 Mayor’s posters(线段树+离散化)
- 线段树进阶学习(例题)--树状数组学习+离散化+成端更新+区间合并+扫描线
- poj2528 Mayor's posters(线段树的离散化)
- 大端、小端存储以及典型例题分析
- C#基础入门典型例题(1)
- 蓝桥杯C语言培训3 典型问题的递归框架 例题1 排列枚举
- POJ2528 Mayor's posters (线段树+离散化)
- 1 0 背包问题 典型的 例题 : Bone Collector
- 【典型例题】创建文件夹;
- 尼姆博弈的典型例题
- 什么是动态规划?动态规划典型例题求解+代码