P4357 [CQOI2016]K远点对
题意:给定平面中的 \(n\) 个点,求第 \(K\) 远的点对之间的距离,\(n\leq 1e5,K\leq min(100,\frac{n\times (n-1)}{2})\)
题解:kd-tree + priority_queue
用 size 为 \(2\times K\) 的小根堆记录当前 前 \(2\times K\) 远的点对,并以此为在搜索时剪枝的依据。
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#define R register int
#define ll long long
using namespace std;
namespace Luitaryi {
static char B[1<<15],*S=B,*T=B;
#define getchar() (S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?EOF:*S++)
inline int g() { R x=0,f=1;
register char s; while(!isdigit(s=getchar())) f=s=='-'?-1:f;
do x=x*10+(s^48); while(isdigit(s=getchar())); return x*f;
} const int N=100010,Inf=0x3f3f3f3f;
int n,m,rt,D;
struct P { int d[2];
inline int& operator [](int src) {return d[src];}
inline bool operator < (const P& that) const
{return d[D]<that.d[D];}
}p[N],s;
priority_queue<ll,vector<ll>,greater<ll> > q;
struct node {
int lc,rc,mx[2],mn[2]; P p;
#define ls (t[tr].lc)
#define rs (t[tr].rc)
#define mx(tr,i) (t[tr].mx[i])
#define mn(tr,i) (t[tr].mn[i])
#define P(tr,i) (t[tr].p.d[i])
}t[N];
inline void upd(int tr) {
for(R i=0;i<2;++i) {
mx(tr,i)=max(mx(tr,i),max(mx(ls,i),mx(rs,i)));
mn(tr,i)=min(mn(tr,i),min(mn(ls,i),mn(rs,i)));
}
}
inline void build(int& tr,int l,int r,int dim) {
R md=l+r>>1; tr=md; D=dim,nth_element(p+l,p+md,p+r+1);
t[tr].p=p[md]; for(R i=0;i<2;++i) mx(tr,i)=mn(tr,i)=P(tr,i);
if(l<md) build(ls,l,md-1,dim^1);
if(md<r) build(rs,md+1,r,dim^1); upd(tr);
}
#define sqr(x) ((ll)(x)*(x))
inline ll cal(P p) {
return sqr(p[0]-s[0])+sqr(p[1]-s[1]);
}
inline ll cal(int tr) {
return max(sqr(s[0]-mn(tr,0)),sqr(s[0]-mx(tr,0)))
+max(sqr(s[1]-mn(tr,1)),sqr(s[1]-mx(tr,1)));
}
inline void query(int tr) {
register ll dis=cal(t[tr].p),ldis=-Inf,rdis=-Inf;
if(dis>q.top()) q.pop(),q.push(dis);
if(ls) ldis=cal(ls); if(rs) rdis=cal(rs);
if(ldis>rdis) {
if(ldis>q.top()) query(ls);
if(rdis>q.top()) query(rs);
} else {
if(rdis>q.top()) query(rs);
if(ldis>q.top()) query(ls);
}
}
inline void main() {
n=g(),m=g()*2; mx(0,0)=mx(0,1)=-Inf,mn(0,0)=mn(0,1)=Inf;
for(R i=1;i<=n;++i) p[i].d[0]=g(),p[i].d[1]=g();
build(rt,1,n,0); for(R i=1;i<=m;++i) q.push(0);
for(R i=1;i<=n;++i) s=p[i],query(rt);
printf("%lld\n",q.top());
}
} signed main() {Luitaryi::main(); return 0;}
P4357 [CQOI2016]K远点对的更多相关文章
- P4357 [CQOI2016]K远点对(KDTree)
传送门 又一次产生了KDTree本质就是爆搜的感觉-- 大概就类似于p4169,只不过是从最近点对变成了第\(k\)远点对 我们开一个小根堆,里面放\(k\)个元素,起初全为\(0\),然后每一次都把 ...
- 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 ...
- 【BZOJ4520】[Cqoi2016]K远点对 kd-tree+堆
[BZOJ4520][Cqoi2016]K远点对 Description 已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对. Input 输入文件第一行为用空格隔开的两个整数 N, K.接下来 ...
- [Cqoi2016]K远点对 K-Dtree
4520: [Cqoi2016]K远点对 链接 bzoj 思路 用K-Dtree求点的最远距离. 求的时候顺便维护一个大小为2k的小根堆. 不知道为啥一定会对. 代码 #include <bit ...
- [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/转 ...
- 【bzoj4520】 Cqoi2016—K远点对
http://www.lydsy.com/JudgeOnline/problem.php?id=4520 (题目链接) 题意 求平面内第K远点对的距离. Solution 左转题解:jump 细节 刚 ...
- BZOJ 4520 [Cqoi2016]K远点对(KD树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4520 [题目大意] 求K远点对距离 [题解] 修改估价函数为欧式上界估价,对每个点进行 ...
随机推荐
- 2019/7/18ACM集训
2019-07-18 09:15:34 这个是练习刷的题 Vus the Cossack and Numbers Vus the Cossack has nn real numbers aiai. I ...
- IP核——FIFO
一.Quartus 1.打开Quartus ii,点击Tools---MegaWizard Plug-In Manager 2.弹出创建页面,选择Creat a new custom megafunc ...
- quartz2.3.0(八)使用日历排除不应该执行任务的时间段
Job任务类 package org.quartz.examples.example8; import java.util.Date; import org.slf4j.Logger; import ...
- JXOI2018
发现自己不会T3可以退群了 排序问题(组合.模拟) 可以发现Gobo Sort相当于在所有排列中随机选择一个,所以当第\(i\)个数出现次数为\(a_i\)时,期望的Sort次数就是\(\frac{( ...
- MES系统之设备管理的基础功能
设备是制造企业进行生产的主要物质技术基础,制造企业的生产率.产品质量.生产成本都与设备直接相关.因此,正确使用.定时保养.及时检修维护设备,并对设备的运行性能进行分析,使设备处于良好的状态,才能保证企 ...
- PKCS 标准
PKCS 标准 The Public-Key Cryptography Standards (PKCS)是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请.证书更新.证书 ...
- 使用springboot实现一个简单的restful crud——03、前端页面、管理员登陆(注销)功能
前言 这一篇我们就先引入前端页面和相关的静态资源,再做一下管理员的登陆和注销的功能,为后续在页面上操作数据做一个基础. 前端页面 前端的页面是我从网上找的一个基于Bootstrap 的dashboar ...
- nginx 高并发配置参数
一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1. worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu ...
- linux删除同目录及子目录下统一扩展名的文件
find . -name '*.csv' -type f -print -exec rm -rf {} \; 利用find去查找文件,点是指当前目录下,引号中是相应的数据的名称,自己可以定义,然后用t ...
- XSLT知识点【一】
XSL 指扩展样式表语言(EXtensible Stylesheet Language). 它起始于 XSL,结束于 XSLT.XPath 以及 XSL-FO. 起始于 XSL------CSS = ...