bzoj 2648: SJY摆棋子
Posted xiyuedong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 2648: SJY摆棋子相关的知识,希望对你有一定的参考价值。
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstdlib> 6 #define M 2000009 7 #define inf 1000000000 8 using namespace std; 9 struct A 10 { 11 int mx[2],mn[2],d[2],l,r; 12 }a[M],b; 13 int n,N,m,root,ans; 14 bool cmp(A a1,A a2) 15 { 16 return a1.d[N]<a2.d[N]; 17 } 18 void updata(int k) 19 { 20 A l1=a[a[k].l],r1=a[a[k].r]; 21 for(int i=0;i<2;i++) 22 { 23 if(a[k].l) 24 a[k].mn[i]=min(a[k].mn[i],l1.mn[i]),a[k].mx[i]=max(a[k].mx[i],l1.mx[i]); 25 if(a[k].r) 26 a[k].mx[i]=max(a[k].mx[i],r1.mx[i]),a[k].mn[i]=min(a[k].mn[i],r1.mn[i]); 27 } 28 return; 29 } 30 int jian(int l1,int r1,int now) 31 { 32 int mid=(l1+r1)>>1; 33 N=now; 34 nth_element(a+l1,a+mid,a+r1+1,cmp); 35 for(int i=0;i<2;i++) 36 a[mid].mn[i]=a[mid].mx[i]=a[mid].d[i]; 37 if(l1<mid) 38 a[mid].l=jian(l1,mid-1,now^1); 39 else 40 a[mid].l=0; 41 if(r1>mid) 42 a[mid].r=jian(mid+1,r1,now^1); 43 else 44 a[mid].r=0; 45 updata(mid); 46 return mid; 47 } 48 void jia(int x,int now,A b) 49 { 50 if(b.d[now]<a[x].d[now]) 51 { 52 if(a[x].l) 53 jia(a[x].l,now^1,b); 54 else 55 { 56 a[x].l=++n; 57 a[n]=b; 58 for(int i=0;i<2;i++) 59 a[n].mn[i]=a[n].mx[i]=a[n].d[i]; 60 } 61 } 62 else 63 { 64 if(a[x].r) 65 jia(a[x].r,now^1,b); 66 else 67 { 68 a[x].r=++n; 69 a[n]=b; 70 for(int i=0;i<2;i++) 71 a[n].mn[i]=a[n].mx[i]=a[n].d[i]; 72 } 73 } 74 updata(x); 75 return; 76 } 77 int get(int k,A p) 78 { 79 int tmp=0; 80 for(int i=0;i<2;i++) 81 tmp+=max(0,a[k].mn[i]-p.d[i]); 82 for(int i=0;i<2;i++) 83 tmp+=max(0,p.d[i]-a[k].mx[i]); 84 return tmp; 85 } 86 void xun(int x,A b) 87 { 88 int dl=inf,dr=inf; 89 ans=min(ans,abs(a[x].d[0]-b.d[0])+abs(a[x].d[1]-b.d[1])); 90 if(a[x].l) 91 dl=get(a[x].l,b); 92 if(a[x].r) 93 dr=get(a[x].r,b); 94 if(dl<dr) 95 { 96 if(dl<ans) 97 xun(a[x].l,b); 98 if(dr<ans) 99 xun(a[x].r,b); 100 } 101 else 102 { 103 if(dr<ans) 104 xun(a[x].r,b); 105 if(dl<ans) 106 xun(a[x].l,b); 107 } 108 return; 109 } 110 int main() 111 { 112 scanf("%d%d",&n,&m); 113 for(int i=1;i<=n;i++) 114 scanf("%d%d",&a[i].d[0],&a[i].d[1]); 115 root=jian(1,n,0); 116 for(int i=1;i<=m;i++) 117 { 118 int a1,a2,a3; 119 scanf("%d%d%d",&a1,&a2,&a3); 120 A b; 121 b.d[0]=a2; 122 b.d[1]=a3; 123 b.l=b.r=0; 124 if(a1==1) 125 jia(root,0,b); 126 else 127 { 128 ans=inf; 129 xun(root,b); 130 printf("%d\n",ans); 131 } 132 } 133 return 0; 134 }
KDtree
以上是关于bzoj 2648: SJY摆棋子的主要内容,如果未能解决你的问题,请参考以下文章