zoukankan      html  css  js  c++  java
  • 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
    ",ans);
    131           }
    132       }
    133     return 0;
    134 }

    KDtree

  • 相关阅读:
    IT学习 程序员 学习网址收藏
    PHP地图上的点文字标注
    php 三种文件下载的实现
    10个免费的jQuery富文本编辑器
    Docker Swarm(四)Volume 数据(挂载)持久化
    Docker Swarm(三)Service(服务)分配策略
    Docker Swarm(二)常用命令
    Docker Swarm(一)集群部署
    Linux——Shell脚本参数传递的2种方法
    Linux——系统时间、开机时间
  • 原文地址:https://www.cnblogs.com/xydddd/p/5304342.html
Copyright © 2011-2022 走看看