bzoj2716 [Violet 3]天使玩偶(同bzoj2648)
2018-01-11 11:10
429 查看
bzoj2716 [Violet 3]天使玩偶(同bzoj2648)
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define ll long long #define inf 0x3f3f3f3f #define N 500010 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; } int n,m,D,ans,rt=0; struct point{ int d[2]; point(int x=0,int y=0){d[0]=x;d[1]=y;} int& operator[](int x){return d[x];} friend bool operator<(point a,point b){return a[D]<b[D];} friend int dis(point a,point b){return abs(a[0]-b[0])+abs(a[1]-b[1]);} }P ; struct node{ point x;int mx[2],mn[2],lc,rc; }tree[N<<1]; inline void update(int p){ int l=tree[p].lc,r=tree[p].rc; for(int i=0;i<2;++i){ if(l){ tree[p].mn[i]=min(tree[p].mn[i],tree[l].mn[i]); tree[p].mx[i]=max(tree[p].mx[i],tree[l].mx[i]); 11ff9 }if(r){ tree[p].mn[i]=min(tree[p].mn[i],tree[r].mn[i]); tree[p].mx[i]=max(tree[p].mx[i],tree[r].mx[i]); } } } inline void build(int &p,int l,int r,int op){ int mid=l+r>>1;p=mid;D=op; nth_element(P+l,P+mid,P+r+1);tree[p].x=P[mid]; for(int i=0;i<2;++i) tree[p].mx[i]=tree[p].mn[i]=tree[p].x[i]; if(l<mid) build(tree[p].lc,l,mid-1,op^1); if(r>mid) build(tree[p].rc,mid+1,r,op^1); update(p); } inline void ins(int &p,point x,int op){ if(!p){ p=++n;tree[p].x=x; for(int i=0;i<2;++i) tree[p].mn[i]=tree[p].mx[i]=tree[p].x[i];return; }if(x[op]<=tree[p].x[op]) ins(tree[p].lc,x,op^1); else ins(tree[p].rc,x,op^1);update(p); } inline int calcmn(int p,point x){ if(!p) return inf;int res=0; for(int i=0;i<2;++i){ if(x[i]<tree[p].mn[i]) res+=tree[p].mn[i]-x[i]; if(x[i]>tree[p].mx[i]) res+=x[i]-tree[p].mx[i]; }return res; } inline void query(int p,point x){ ans=min(ans,dis(tree[p].x,x)); int dl=calcmn(tree[p].lc,x),dr=calcmn(tree[p].rc,x); if(dl<dr){ if(dl<ans) query(tree[p].lc,x); if(dr<ans) query(tree[p].rc,x); }else{ if(dr<ans) query(tree[p].rc,x); if(dl<ans) query(tree[p].lc,x); } } int main(){ // freopen("a.in","r",stdin); n=read();m=read(); for(int i=1;i<=n;++i) for(int k=0;k<2;++k) P[i][k]=read(); build(rt,1,n,0); while(m--){ int op=read(),x=read(),y=read(); if(op==1) ins(rt,point(x,y),0); else{ ans=inf;query(rt,point(x,y)); printf("%d\n",ans); } }return 0; }
相关文章推荐
- BZOJ 2716: [Violet 3]天使玩偶 [CDQ分治]
- [BZOJ2716][Violet 3]天使玩偶 && kdtree
- [BZOJ2716][Violet 3]天使玩偶(cdq分治+bit)
- BZOJ 2716 Violet 3 天使玩偶 CDQ分治
- 【BZOJ】2648: SJY摆棋子 & 2716: [Violet 3]天使玩偶(kdtree)
- BZOJ2716:[Violet 3]天使玩偶——题解
- bzoj2716: [Violet 3]天使玩偶
- BZOJ.2716.[Violet3]天使玩偶(K-D Tree)
- BZOJ 2716 [Violet 3]天使玩偶
- BZOJ2716 [Violet 3]天使玩偶 【CDQ分治】
- 【bzoj 2716】[Violet 3]天使玩偶 (cdq分治+树状数组)
- BZOJ 2716: [Violet 3]天使玩偶
- BZOJ2716 [Violet]天使玩偶(cdq分治+树状数组)
- BZOJ 2648: SJY摆棋子/BZOJ 2716: [Violet 3]天使玩偶 kdtree
- 【Violet3】【BZOJ2716】天使玩偶
- BZOJ 2716 [Violet 3]天使玩偶 KDtree
- BZOJ 2716 [Violet 3]天使玩偶 ——KD-Tree
- [BZOJ2716][Violet 3]天使玩偶(cdq分治||KD-tree)
- bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree
- BZOJ 2716 Violet 3 天使玩偶 CDQ分治