国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

[模版] K/最近鄰匹配(KD Tree)

2019-11-10 19:15:07
字體:
供稿:網(wǎng)友

nth_element相當(dāng)于快排的split/choose pivot過程

2D 最近

#include <bits/stdc++.h>#define mem(a,b) memset(a,b,sizeof(a))const int INF=0x3f3f3f3f;const int maxn=1e5+50;typedef long long ll;using namespace std;int cmpNo;struct Node{ int x[2],l,r,id; bool Operator <(const Node &b)const{ return x[cmpNo]<b.x[cmpNo]; }};ll calDis(Node &l,Node &r){ ll dx=l.x[0]-r.x[0],dy=l.x[1]-r.x[1]; return dx*dx+dy*dy;}Node p[maxn];int Build(int l,int r,int d){ if(l>r)return 0; cmpNo=d; int mid=l+r>>1; nth_element(p+l,p+mid,p+r+1); p[mid].l=Build(l,mid-1,1-d); p[mid].r=Build(mid+1,r,1-d); return mid;}ll ansDist;int ansId;void Kth(int l,int r,Node &tar,int d){ if(l>r)return; int mid=l+r>>1; if(p[mid].id!=tar.id){ ll tmp=calDis(p[mid],tar); if(tmp<ansDist){ ansDist=tmp; ansId=p[mid].id; } } long long t=tar.x[d]-p[mid].x[d]; if(t<=0){ Kth(l,mid-1,tar,1-d); if(ansDist>t*t) Kth(mid+1,r,tar,1-d); } else{ Kth(mid+1,r,tar,1-d); if(ansDist>t*t) Kth(l,mid-1,tar,1-d); }}Node a[maxn];int main(){ int T; scanf("%d",&T); for(int cs=1;cs<=T;cs++) { int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d %d",&p[i].x[0],&p[i].x[1]); p[i].id=i; a[i]=p[i]; } Build(1,n,0); for(int i=1;i<=n;i++) { ansDist=1e18; Kth(1,n,a[i],0); K維 Q近#include <bits/stdc++.h>#define mem(a,b) memset(a,b,sizeof(a))const int INF=0x3f3f3f3f;const int maxn=4e5+50;typedef long long ll;using namespace std;int cmpNo;const int K=2;struct Node{ int x[K],l,r,id; bool operator <(const Node &b)const{ return x[cmpNo]<b.x[cmpNo]; }};long long Dis(const Node &a,const Node &b){ long long ret=0; for(int i=0;i<K;i++) ret+=(a.x[i]-b.x[i])*(a.x[i]-b.x[i]); return ret;}Node p[maxn];int Build(int l,int r,int d){ if(l>r)return 0; cmpNo=d; int mid=l+r>>1; nth_element(p+l,p+mid,p+r+1); p[mid].l=Build(l,mid-1,(d+1)%K); p[mid].r=Build(mid+1,r,(d+1)%K); return mid;}priority_queue<pair<ll,int> >q;void Kth(int l,int r,Node tar,int k,int d){ if(l>r)return; int mid=l+r>>1; if(p[mid].id!=tar.id){ pair<ll,int>v=make_pair(Dis(p[mid],tar),p[mid].id); if(q.size()==k && v<q.top())q.pop(); if(q.size()<k)q.push(v); } ll t=tar.x[d]-p[mid].x[d]; if(t<=0){ Kth(l,mid-1,tar,k,(d+1)%K); if(q.top().first>t*t) Kth(mid+1,r,tar,k,(d+1)%K); } else{ Kth(mid+1,r,tar,k,(d+1)%K); if(q.top().first>t*t) Kth(l,mid-1,tar,k,(d+1)%K); }}Node a[maxn];ll calDis(Node &l,Node &r){ ll dx=l.x[0]-r.x[0],dy=l.x[1]-r.x[1]; return dx*dx+dy*dy;}const int Q=2;int main(){ int T; scanf("%d",&T); for(int cs=1;cs<=T;cs++) { int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d %d",&p[i].x[0],&p[i].x[1]); p[i].id=i; a[i]=p[i]; } Build(1,n,0); for(int i=1;i<=n;i++) { while(!q.empty()) q.pop(); for(int j=0;j<Q;j++) q.push(make_pair(1e18,-1)); Kth(1,n,a[i],Q,0); while(!q.empty()){ printf("%lld/n",calDis(a[i],a[q.top().second])); q.pop(); } } } return 0;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 四平市| 贡嘎县| 陕西省| 南宁市| 乐东| 邢台县| 巫山县| 永福县| 当雄县| 永济市| 福州市| 准格尔旗| 汕尾市| 伽师县| 建阳市| 河北省| 沧源| 陇西县| 镇坪县| 临西县| 通道| 老河口市| 嘉鱼县| 台湾省| 聊城市| 莱州市| 通渭县| 台北县| 亚东县| 怀远县| 阳信县| 福州市| 台安县| 微山县| 广水市| 和田县| 浦东新区| 桐乡市| 永丰县| 遵化市| 南雄市|