bzoj 2648: SJY摆棋子
2016-03-21 23:29
344 查看
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<cstdlib> #define M 2000009 #define inf 1000000000 using namespace std; struct A { int mx[2],mn[2],d[2],l,r; }a[M],b; int n,N,m,root,ans; bool cmp(A a1,A a2) { return a1.d <a2.d ; } void updata(int k) { A l1=a[a[k].l],r1=a[a[k].r]; for(int i=0;i<2;i++) { if(a[k].l) a[k].mn[i]=min(a[k].mn[i],l1.mn[i]),a[k].mx[i]=max(a[k].mx[i],l1.mx[i]); if(a[k].r) a[k].mx[i]=max(a[k].mx[i],r1.mx[i]),a[k].mn[i]=min(a[k].mn[i],r1.mn[i]); } return; } int jian(int l1,int r1,int now) { int mid=(l1+r1)>>1; N=now; nth_element(a+l1,a+mid,a+r1+1,cmp); for(int i=0;i<2;i++) a[mid].mn[i]=a[mid].mx[i]=a[mid].d[i]; if(l1<mid) a[mid].l=jian(l1,mid-1,now^1); else a[mid].l=0; if(r1>mid) a[mid].r=jian(mid+1,r1,now^1); else a[mid].r=0; updata(mid); return mid; } void jia(int x,int now,A b) { if(b.d[now]<a[x].d[now]) { if(a[x].l) jia(a[x].l,now^1,b); else { a[x].l=++n; a =b; for(int i=0;i<2;i++) a .mn[i]=a .mx[i]=a .d[i]; } } else { if(a[x].r) jia(a[x].r,now^1,b); else { a[x].r=++n; a =b; for(int i=0;i<2;i++) a .mn[i]=a .mx[i]=a .d[i]; } } updata(x); return; } int get(int k,A p) { int tmp=0; for(int i=0;i<2;i++) tmp+=max(0,a[k].mn[i]-p.d[i]); for(int i=0;i<2;i++) tmp+=max(0,p.d[i]-a[k].mx[i]); return tmp; } void xun(int x,A b) { int dl=inf,dr=inf; ans=min(ans,abs(a[x].d[0]-b.d[0])+abs(a[x].d[1]-b.d[1])); if(a[x].l) dl=get(a[x].l,b); if(a[x].r) dr=get(a[x].r,b); if(dl<dr) { if(dl<ans) xun(a[x].l,b); if(dr<ans) xun(a[x].r,b); } else { if(dr<ans) xun(a[x].r,b); if(dl<ans) xun(a[x].l,b); } return; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d%d",&a[i].d[0],&a[i].d[1]); root=jian(1,n,0); for(int i=1;i<=m;i++) { int a1,a2,a3; scanf("%d%d%d",&a1,&a2,&a3); A b; b.d[0]=a2; b.d[1]=a3; b.l=b.r=0; if(a1==1) jia(root,0,b); else { ans=inf; xun(root,b); printf("%d\n",ans); } } return 0; }
KDtree
相关文章推荐
- 【Django】 gunicorn部署纪要
- 【Django】 gunicorn部署纪要
- undefined与null的区别
- mkimage工具 加载地址和入口地址 内核启动分析
- 代码复审
- 【LeetCode题意分析&解答】43. Multiply Strings
- 编辑mac系统环境变量后保存,提示没有权限用到下面这个命令
- bzoj 2561: 最小生成树
- erlang趣事之guard
- Android面试题整理
- Linux的Makefile和Make
- HTML5之video元素
- PS转换图片——我教你
- php 面向对象上课笔记
- MyBatis
- requests的使用
- android一连串图片组成动画
- java——基础02
- window下安装redis
- 一个ActionResult中定位到两个视图—<团委项目>