loj2043 「CQOI2016」K 远点对
k-d tree 裸题………………
#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
int n, k, rot, nowD, din;
ll dui[205];
const ll oo=9e18;
struct Point{
	int d[2], mn[2], mx[2], l, r;
	int & operator[](int x){
		return d[x];
	}
	bool operator<(const Point &x)const{
		return d[nowD]<x.d[nowD];
	}
}p[100005], T;
bool cmp(ll x, ll y){
	return x>y;
}
struct KDTree{
	Point t[100005];
	void pushUp(int k){
		int l=t[k].l, r=t[k].r;
		for(int i=0; i<2; i++){
			t[k].mn[i] = t[k].mx[i] = t[k][i];
			if(l){
				t[k].mn[i] = min(t[k].mn[i], t[l].mn[i]);
				t[k].mx[i] = max(t[k].mx[i], t[l].mx[i]);
			}
			if(r){
				t[k].mn[i] = min(t[k].mn[i], t[r].mn[i]);
				t[k].mx[i] = max(t[k].mx[i], t[r].mx[i]);
			}
		}
	}
	int build(int l, int r, int now){
		nowD = now;
		int mid=(l+r)>>1;
		nth_element(p+l, p+mid, p+r+1);
		t[mid] = p[mid];
		if(l<mid)	t[mid].l = build(l, mid-1, now^1);
		if(mid<r)	t[mid].r = build(mid+1, r, now^1);
		pushUp(mid);
		return mid;
	}
	ll getDis(const Point &u, const Point &v){
		return (ll)(u.d[1]-v.d[1])*(u.d[1]-v.d[1])+(ll)(u.d[0]-v.d[0])*(u.d[0]-v.d[0]);
	}
	ll simDis(int k){
		ll re=0;
		for(int i=0; i<2; i++){
			ll tmp=max(abs(t[k].mn[i]-T[i]), abs(t[k].mx[i]-T[i]));
			re += tmp * tmp;
		}
		return re;
	}
	void query(int k){
		ll d=getDis(t[k], T), disl=-oo, disr=-oo;
		int l=t[k].l, r=t[k].r;
		if(d>dui[1]){
			pop_heap(dui+1, dui+1+din, cmp);
			dui[din] = d;
			push_heap(dui+1, dui+1+din, cmp);
		}
		if(l)	disl = simDis(l);
		if(r)	disr = simDis(r);
		if(disl>disr){
			if(disl>dui[1])	query(l);
			if(disr>dui[1])	query(r);
		}
		else{
			if(disr>dui[1])	query(r);
			if(disl>dui[1])	query(l);
		}
	}
}kdt;
int main(){
	cin>>n>>k;
	k *= 2;
	for(int i=1; i<=n; i++)
		scanf("%d %d", &p[i][0], &p[i][1]);
	rot = kdt.build(1, n, 0);
	while(k--)	dui[++din] = -oo;
	for(int i=1; i<=n; i++){
		T = p[i];
		kdt.query(rot);
	}
	cout<<dui[1]<<endl;
	return 0;
}
loj2043 「CQOI2016」K 远点对的更多相关文章
- LibreOJ2043 - 「CQOI2016」K 远点对
		Portal Description 给出平面上的\(n(n\leq10^5)\)个整点,求在欧几里得距离下第\(k\)远的点对之间的距离. Solution k-d树+堆. 用小根堆维护当前找到的第 ... 
- 「CQOI2016」K 远点对
		/* 考虑暴力 可以n ^ 2枚举点对 然后用一个容量为2k的小根堆来维护第k大 kd-tree呢就是来将这个暴力优化, 每次先找远的并且最远距离不如堆顶的话就不继续找下去 貌似挺难构造数据卡的 */ ... 
- LibreOJ2044 - 「CQOI2016」手机号码
		Portal Description 给出两个十一位数\(L,R\),求\([L,R]\)内所有满足以下两个条件的数的个数. 出现至少\(3\)个相邻的相同数字: 不能同时出现\(4\)和\(8\). ... 
- LoibreOJ 2042. 「CQOI2016」不同的最小割 最小割树 Gomory-Hu tree
		2042. 「CQOI2016」不同的最小割 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ... 
- loj #2044. 「CQOI2016」手机号码
		#2044. 「CQOI2016」手机号码 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ... 
- LibreOJ2045 - 「CQOI2016」密钥破解
		Portal Description 给出三个正整数\(e,N,c(\leq2^{62})\).已知\(N\)能表示成\(p\cdot q\)的形式,其中\(p,q\)为质数.计算\(r=(p-1)( ... 
- LibreOJ2042 - 「CQOI2016」不同的最小割
		Portal Description 给出一个给出一个\(n(n\leq850)\)个点\(m(m\leq8500)\)条边的无向图.定义\(cut(s,t)\)等于\(s,t\)的最小割的容量,求在 ... 
- 「CQOI2016」不同的最小割
		「CQOI2016」不同的最小割 传送门 建出最小割树,把每一个点对的最小割抠出来 \(\text{unique}\) 一下就好了. 参考代码: #include <algorithm> ... 
- 「ZJOI2013」K大数查询
		「ZJOI2013」K大数查询 传送门 整体二分,修改的时候用线段树代替树状数组即可. 参考代码: #include <cstdio> #define rg register #defin ... 
随机推荐
- Android使用文件管理器打开指定文件夹,浏览里面的内容
			Android下可以打开一些文件,带有.doc 等后缀的文件网上一般都有解释,这个写一个使用文件管理器打开指定文件夹的 private void openAssignFolder(String pat ... 
- jQuery_1_基础核心
			jQuery代码风格:在jQuery程序中,不管是页面元素的选择还是内置的功能函数,都是以“$"来起始的. $(function(){}); / ... 
- hihoCoder 挑战赛10  #1144 : 01串
			思路:这只是逻辑测试题吧,考虑周全就行了.考虑n=m的情况,n>m的情况,m>n的情况. (1)n>m的情况,0比1多几个都是行的,一共有m个“01”,后面补足够多个零即可. (2) ... 
- COGS 1365. [HAOI2013] 软件安装
			★★☆ 输入文件:haoi13t4.in 输出文件:haoi13t4.out 简单对比时间限制:1 s 内存限制:128 MB Dr.Kong有一个容量为N MB (1 <= N ... 
- Coursera 算法二 week 4 Boggle
			这次的作业主要用到了单词查找树和深度优先搜索. 1.在深度优先搜索中,在当前层的递归调用前,将marked数组标记为true.当递归调用返回到当前层时,应将marked数组标记为false.这样既可以 ... 
- EF写统计
			EF的特性是,你from的第一个表为主表,接下来的所有表以左联或者内联或者交叉连接的方式去显示,不会出现右联, 在编写的时候,可以先确定个数据源,然后对这个数据源进行数据的统计, 例如SQL: -- ... 
- UVA Live Archive 4015 Cave (树形dp,分组背包)
			和Heroes Of Might And Magic 相似,题目的询问是dp的一个副产物. 距离是不好表示成状态的,但是可以换一个角度想,如果知道了从一个点向子树走k个结点的最短距离, 那么就可以回答 ... 
- Problem G: 角谷步数
			Problem G: 角谷步数 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 78 Solved: 28[Submit][Status][Web Bo ... 
- Java自带工具包StringUtils包含方法
			//导入包 import org.apache.commons.lang3.StringUtils //判断不为空 不包含空格 StringUtils.isNotEmpty(" " ... 
- PAT (Basic Level) Practise (中文)- 1006. 换个格式输出整数 (15)
			http://www.patest.cn/contests/pat-b-practise/1006 让我们用字母B来表示“百”.字母S表示“十”,用“12...n”来表示个位数字n(<10),换 ... 
