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摆棋子的主要内容,如果未能解决你的问题,请参考以下文章

bzoj2648 SJY摆棋子

bzoj 2648 SJY摆棋子——KDtree

BZOJ2648 SJY摆棋子

Bzoj2648 SJY摆棋子

BZOJ 2648: SJY摆棋子

bzoj 2648: SJY摆棋子