poj 2528 Mayor's posters 线段树
2014-08-26 20:19
411 查看
题目链接:poj 2528
有一面长度为1e7的墙,给你N张海报,给定他们张贴的起始位置,按给出的顺序张贴,问最后能看到多少张海报。看到一部分也算看到。
线段树基本题,可以去网上搜一下线段树的教程
有一面长度为1e7的墙,给你N张海报,给定他们张贴的起始位置,按给出的顺序张贴,问最后能看到多少张海报。看到一部分也算看到。
线段树基本题,可以去网上搜一下线段树的教程
/****************************************************** * File Name: 2528.cpp * Author: kojimai * Creater Time:2014年08月26日 星期二 18时18分11秒 ******************************************************/ #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<iostream> using namespace std; #define FFF 10005 struct nodes { int x,y; }p[FFF]; struct seg { int l,r,c; }node[FFF*10]; struct order { int x,num; }s[FFF*2]; bool cmp(order a,order b) { return a.x<b.x; } void buildtree(int l,int r,int num) { node[num].l=l; node[num].r=r; node[num].c=0; if(l==r) return; int mid=(l+r)/2; buildtree(l,mid,num*2); buildtree(mid+1,r,num*2+1); } void solve(int l,int r,int num,int c) { //cout<<"nodel="<<node[num].l<<" noder="<<node[num].r<<endl; if(node[num].l==l&&node[num].r==r) { node[num].c=c; //cout<<" l="<<l<<" r="<<r<<" c="<<node[num].c<<endl; return; } if(node[num].c>0&&node[num].r>node[num].l) { node[num*2].c=node[num].c; node[num*2+1].c=node[num].c; node[num].c=0; } //cout<<" l="<<l<<" r="<<r<<" c="<<node[num].c<<endl; if(node[num].l==node[num].r) return; int mid=(node[num].l+node[num].r)/2; if(mid>r) { solve(l,r,num*2,c); } else if(mid<l) { solve(l,r,num*2+1,c); } else { solve(l,mid,num*2,c); solve(mid+1,r,num*2+1,c); } return; } int ans; bool vis[FFF]; void search(int num) { if(node[num].c) { if(!vis[node[num].c]) { ans++; vis[node[num].c]=true; } return; } else { if(node[num].r>node[num].l) { search(num*2); search(num*2+1); } } return; } int main() { int keng; scanf("%d",&keng); while(keng--) { int n; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d",&p[i].x,&p[i].y); s[i*2].x=p[i].x; s[i*2].num=-i-1; s[i*2+1].x=p[i].y; s[i*2+1].num=i+1; } sort(s,s+n*2,cmp); int cnt=0,tmp=-1; for(int i=0;i<n*2;i++) { if(tmp!=s[i].x) { tmp=s[i].x; cnt++; } if(s[i].num<0) p[-s[i].num-1].x=cnt; else p[s[i].num-1].y=cnt; } buildtree(1,cnt,1); for(int i=0;i<n;i++) { solve(p[i].x,p[i].y,1,i+1); } ans=0; search(1); memset(vis,false,sizeof(vis)); cout<<ans<<endl; } return 0; }
相关文章推荐
- POJ 2528 Mayor's posters 离散化和线段树题解
- POJ --2528--Mayor's posters--离散线段树
- Poj 2528 Mayor's posters 线段树 离散化 成段更新
- 线段树2-Mayor's posters-POJ 2528
- 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 线段树 染色+离散化
- Mayor's posters----POJ_2528----线段树之成段更新and离散化
- 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 Mayor's posters 线段树
- poj 2528 Mayor's posters 【线段树 + 离散化】