bzoj 2648
2016-04-04 22:45
302 查看
kd_tree;
目前仍理解不足…
目前仍理解不足…
#include<bits/stdc++.h> #define rep(i,k,n) for(int i=k;i<=n;i++) using namespace std; const int N=500005; const int inf=0x7f7f7f7f; struct P{ int d[2],mn[2],mx[2],l,r; int& operator[](int x){return d[x];} P(int x=0,int y=0) {l=0,r=0;d[0]=x,d[1]=y;} }p ; int n,m,root=0,D; bool operator<(P a,P b){return a[D]<b[D];} struct kd_tree{ P t[2*N],T; int ans; void up(int x){ P l=t[t[x].l],r=t[t[x].r]; if(t[x].l)rep(i,0,1)t[x].mn[i]=min(t[x].mn[i],l.mn[i]),t[x].mx[i]=max(t[x].mx[i],l.mx[i]); if(t[x].r)rep(i,0,1)t[x].mn[i]=min(t[x].mn[i],r.mn[i]),t[x].mx[i]=max(t[x].mx[i],r.mx[i]); } void build(int& x,int l,int r,int now){ if(l>r)return; D=now; int mid=(l+r)>>1; nth_element(p+l,p+mid,p+r+1); x=mid; t[x]=p[mid]; t[x].mn[0]=t[x].mx[0]=t[x][0]; t[x].mn[1]=t[x].mx[1]=t[x][1]; build(t[x].l,l,mid-1,now^1); build(t[x].r,mid+1,r,now^1); up(x); } inline int dis(P a,P b){return abs(a[0]-b[0])+abs(a[1]-b[1]);} int get(int k,P x){ int tmp=0; rep(i,0,1)tmp+=max(0,t[k].mn[i]-x[i]); rep(i,0,1)tmp+=max(0,x[i]-t[k].mx[i]); return tmp; } void ins(int x,int now){ if(T[now]<t[x][now]){ if(t[x].l)ins(t[x].l,now^1); else{ t[x].l=++n;t =T; rep(i,0,1)t .mn[i]=t .mx[i]=t [i]; } } else{ if(t[x].r)ins(t[x].r,now^1); else{ t[x].r=++n;t =T; rep(i,0,1)t .mn[i]=t .mx[i]=t [i]; } } up(x); } void que(int x){ int d,d1=inf,d2=inf; d=dis(t[x],T); ans=min(ans,d); if(t[x].l)d1=get(t[x].l,T); if(t[x].r)d2=get(t[x].r,T); if(d1<d2){ if(d1<ans)que(t[x].l); if(d2<ans)que(t[x].r); } else{ if(d2<ans)que(t[x].r); if(d1<ans)que(t[x].l); } } void insert(P x){ T=x;ins(root,0); } int query(P x){ ans=inf;T=x;que(root); return ans; } }kd; int main(){//freopen("in.in","r",stdin); scanf("%d%d",&n,&m); rep(i,1,n){scanf("%d%d",&p[i][0],&p[i][1]);} kd.build(root,1,n,0); int op,x,y; while(m--) { scanf("%d%d%d",&op,&x,&y); if(op==1)kd.insert(P(x,y)); else printf("%d\n",kd.query(P(x,y))); } return 0; }
相关文章推荐
- 给easyui tree树加图标
- Glide之后台线程加载及缓存资源
- 《MySQL必知必会学习笔记》:插入数据
- Discontinuous Galerkin method for steady transport problem
- 两个Activity之间的观察者模式
- 2016.4.4HTML表格,列表,块,布局
- cocospod 搭建环境和使用
- 分析Linux内核启动过程:从start_kernel到init
- Gson解析数据使用笔记
- bzoj 1812 river
- Alphabet 和 Facebook的Stratospheric Internet纠结于繁文缛节
- Android消息处理机制
- grafana图形化数据展示软件介绍
- Socket使用大全
- MQTT协议学习笔记
- shiro整合redis做缓存
- storm安装
- strcpy 字符串拷贝函数解析
- 二叉树遍历
- SignalR技术