[CQOI2016]K远点对(KD-Tree)
暴力的做法应该是这样的,维护大小为k的堆,每次插入两点间距离并弹出堆顶。
然后这个做法显然是可以KD-Tree优化的,建立KD-Tree,然后如果该平面内最远点小于堆顶,则直接退出。就当做是复习很久没做的KD-Tree了。
不过有一个细节要注意,求最远点对,(1,2)->(2,1)算一对,所以堆的大小应该是2*k
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+;
struct point{ll d[];}a[N];
struct node{int mn[],mx[],lc,rc;point a;}t[N];
priority_queue<ll,vector<ll>,greater<ll> >q;
int n,m,rt,D;
bool operator<(point a,point b){return a.d[D]<b.d[D];}
void pushup(int x,int y)
{
t[x].mn[]=min(t[x].mn[],t[y].mn[]);
t[x].mn[]=min(t[x].mn[],t[y].mn[]);
t[x].mx[]=max(t[x].mx[],t[y].mx[]);
t[x].mx[]=max(t[x].mx[],t[y].mx[]);
}
void build(int&k,int l,int r,int d)
{
k=;
if(l>r)return;
D=d;
int mid=l+r>>;
nth_element(a+l,a+mid,a+r+);
k=mid;
t[k].mn[]=t[k].mx[]=t[k].a.d[]=a[k].d[];
t[k].mn[]=t[k].mx[]=t[k].a.d[]=a[k].d[];
build(t[k].lc,l,mid-,d^);
if(t[k].lc)pushup(k,t[k].lc);
build(t[k].rc,mid+,r,d^);
if(t[k].rc)pushup(k,t[k].rc);
}
ll getdis(point a,point b)
{return(a.d[]-b.d[])*(a.d[]-b.d[])+(a.d[]-b.d[])*(a.d[]-b.d[]);}
ll getdis2(point a,node b)
{
ll ret=;
ret=max(ret,getdis(a,(point){b.mn[],b.mn[]}));
ret=max(ret,getdis(a,(point){b.mn[],b.mx[]}));
ret=max(ret,getdis(a,(point){b.mx[],b.mn[]}));
ret=max(ret,getdis(a,(point){b.mx[],b.mx[]}));
return ret;
}
void query(int k,point a)
{
ll dis=getdis(a,t[k].a);
if(dis>q.top())q.pop(),q.push(dis);
if(t[k].lc)
{
dis=getdis2(a,t[t[k].lc]);
if(dis>q.top())query(t[k].lc,a);
}
if(t[k].rc)
{
dis=getdis2(a,t[t[k].rc]);
if(dis>q.top())query(t[k].rc,a);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%lld%lld",&a[i].d[],&a[i].d[]);
build(rt,,n,);
for(int i=;i<=m*;i++)q.push();
for(int i=;i<=n;i++)query(rt,a[i]);
printf("%lld",q.top());
}
[CQOI2016]K远点对(KD-Tree)的更多相关文章
- BZOJ 4520: [Cqoi2016]K远点对(k-d tree)
Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1162 Solved: 618[Submit][Status][Discuss] Descripti ...
- BZOJ4520:[CQOI2016]K远点对(K-D Tree)
Description 已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. Input 输入文件第一行为用空格隔开的两个整数 N, K.接下来 N 行,每行两个整数 X,Y,表示一个点 的坐标 ...
- 【BZOJ4520】[Cqoi2016]K远点对 kd-tree+堆
[BZOJ4520][Cqoi2016]K远点对 Description 已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. Input 输入文件第一行为用空格隔开的两个整数 N, K.接下来 ...
- BZOJ 4520: [Cqoi2016]K远点对
4520: [Cqoi2016]K远点对 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 638 Solved: 340[Submit][Status ...
- [BZOJ4520][Cqoi2016]K远点对 kd-tree 优先队列
4520: [Cqoi2016]K远点对 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1285 Solved: 708[Submit][Statu ...
- [Cqoi2016]K远点对 K-Dtree
4520: [Cqoi2016]K远点对 链接 bzoj 思路 用K-Dtree求点的最远距离. 求的时候顺便维护一个大小为2k的小根堆. 不知道为啥一定会对. 代码 #include <bit ...
- BZOJ 4520 [Cqoi2016]K远点对(KD树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4520 [题目大意] 求K远点对距离 [题解] 修改估价函数为欧式上界估价,对每个点进行 ...
- BZOJ4520:[CQOI2016]K远点对
浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...
- [bzoj4520][Cqoi2016]K远点对_KD-Tree_堆
K远点对 bzoj-4520 Cqoi-2016 题目大意:已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. 注释:$1\le n\le 10^5$,$1\le k\le 100$,$k\l ...
- BZOJ4520 [Cqoi2016]K远点对
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
随机推荐
- node - multer 加图片后缀
var multer = require('multer') var storage = multer.diskStorage({ destination: function (req, file ...
- 基于线程池、消息队列和epoll模型实现并发服务器架构
引言 并发是什么?企业在进行产品开发过程中为什么需要考虑这个问题?想象一下天猫的双11和京东的618活动,一秒的点击量就有几十万甚至上百万,这么多请求一下子涌入到服务器,服务器需要对这么多的请求逐个进 ...
- Unable to execute dex:Multuple dex files define 解决方法
困扰我两天的问题终于解决了,在网上查的方法无非有三种 一. Eclipse->Project->去掉Build Automatically->Clear ->Build Pro ...
- 056、Java中continue的用法
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- ACM-吴奶奶买鱼
题目描述:吴奶奶买鱼 吴奶奶有个可爱的外孙女——琪琪,她很喜欢小动物,尤其喜欢养鱼.为了让小孙女养到漂亮的小鱼,吴奶奶一大早就到花鸟鱼虫市场买鱼.这个市场可真大,里面有各种各样的宠物,就连宠物鱼都 ...
- Golang的变量定义及使用案例
Golang的变量定义及使用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.变量的定义 package main import "fmt" func m ...
- POJ 3983:快算24
快算24 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4791 Accepted: 2930 Description ...
- html5游戏的横屏问题
html5 API有这个参数 Screen Orientation API 可以看w3c定义的规范 The Screen Orientation API <!-- UC强制竖屏 --> & ...
- idea 将java 项目 打包成jar包
记录一下,防止忘记.ps : 请忽略这个是web项目 1.idea 打包jar包 (1)首先打开Project Structure,选中Artifacts (2)点击绿色加号,选中jar ,然后选中f ...
- 073-PHP数组元素相加
<?php $arr1=array(1,2,3,4,'5','05',TRUE); //等价于 1+2+3+4+5+5+1=21 $arr2=array(1,2,'ABC',3,'hello', ...