码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 2966 In case of failure kdtree模板题

时间:2017-06-08 23:49:02      阅读:372      评论:0      收藏:0      [点我收藏+]

标签:点距   deb   pair   hellip   set   else   travel   ret   nod   

问求每个点距离平方的最小的点

kd-tree模板题……

 

  1 #include<bits/stdc++.h>
  2 #define cl(a,b) memset(a,b,sizeof(a))
  3 #define debug(x) cerr<<#x<<"=="<<(x)<<endl
  4 using namespace std;
  5 typedef long long ll;
  6 typedef pair<int,int> pii;
  7 
  8 #define inf (1e9+20)
  9 #define ll long long
 10 #define ls ch[x][0]
 11 #define rs ch[x][1]
 12 
 13 const int maxn = 2e5+10;
 14 
 15 struct P
 16 {
 17     int a[2] , num;
 18     ll dis;
 19 } p[maxn];
 20 
 21 int now , k = 2;
 22 
 23 bool cmp(int a,int b)
 24 {
 25     return p[a].a[now] < p[b].a[now];
 26 }
 27 
 28 ll dist(P a,P b)
 29 {
 30     ll sum = 0;
 31     for(int i=0; i<k; i++)
 32     {
 33         sum += 1ll*(a.a[i]-b.a[i])*(a.a[i]-b.a[i]);
 34     }
 35     return sum;
 36 }
 37 
 38 int ch[maxn][2] , co[maxn] , root;
 39 
 40 void pushup(int x)
 41 {
 42     co[x] = co[ls] + co[rs] + 1;
 43 }
 44 
 45 const double alp = 0.75;
 46 
 47 bool isbad(int x)
 48 {
 49     return max(co[ls],co[rs]) > alp*co[x] + 5;
 50 }
 51 
 52 void build(int &x,int l,int r,int a[],int no)
 53 {
 54     if( l > r )
 55     {
 56         x = 0;
 57         return ;
 58     }
 59     int mid = l+r>>1;
 60     now = no;
 61     nth_element(a+l,a+mid,a+r+1,cmp);
 62     x = a[mid];
 63     build(ls,l,mid-1,a,no^1);
 64     build(rs,mid+1,r,a,no^1);
 65     pushup(x);
 66 }
 67 
 68 P ans;
 69 
 70 void Find(int x,int y,int no)
 71 {
 72     if(!x) return ;
 73     ll dis = dist(p[y],p[x]);
 74     if( x != y )
 75     {
 76         if( dis < ans.dis || (dis==ans.dis&&p[x].num < ans.num) )
 77         {
 78             ans = p[x];
 79             ans.dis = dis;
 80         }
 81     }
 82     ll d = p[y].a[no] - p[x].a[no];
 83     Find(ch[x][d>0],y,no^1);
 84     if( d*d <= ans.dis )
 85     {//找平方
 86         Find(ch[x][d<=0],y,no^1);
 87     }
 88 }
 89 
 90 int Fa , No;
 91 
 92 int Insert(int &x,int fa,int k,int no)
 93 {
 94     if( x == 0 )
 95     {
 96         x = k;
 97         return 0;
 98     }
 99     int t = p[x].a[no]<p[k].a[no];
100     int r = Insert(ch[x][t],x,k,no^1);
101     pushup(x);
102     if( isbad(x) ) r = x , Fa = fa , No = no;
103     return r;
104 }
105 
106 int su[maxn] , len;
107 
108 void travel(int x)
109 {
110     if(x==0) return ;
111     travel(ls);
112     su[len++] = x;
113     travel(rs);
114 }
115 
116 void Insert(int k)
117 {
118     int x = Insert(root,0,k,0);
119     if(x)
120     {
121         int tmp = x;
122         len = 0;
123         travel(x);
124         build(x,0,len-1,su,No);
125         if(Fa) ch[Fa][ch[Fa][1]==tmp] = x;
126         else root = x;
127     }
128 }
129 
130 int si;
131 
132 void newnode(int x,int y,int id)
133 {
134     si++;
135     p[si].a[0] = x;
136     p[si].a[1] = y;
137     p[si].num = id;
138     ch[si][0] = ch[si][1] = 0;
139     co[si] = 1;
140 }
141 
142 void init()
143 {
144     si = 0;
145     ch[0][0] = ch[0][1] = 0;
146     co[0] = 0;
147     root = 0;
148 }
149 
150 int num[maxn];
151 
152 int main()
153 {
154 //    freopen("in.txt","r",stdin);
155     int T,n;
156     scanf("%d",&T);
157     while(T--)
158     {
159         scanf("%d",&n);
160         init();
161         int x,y;
162         for(int i=1; i<=n; i++)
163         {
164             scanf("%d%d",&x,&y);
165             newnode(x,y,i);
166             Insert(si);
167         }
168         for(int i=1; i<=n; i++)
169         {
170             ans.dis = 4e18;
171             Find(root,i,0);
172             printf("%lld\n",ans.dis);
173         }
174     }
175     return 0;
176 }/*
177 
178 2
179 10
180 17 41
181 0 34
182 24 19
183 8 28
184 14 12
185 45 5
186 27 31
187 41 11
188 42 45
189 36 27
190 15
191 0 0
192 1 2
193 2 3
194 3 2
195 4 0
196 8 4
197 7 4
198 6 3
199 6 1
200 8 0
201 11 0
202 12 2
203 13 1
204 14 2
205 15 0
206 
207 */

 

hdu 2966 In case of failure kdtree模板题

标签:点距   deb   pair   hellip   set   else   travel   ret   nod   

原文地址:http://www.cnblogs.com/general10/p/6965157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!