您的位置:首页 > 其它

poj 2528 Mayor's posters

2013-08-02 15:53 309 查看
l链接;点击打开链接

给一墙贴海报,求的是最后还可以看见好多张海报。。。

由于数据很大,我们要用到离散化,区间覆盖,跟涂颜色差不多,就是求墙上还可以看到多少种颜色。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 20100
struct node1{
int x;
int y;
}a[N*2];
struct node2{
int l;
int r;
int num;
}anode[4*N];
int vis
,map
[2],ans;
int cmp(node1 a,node1 b){
return a.x<b.x;
}
void bulid(int l,int r,int n){
int mid;
mid=(l+r)>>1;
anode
.l=l;
anode
.r=r;
anode
.num=0;
if(l==r)
return;
bulid(l,mid,2*n);
bulid(mid+1,r,2*n+1);
}
void insert(int l,int r,int n,int c){
int mid;
mid=(anode
.l+anode
.r)>>1;
if(anode
.l==l&&anode
.r==r){
anode
.num=c;
return;
}
if(anode
.num>0){
anode[2*n].num=anode
.num;
anode[2*n+1].num=anode
.num;
anode
.num=0;
}
if(r<=mid)
insert(l,r,2*n,c);
else if(l>mid)
insert(l,r,2*n+1,c);
else{
insert(l,mid,2*n,c);
insert(mid+1,r,2*n+1,c);
}
}
void query(int n){
if(anode
.num!=0){
if(!vis[anode
.num]){
ans++;
vis[anode
.num]=1;
}
return;
}
query(2*n);
query(2*n+1);
return;
}
int main(){
int i,c,n,count,temp;
scanf("%d",&c);
while(c--){
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d %d",&map[i][0],&map[i][1]);
a[2*i].x=map[i][0];
a[2*i].y=-(i+1);
a[2*i+1].x=map[i][1];
a[2*i+1].y=i+1;
}
sort(a,a+2*n,cmp);
temp=a[0].x;
count=1;
for(i=0;i<2*n;i++){
if(temp!=a[i].x){
count++;
temp=a[i].x;
}
if(a[i].y<0)
map[-a[i].y-1][0]=count;
else
map[a[i].y-1][1]=count;
}
bulid(1,count,1);
for(i=0;i<n;i++)
insert(map[i][0],map[i][1],1,i+1);
memset(vis,0,sizeof(vis));
ans=0;
query(1);
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: