日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ2648 SJY摆棋子(KD-Tree)

發(fā)布時(shí)間:2023/12/18 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ2648 SJY摆棋子(KD-Tree) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  板子題。

#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long long #define N 1000010 #define inf 2000000000 char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;} int gcd(int n,int m){return m==0?n:gcd(m,n%m);} int read() {int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f; } int n,m,root,cnt,c,ans; struct point {int d[2],tag;bool operator <(const point&a) const{return d[c]<a.d[c];} }a[N]; struct KDTree{int ch[2],a[2][2],tag;point p; }tree[N]; struct data{int op;point p; }q[N]; inline int dis(point u,point v){return abs(u.d[0]-v.d[0])+abs(u.d[1]-v.d[1]);} inline void chkmin(int &x,int y){x=min(x,y);} inline void chkmax(int &x,int y){x=max(x,y);} inline bool isin(point x,int a[2][2]){return a[0][0]<=x.d[0]&&a[0][1]>=x.d[0]&&a[1][0]<=x.d[1]&&a[1][1]>=x.d[1];} inline int max(int x,int y,int z){return max(max(x,y),z);} inline int guess(point x,int a[2][2]){return max(0,a[0][0]-x.d[0],x.d[0]-a[0][1])+max(0,a[1][0]-x.d[1],x.d[1]-a[1][1]);} void build(int &k,int l,int r,int op) {if (l>r) return;k=++cnt;c=op;int mid=l+r>>1;nth_element(a+l,a+mid,a+r+1);tree[k].p=a[mid],tree[k].tag=a[mid].tag,tree[k].a[0][0]=tree[k].a[0][1]=a[mid].d[0],tree[k].a[1][0]=tree[k].a[1][1]=a[mid].d[1];for (int i=l;i<=r;i++)chkmin(tree[k].a[0][0],a[i].d[0]),chkmax(tree[k].a[0][1],a[i].d[0]),chkmin(tree[k].a[1][0],a[i].d[1]),chkmax(tree[k].a[1][1],a[i].d[1]);build(tree[k].ch[0],l,mid-1,op^1);build(tree[k].ch[1],mid+1,r,op^1); } void ins(int k,point x) {if (!k) return;if (tree[k].p.d[0]==x.d[0]&&tree[k].p.d[1]==x.d[1]) {tree[k].tag=1;return;}if (isin(x,tree[tree[k].ch[0]].a)) ins(tree[k].ch[0],x);if (isin(x,tree[tree[k].ch[1]].a)) ins(tree[k].ch[1],x); } void query(int k,point x) {if (!k) return;if (tree[k].tag) chkmin(ans,dis(x,tree[k].p));int p=tree[k].ch[0],q=tree[k].ch[1],u=guess(x,tree[p].a),v=guess(x,tree[q].a);if (v<u) swap(p,q),swap(u,v);if (u<ans) query(p,x);if (v<ans) query(q,x); } int main() { #ifndef ONLINE_JUDGEfreopen("bzoj2648.in","r",stdin);freopen("bzoj2648.out","w",stdout);const char LL[]="%I64d\n"; #elseconst char LL[]="%lld\n"; #endifn=read(),m=read();for (int i=1;i<=n;i++) a[i].d[0]=read(),a[i].d[1]=read(),a[i].tag=1;for (int i=1;i<=m;i++){q[i].op=read(),q[i].p.d[0]=read(),q[i].p.d[1]=read();if (q[i].op==1) a[++n]=q[i].p;}build(root,1,n,0);for (int i=1;i<=m;i++)if (q[i].op==1) ins(root,q[i].p);else ans=inf,query(root,q[i].p),printf("%d\n",ans);return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/Gloid/p/10159247.html

總結(jié)

以上是生活随笔為你收集整理的BZOJ2648 SJY摆棋子(KD-Tree)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。