BZOJ2648: SJY摆棋子(BZOJ2716)
2018-03-10 19:45
281 查看
KD-Tree
BZOJ2648BZOJ2716
先根据开始给你的黑棋子构造好二维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; }
相关文章推荐
- 【bzoj2648】SJY摆棋子 KD-tree
- BZOJ 2648: SJY摆棋子
- BZOJ 2648 SJY摆棋子
- 【bzoj2648】 SJY摆棋子
- BZOJ_2716_[Violet 3]天使玩偶&&BZOJ_2648_SJY摆棋子_KDTree
- bzoj 2648: SJY摆棋子
- bzoj2648 SJY摆棋子【KD-tree模板】
- BZOJ 2648: SJY摆棋子/BZOJ 2716: [Violet 3]天使玩偶 kdtree
- 【BZOJ】【2648】SJY摆棋子&【BZOJ】【2716】【Violet 3】天使玩偶
- bzoj2648 SJY摆棋子
- 【BZOJ 2716/2648】 [Violet 3]天使玩偶 SJY摆棋子
- [bzoj2648/2716]SJY摆棋子_KD-Tree
- bzoj2648 SJY摆棋子
- 【BZOJ2648】SJY摆棋子 KDtree
- Bzoj2648 SJY摆棋子
- bzoj 2648: SJY摆棋子(kd tree)
- bzoj2648 SJY摆棋子 k-d树
- BZOJ2648 SJY摆棋子
- BZOJ 2648 SJY摆棋子(KD-Tree)
- bzoj2648 SJY摆棋子