您的位置:首页 > 其它

bzoj 2648: SJY摆棋子

2016-03-21 23:29 344 查看
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define M 2000009
#define inf 1000000000
using namespace std;
struct A
{
int mx[2],mn[2],d[2],l,r;
}a[M],b;
int n,N,m,root,ans;
bool cmp(A a1,A a2)
{
return  a1.d
<a2.d
;
}
void updata(int k)
{
A l1=a[a[k].l],r1=a[a[k].r];
for(int i=0;i<2;i++)
{
if(a[k].l)
a[k].mn[i]=min(a[k].mn[i],l1.mn[i]),a[k].mx[i]=max(a[k].mx[i],l1.mx[i]);
if(a[k].r)
a[k].mx[i]=max(a[k].mx[i],r1.mx[i]),a[k].mn[i]=min(a[k].mn[i],r1.mn[i]);
}
return;
}
int jian(int l1,int r1,int now)
{
int mid=(l1+r1)>>1;
N=now;
nth_element(a+l1,a+mid,a+r1+1,cmp);
for(int i=0;i<2;i++)
a[mid].mn[i]=a[mid].mx[i]=a[mid].d[i];
if(l1<mid)
a[mid].l=jian(l1,mid-1,now^1);
else
a[mid].l=0;
if(r1>mid)
a[mid].r=jian(mid+1,r1,now^1);
else
a[mid].r=0;
updata(mid);
return mid;
}
void jia(int x,int now,A b)
{
if(b.d[now]<a[x].d[now])
{
if(a[x].l)
jia(a[x].l,now^1,b);
else
{
a[x].l=++n;
a
=b;
for(int i=0;i<2;i++)
a
.mn[i]=a
.mx[i]=a
.d[i];
}
}
else
{
if(a[x].r)
jia(a[x].r,now^1,b);
else
{
a[x].r=++n;
a
=b;
for(int i=0;i<2;i++)
a
.mn[i]=a
.mx[i]=a
.d[i];
}
}
updata(x);
return;
}
int get(int k,A p)
{
int tmp=0;
for(int i=0;i<2;i++)
tmp+=max(0,a[k].mn[i]-p.d[i]);
for(int i=0;i<2;i++)
tmp+=max(0,p.d[i]-a[k].mx[i]);
return tmp;
}
void xun(int x,A b)
{
int dl=inf,dr=inf;
ans=min(ans,abs(a[x].d[0]-b.d[0])+abs(a[x].d[1]-b.d[1]));
if(a[x].l)
dl=get(a[x].l,b);
if(a[x].r)
dr=get(a[x].r,b);
if(dl<dr)
{
if(dl<ans)
xun(a[x].l,b);
if(dr<ans)
xun(a[x].r,b);
}
else
{
if(dr<ans)
xun(a[x].r,b);
if(dl<ans)
xun(a[x].l,b);
}
return;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].d[0],&a[i].d[1]);
root=jian(1,n,0);
for(int i=1;i<=m;i++)
{
int a1,a2,a3;
scanf("%d%d%d",&a1,&a2,&a3);
A b;
b.d[0]=a2;
b.d[1]=a3;
b.l=b.r=0;
if(a1==1)
jia(root,0,b);
else
{
ans=inf;
xun(root,b);
printf("%d\n",ans);
}
}
return 0;
}


KDtree
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: