您的位置:首页 > 其它

BZOJ2648: SJY摆棋子(BZOJ2716)

2018-03-10 19:45 281 查看

KD-Tree

BZOJ2648

BZOJ2716

先根据开始给你的黑棋子构造好二维KD-Tree,黑棋子插入,白棋子看成询问不插入

其实就是板子题

代码:

#include<cctype>
#include<cstdio>
#include<algorithm>
#define N 1000005
#define F inline
#define inf 0x7fffffff
using namespace std;
struct tree{ int d[2],mx[2],mn[2],to[2]; }t
;
int n,m,x,rt,ans;
F char readc(){
static char buf[100000],*l=buf,*r=buf;
if (l==r) r=(l=buf)+fread(buf,1,100000,stdin);
if (l==r) return EOF; return *l++;
}
F int _read(){
int x=0,f=1; char ch=readc();
while (!isdigit(ch)) { if (ch=='-') f=-1; ch=readc(); }
while (isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=readc();
return x*f;
}
F void writec(int x){ if (x>9) writec(x/10); putchar(x%10+48); }
F void _write(int x){ writec(x),putchar('\n'); }
F bool cmp(tree a,tree b){
return a.d[x]==b.d[x]?a.d[x^1]<b.d[x^1]:a.d[x]<b.d[x];
}
#define Max(a,b,f) (a[f]=max(a[f],b[f]))
#define Min(a,b,f) (a[f]=min(a[f],b[f]))
F void updt(tree &x){
for (int i=0;i<2;i++)
for (int j=0;j<2;j++)
if (x.to[j])
Max(x.mx,t[x.to[j]].mx,i),Min(x.mn,t[x.to[j]].mn,i);
}
int build(int l,int r,int d){
x=d; int m=l+r>>1; nth_element(t+l+1,t+m+1,t+r+1,cmp);
if (l<m) t[m].to[0]=build(l,m-1,d^1);
if (m<r) t[m].to[1]=build(m+1,r,d^1);
for (int i=0;i<2;i++) t[m].mx[i]=t[m].mn[i]=t[m].d[i];
return updt(t[m]),m;
}
void nsrt(int &x,int d){
if (!x) return (void)(x=n);
nsrt(t[x].to[t
.d[d]>=t[x].d[d]],d^1),updt(t[x]);
}
#define abs(x) ((x)<0?-(x):(x))
F int calc(int n,int x,int y){
x=max(t
.mn[0]-x,0)+max(x-t
.mx[0],0);
y=max(t
.mn[1]-y,0)+max(y-t
.mx[1],0);
return x+y;
}
void srch(int n,int x,int y){
int tmp=abs(t
.d[0]-x)+abs(t
.d[1]-y),d[2]={inf,inf};
for (int i=0;i<2;i++) if (t
.to[i]) d[i]=calc(t
.to[i],x,y);
ans=min(ans,tmp),tmp=(d[0]>=d[1]);
for (int i=2;i;tmp^=1,i--) if (d[tmp]<ans) srch(t
.to[tmp],x,y);
}
int main(){
n=_read(),m=_read();
for (int i=1;i<=n;i++) t[i].d[0]=_read(),t[i].d[1]=_read();
for (rt=build(1,n,0);m;m--){
int f=_read(),x=_read(),y=_read();
if (f==1){
n++,t
.d[0]=t
.mn[0]=t
.mx[0]=x;
t
.d[1]=t
.mn[1]=t
.mx[1]=y,nsrt(rt,0);
}
else ans=inf,srch(rt,x,y),_write(ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: