您的位置:首页 > 其它

BZOJ 2716 [Violet 3]天使玩偶

2016-04-01 15:16 501 查看
同上题。Kd树模板。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 600500
#define inf 1000000007
using namespace std;
struct kd_point
{
int d[3],mx[3],mi[3];
int l,r;
}t[maxn<<1];
struct point
{
int num[3];
}p[maxn],regis;
int n,m,root,D,type,ans=inf,x,y;
bool cmp(point x,point y)
{
return x.num[D]<y.num[D];
}
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void update(int now)
{
int ls=t[now].l,rs=t[now].r;
for (int i=0;i<=1;i++)
{
if (ls) t[now].mi[i]=min(t[now].mi[i],t[ls].mi[i]);
if (ls) t[now].mx[i]=max(t[now].mx[i],t[ls].mx[i]);
if (rs) t[now].mi[i]=min(t[now].mi[i],t[rs].mi[i]);
if (rs) t[now].mx[i]=max(t[now].mx[i],t[rs].mx[i]);
}
}
int build(int left,int right,int split)
{
D=split;int mid=(left+right)>>1;
nth_element(p+left,p+mid,p+right+1,cmp);
for (int i=0;i<=1;i++)
{
t[mid].mx[i]=p[mid].num[i];
t[mid].mi[i]=p[mid].num[i];
t[mid].d[i]=p[mid].num[i];
}
if (left<mid) t[mid].l=build(left,mid-1,split^1);
if (mid<right) t[mid].r=build(mid+1,right,split^1);
update(mid);
return mid;
}
void insert(int now,int split)
{
if (regis.num[split]>=t[now].d[split])
{
if (t[now].r) insert(t[now].r,split^1);
else
{
t[now].r=++n;
for (int i=0;i<=1;i++)
{
t
.mx[i]=regis.num[i];
t
.mi[i]=regis.num[i];
t
.d[i]=regis.num[i];
}
}
}
else
{
if (t[now].l) insert(t[now].l,split^1);
else
{
t[now].l=++n;
for (int i=0;i<=1;i++)
{
t
.mx[i]=regis.num[i];
t
.mi[i]=regis.num[i];
t
.d[i]=regis.num[i];
}
}
}
update(now);
}
int getdis(int now)
{
int ret=0;
for (int i=0;i<=1;i++)
ret+=max(0,t[now].mi[i]-regis.num[i]);
for (int i=0;i<=1;i++)
ret+=max(0,regis.num[i]-t[now].mx[i]);
return ret;
}
void ask(int now,int split)
{
int d0,dl,dr;
d0=abs(t[now].d[0]-regis.num[0])+abs(t[now].d[1]-regis.num[1]);
ans=min(ans,d0);
if (t[now].l) dl=getdis(t[now].l);else dl=inf;
if (t[now].r) dr=getdis(t[now].r);else dr=inf;
if (dl<dr)
{
if (dl<ans) ask(t[now].l,split^1);
if (dr<ans) ask(t[now].r,split^1);
}
else
{
if (dr<ans) ask(t[now].r,split^1);
if (dl<ans) ask(t[now].l,split^1);
}
}
int main()
{
n=read();m=read();
for (int i=1;i<=n;i++)
{
x=read();y=read();
p[i].num[0]=x;p[i].num[1]=y;
}
root=build(1,n,0);
for (int i=1;i<=m;i++)
{
type=read();x=read();y=read();
regis.num[0]=x;regis.num[1]=y;
if (type==1) insert(root,0);
else
{
ans=inf;
ask(root,0);
printf("%d\n",ans);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: