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

首頁 > 學院 > 開發設計 > 正文

[BZOJ4520][Cqoi2016]K遠點對(kd-tree+堆)

2019-11-08 03:24:58
字體:
來源:轉載
供稿:網友

題目描述

傳送門

題解

枚舉每一個點,求前k大用一個小根堆維護一下就行了 kd-tree查詢的時候一對點會算兩次,所以求前2k大 剛開始手殘T死了mdzz…

代碼

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<queue>#include<vector>using namespace std;#define LL long long#define N 100005int n,k,root,cnt,cmpd;LL x,y,ans;struct data{ int l,r; LL d[2],mn[2],mx[2];}tr[N];PRiority_queue <LL,vector<LL>,greater<LL> > q;void update(int x){ int l=tr[x].l,r=tr[x].r; if (l) { tr[x].mx[0]=max(tr[x].mx[0],tr[l].mx[0]); tr[x].mn[0]=min(tr[x].mn[0],tr[l].mn[0]); tr[x].mx[1]=max(tr[x].mx[1],tr[l].mx[1]); tr[x].mn[1]=min(tr[x].mn[1],tr[l].mn[1]); } if (r) { tr[x].mx[0]=max(tr[x].mx[0],tr[r].mx[0]); tr[x].mn[0]=min(tr[x].mn[0],tr[r].mn[0]); tr[x].mx[1]=max(tr[x].mx[1],tr[r].mx[1]); tr[x].mn[1]=min(tr[x].mn[1],tr[r].mn[1]); }}int cmp(data a,data b){ return a.d[cmpd]<b.d[cmpd]||a.d[cmpd]==b.d[cmpd]&&a.d[cmpd^1]<b.d[cmpd^1];}int build(int l,int r,int d){ int mid=(l+r)>>1; cmpd=d; nth_element(tr+l,tr+mid,tr+r+1,cmp); tr[mid].mx[0]=tr[mid].mn[0]=tr[mid].d[0]; tr[mid].mx[1]=tr[mid].mn[1]=tr[mid].d[1]; if (l<mid) tr[mid].l=build(l,mid-1,d^1); if (mid<r) tr[mid].r=build(mid+1,r,d^1); update(mid); return mid;}LL qr(LL x){ return x*x;}LL dist(int now){ LL dis=0LL; dis+=max(qr(x-tr[now].mn[0]),qr(tr[now].mx[0]-x)); dis+=max(qr(y-tr[now].mn[1]),qr(tr[now].mx[1]-y)); return dis;}void query(int now){ LL dl=-1LL,dr=-1LL,d0; d0=qr(tr[now].d[0]-x)+qr(tr[now].d[1]-y); if (cnt<k) ++cnt,q.push(d0); else if (d0>q.top()) q.pop(),q.push(d0); if (tr[now].l) dl=dist(tr[now].l); if (tr[now].r) dr=dist(tr[now].r); if (dl>dr) { if (tr[now].l&&(cnt<k||dl>q.top())) query(tr[now].l); if (tr[now].r&&(cnt<k||dr>q.top())) query(tr[now].r); } else { if (tr[now].r&&(cnt<k||dr>q.top())) query(tr[now].r); if (tr[now].l&&(cnt<k||dl>q.top())) query(tr[now].l); }}int main(){ scanf("%d%d",&n,&k);k*=2; for (int i=1;i<=n;++i) scanf("%lld%lld",&tr[i].d[0],&tr[i].d[1]); root=build(1,n,0); for (int i=1;i<=n;++i) { x=tr[i].d[0],y=tr[i].d[1]; query(root); } ans=q.top(); printf("%lld/n",ans);}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台安县| 文水县| 镇原县| 临高县| 绥棱县| 定日县| 剑阁县| 皋兰县| 休宁县| 大悟县| 浑源县| 枞阳县| 丰城市| 肃宁县| 安塞县| 齐齐哈尔市| 崇礼县| 蓬溪县| 崇左市| 凉城县| 南平市| 闽清县| 平度市| 泽普县| 城市| 梨树县| 中山市| 新津县| 麻城市| 密云县| 虎林市| 石渠县| 建平县| 个旧市| 达尔| 永春县| 肃宁县| 湟源县| 海丰县| 江阴市| 敦煌市|