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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BZOJ - 4520 K远点对

發(fā)布時間:2023/12/1 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ - 4520 K远点对 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題意:已知平面內(nèi) N 個點的坐標(biāo),求歐氏距離下的第 K 遠(yuǎn)點對

維護(hù)大小為2k最小堆,KD樹的估值用前面提到的做法
PS.網(wǎng)上有人估價是使用邊界四個點的最值來獨立枚舉,然而這樣寫似乎過不了

#include<bits/stdc++.h> #define rep(i,j,k) for(register int i=j;i<=k;i++) #define rrep(i,j,k) for(register int i=j;i>=k;i--) #define erep(i,u) for(register int i=head[u];~i;i=nxt[i]) #define print(a) printf("%lld",(ll)(a)) #define println(a) printf("%lld\n",(ll)(a)) #define printbk(a) printf("%lld ",(ll)(a)) using namespace std; const int MAXN = 2e5+11; const int INF = 0x7fffffff; typedef long long ll; ll read(){ll x=0,f=1;register 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 D; struct point{int x[2];bool operator < (const point &rhs) const{return x[D]<rhs.x[D];} }; struct KD{int son[MAXN][2];point p[MAXN],mn[MAXN],mx[MAXN];int root,ans,tot,n;priority_queue<ll,vector<ll>,greater<ll> > pq;void init(int t){ans=INF; tot=D=0; n=t;}void pu(int o){rep(i,0,1){if(son[o][i]) rep(j,0,1){if(mn[son[o][i]].x[j]<mn[o].x[j]) mn[o].x[j]=mn[son[o][i]].x[j];if(mx[son[o][i]].x[j]>mx[o].x[j]) mx[o].x[j]=mx[son[o][i]].x[j];}}}int build(int now,int l,int r){int mid=l+r>>1;tot++; son[mid][0]=son[mid][1]=0;D=now;nth_element(p+l,p+mid,p+r+1);//[l,r+1)mn[mid].x[0]=mx[mid].x[0]=p[mid].x[0];mn[mid].x[1]=mx[mid].x[1]=p[mid].x[1];if(l<mid) son[mid][0]=build(now^1,l,mid-1);if(r>mid) son[mid][1]=build(now^1,mid+1,r);pu(mid);return mid;}void insert(int &o,int now,point v){if(!o){o=++tot;p[o].x[0]=mn[o].x[0]=mx[o].x[0]=v.x[0];p[o].x[1]=mn[o].x[1]=mx[o].x[1]=v.x[1];}else{insert(son[o][p[o].x[now]<v.x[now]],now^1,v);pu(o);}}inline ll dis(point a,point b){return (ll)(a.x[0]-b.x[0])*(a.x[0]-b.x[0])+1ll*(a.x[1]-b.x[1])*(a.x[1]-b.x[1]);}inline point mp(int x,int y){point t;t.x[0]=x;t.x[1]=y;return t;}inline ll eva(int o,point &v){if(!o) return -6666;ll t1=max(abs(mn[o].x[0]-v.x[0]),abs(mx[o].x[0]-v.x[0]));ll t2=max(abs(mn[o].x[1]-v.x[1]),abs(mx[o].x[1]-v.x[1]));return t1*t1+t2*t2;}void query(int o,point &v){if(!o)return;while(pq.size()>2*n) pq.pop(); ll d1=dis(p[o],v),d2=-6666,d3=-6666;if(pq.top()<d1){pq.pop();pq.push(d1);}if(son[o][0]) d2=eva(son[o][0],v);if(son[o][1]) d3=eva(son[o][1],v);if(d2>d3){if(d2>pq.top()) query(son[o][0],v);if(d3>pq.top()) query(son[o][1],v);}else{if(d3>pq.top()) query(son[o][1],v);if(d2>pq.top()) query(son[o][0],v);}} }kd; int main(){int n,k;while(cin>>n>>k){kd.init(k);rep(i,1,n){kd.p[i].x[0]=read();kd.p[i].x[1]=read();}kd.root=kd.build(0,1,n);while(!kd.pq.empty()) kd.pq.pop();rep(i,1,2*k) kd.pq.push(-666);rep(i,1,n){kd.query(kd.root,kd.p[i]);}println(kd.pq.top());}return 0; }

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

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的BZOJ - 4520 K远点对的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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