bzoj1941: [Sdoi2010]Hide and Seek KD-tree
来源:互联网 发布:chmod linux 编辑:程序博客网 时间:2024/05/21 13:23
裸地kd-tree,所谓kd-tree就是暴力优化,把二维或多维德空间分块,然而树的形态可能会随着加点而退化,这时我们重建一下kd-tree就可以了。
#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <cmath>using namespace std;#define ll long long#define maxn 600000#define inf 2100000000int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}int x[maxn],y[maxn];int D,n,m,rt;struct node{ int d[2],mx[2],mn[2],l,r; friend bool operator < (node aa,node bb) { return aa.d[D]<bb.d[D]; }}p[maxn];int dis(node a,node b){ return abs(a.d[1]-b.d[1])+abs(a.d[0]-b.d[0]);}struct tree{ node t[maxn],T; int ans; void update(int k){ int l=t[k].l,r=t[k].r; for(int i=0;i<2;i++) { t[k].mn[i]=t[k].mx[i]=t[k].d[i]; if(l)t[k].mn[i]=min(t[k].mn[i],t[l].mn[i]); if(r)t[k].mn[i]=min(t[k].mn[i],t[r].mn[i]); if(l)t[k].mx[i]=max(t[k].mx[i],t[l].mx[i]); if(r)t[k].mx[i]=max(t[k].mx[i],t[r].mx[i]); } } int build(int l,int r,int now){ D=now; int mid=(l+r)>>1; nth_element(p+l,p+mid,p+r+1); t[mid]=p[mid]; for(int i=0;i<2;i++) t[mid].mn[i]=t[mid].mx[i]=t[mid].d[i]; if(l<mid)t[mid].l=build(l,mid-1,now^1); if(r>mid)t[mid].r=build(mid+1,r,now^1); update(mid); return mid; } int getmn(node a){ int ans=0; for(int i=0;i<2;i++) { ans+=max(T.d[i]-a.mx[i],0); ans+=max(a.mn[i]-T.d[i],0); } return ans; } int getmx(node a){ int ans=0; for(int i=0;i<2;i++) ans+=max(abs(T.d[i]-a.mx[i]),abs(T.d[i]-a.mn[i])); return ans; } void querymx(int x) { int l=t[x].l; int r=t[x].r; int tmp=dis(t[x],T); ans=max(ans,tmp); int ansl=-inf,ansr=-inf; if(l) ansl=getmx(t[l]); if(r) ansr=getmx(t[r]); if(ansl>ansr) { if(ansl>ans) querymx(l); if(ansr>ans) querymx(r); } else { if(ansr>ans) querymx(r); if(ansl>ans) querymx(l); } } void querymn(int x) { int l=t[x].l; int r=t[x].r; int tmp=dis(t[x],T); if(tmp) ans=min(ans,tmp); int ansl=inf,ansr=inf; if(l) ansl=getmn(t[l]); if(r) ansr=getmn(t[r]); if(ansl<ansr) { if(ansl<ans) querymn(l); if(ansr<ans) querymn(r); } else { if(ansr<ans) querymn(r); if(ansl<ans) querymn(l); } } int query(int f,int x,int y) { T.d[0]=x;T.d[1]=y; if(f==0)ans=inf,querymn(rt); else ans=-inf,querymx(rt); return ans; }}kd; int main(){ n=read(); for(int i=1;i<=n;i++) { x[i]=read(),y[i]=read(); p[i].d[0]=x[i];p[i].d[1]=y[i]; } rt=kd.build(1,n,0); int ans=inf; for(int i=1;i<=n;i++) { int mn=kd.query(0,x[i],y[i]); int mx=kd.query(1,x[i],y[i]); ans=min(ans,mx-mn); } printf("%d\n",ans); return 0;}
0 0
- bzoj1941: [Sdoi2010]Hide and Seek KD-tree
- [BZOJ1941][Sdoi2010]Hide and Seek(kd-tree)
- [BZOJ1941][Sdoi2010]Hide and Seek(KD-tree)
- 【bzoj1941】【sdoi2010】【Hide and Seek】【kd树】
- [bzoj1941][kd-tree]Hide and Seek
- [BZOJ1941][Sdoi2010]Hide and Seek
- [bzoj1941][SDOI2010]Hide and Seek
- 【SDOI2010】【BZOJ1941】Hide and Seek
- bzoj1941: [Sdoi2010]Hide and Seek
- 【SDOI2010】bzoj1941 Hide and Seek
- 【bzoj1941】[Sdoi2010]Hide and Seek
- bzoj1941 [Sdoi2010]Hide and Seek
- Bzoj1941:[Sdoi2010]Hide and Seek:K-D-Tree
- BZOJ1941: [Sdoi2010]Hide and Seek kdtree
- [KD-TREE] BZOJ 1941 [Sdoi2010]Hide and Seek
- bzoj 1941: [Sdoi2010]Hide and Seek (KD-tree)
- 【BZOJ 1941】[Sdoi2010]Hide and Seek kd-tree
- 【BZOJ1941】【SDOI2010】Hide and Seek、KDTree【数组版】 模板、
- LocalBroadcastManager本地广播处理
- 网络爬虫(一) 网络爬虫基本原理
- 人心齐,泰山移
- 网站压力测试
- 黑马程序员-10.一位老农带着猫、狗、鱼过河
- bzoj1941: [Sdoi2010]Hide and Seek KD-tree
- Exponential Decay demo(Exponential Distribution)
- Android调用JNI方法 及 代码
- 访问tomcat7 java.lang.ClassCastException: org.apache.jasper.el.ELContextImpl
- IOS版本被拒的经历
- VS 2013使用SOUI时(vcpkgsrv.exe)进程导致物理内存升高解决的办法
- [Leetcode 232, Easy] Implement Queue using Stacks
- STL迭代器失效问题
- IE 不支持 jQuery的trim方法