[KD-TREE] BZOJ 2648 SJY摆棋子 & BZOJ 2716 [Violet 3]天使玩偶
2016-05-18 18:32
477 查看
题意:找最小曼哈顿距离 带插入
#include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; inline char nc() { static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; } return *p1++; } inline void read(int &x) { char c=nc(),b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b; } const int N=1000005; int n,m,D; struct node{ int d[2],mn[2],mx[2],l,r; node(int x=0,int y=0) { d[0]=mn[0]=mx[0]=x; d[1]=mn[1]=mx[1]=y; l=r=0; } int& operator [](int x){ return d[x]; } bool operator == (const node &B) const{ return d[0]==B.d[0] && d[1]==B.d[1]; } bool operator < (const node &B) const{ return d[D]<B.d[D]; } friend int dist(node A,node B){ return abs(A[0]-B[0])+abs(A[1]-B[1]); } }tmp ; struct KDT{ node T ,now; int root,ncnt,ans; void update(int x){ int l=T[x].l,r=T[x].r; for (int i=0;i<2;i++) { T[x].mn[i]=T[x].mx[i]=T[x][i]; if (l) T[x].mn[i]=min(T[x].mn[i],T[l].mn[i]),T[x].mx[i]=max(T[x].mx[i],T[l].mx[i]); if (r) T[x].mn[i]=min(T[x].mn[i],T[r].mn[i]),T[x].mx[i]=max(T[x].mx[i],T[r].mx[i]); } } int Reb(int l,int r,int D){ if (l>r) return 0; int mid=(l+r)>>1; ::D=D; nth_element(tmp+l,tmp+mid,tmp+r+1); T[mid]=tmp[mid]; T[mid].l=Reb(l,mid-1,D^1); T[mid].r=Reb(mid+1,r,D^1); update(mid); return mid; } void Ins(int &x,int D){ if (!x){ T[x=++ncnt]=now; return; } if (T[x]==now) return; if (now[D]<T[x].d[D]) Ins(T[x].l,D^1); else Ins(T[x].r,D^1); update(x); } int Get(int x){ int ret=0; for (int i=0;i<2;i++) ret+=max(T[x].mn[i]-now[i],0),ret+=max(now[i]-T[x].mx[i],0); return ret; } void Query(int x) { int tmp=dist(T[x],now); ans=min(ans,tmp); int l=T[x].l,r=T[x].r,dl=1<<30,dr=1<<30; if (l) dl=Get(l); if (r) dr=Get(r); if (dl<dr) { if (dl<ans) Query(l); if (dr<ans) Query(r); }else{ if (dr<ans) Query(r); if (dl<ans) Query(l); } } }KD; int main() { int ix,iy,order; freopen("t.in","r",stdin); freopen("t.out","w",stdout); read(n); read(m); for (int i=1;i<=n;i++){ read(ix); read(iy); tmp[i]=node(ix,iy); // KD.now=node(ix,iy); // KD.Ins(KD.root,0); } KD.root=KD.Reb(1,n,0); KD.ncnt=n; for (int i=1;i<=m;i++) { read(order); if (order==1){ read(ix); read(iy); KD.now=node(ix,iy); KD.Ins(KD.root,0); }else{ read(ix); read(iy); KD.now=node(ix,iy); KD.ans=1<<30; KD.Query(KD.root); printf("%d\n",KD.ans); } } return 0; }
相关文章推荐
- Retrofit2.0使用详解
- H5之重力感应篇
- 资深设计师:如何做一款优秀的动作游戏
- 时间复杂度和空间复杂度(转)
- FFmpeg for Android compiled with x264, libass, fontconfig, freetype and fribidi
- 用FragmentTabHost管理Fragment,实现页面切换
- [KD-TREE 堆] BZOJ 4520 [Cqoi2016]K远点对
- samba访问其他服务器文件权限设置
- 回文
- Content-Type对照表
- Hdu oj 1004 Let the Balloon Rise(map)
- jQuery中this与$(this)的区别实例
- JAVA实现的一个简单的死锁(附解释)
- [KD-TREE] BZOJ 2850 巧克力王国
- 踏破铁鞋无觅处,从AsyncTask学Android线程池
- 踏破铁鞋无觅处,从AsyncTask学Android线程池
- Android WebView重定向的网页无法goBack()的几个解决方案
- [KD-TREE] BZOJ 1941 [Sdoi2010]Hide and Seek
- HUD 2544 最短路
- NanUI for Winform发布,让Winform界面设计拥有无限可能