您的位置:首页 > 其它

poj 2528 Mayor's posters

2011-12-03 09:51 369 查看
这题纠结了我两天,终于AC了,在网上说有个bug,

普通的离散化会下面这组数据会过不了

1 10

1 4

6 10

普通的离散化结果是2。

但是真正的答案是3。

这是我的代码,要离散的是边界的编号,而不是区间的编号!

#include<stdio.h>
#include<algorithm>
using namespace std;
const int Max=20005;
int ans,m,n;
int pos[Max];
bool visit[Max];
struct node
{
int r,l,flag;
}tree[Max*4];
struct lnode
{
int l,r;
}s[Max];
void build(int step,int l,int r)
{
tree[step].l=l;
tree[step].r=r;
tree[step].flag=-1;
if(l+1==r)
{
return ;
}
int mid=(l+r)>>1;
build(step<<1,l,mid);
build((step<<1)|1,mid,r);
}
void insert(int step,int l,int r,int x)
{
if(tree[step].l==l&&tree[step].r==r)
{
tree[step].flag=x;
return ;
}
if(tree[step].flag!=-1)
{
tree[step<<1].flag=tree[step].flag;
tree[(step<<1)|1].flag=tree[step].flag;
tree[step].flag=-1;
}
int mid=(tree[step].l+tree[step].r)>>1;
if(r<=mid)
{
insert(step<<1,l,r,x);
}
else
{
if(mid<=l)
{
insert(step<<1|1,l,r,x);
}
else
{
insert(step<<1,l,mid,x);
insert((step<<1)|1,mid,r,x);
}
}
}
void compute(int step)
{
if(tree[step].flag!=-1)
{
if(visit[tree[step].flag])
{
ans++;
visit[tree[step].flag]=false;
}
return ;
}
if(tree[step].l+1==tree[step].r)
return ;
compute(step<<1);
compute((step<<1)|1);
}
int search(int x)
{
int low=0,high=m,mid;
while(low<=high)
{
mid=(low+high)>>1;
if(pos[mid]==x)
return mid;
else if(pos[mid]>x)

high=mid-1;
else
low=mid+1;
}
return -1;
}
int main()
{
int t,i,n,x,y,a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
b++;
s[i].l=a;
s[i].r=b;
pos[i<<1]=a;
pos[(i<<1)|1]=b;
}
sort(pos,pos+n*2);
m=ans=0;
for(i=1;i<2*n;i++)
{
if(pos[m]!=pos[i])
{
pos[++m]=pos[i];
}
}
build(1,0,m);
for(i=0;i<n;i++)
{
x=search(s[i].l);
y=search(s[i].r);
insert(1,x,y,i);
}
memset(visit,true,sizeof(visit));
compute(1);
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: