题面不符?……

#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
int n, m, nowD, rot, din, kk;
const ll oo=9e18;
struct Point{
int d[2], mn[2], mx[2], id, idmin, l, r;
int & operator[](int x){
return d[x];
}
bool operator<(const Point &x)const{
return d[nowD]<x.d[nowD];
}
}p[100005], T;
struct QueryNode{
int idx;
ll dis;
QueryNode(int id=0, ll di=0){
idx = id;
dis = di;
}
}qn[25];
bool cmp(const QueryNode &x, const QueryNode &y){
if(x.dis!=y.dis) return x.dis>y.dis;
return x.idx<y.idx;
}
struct KDTree{
Point t[100005];
void pushUp(int k){
int l=t[k].l, r=t[k].r;
t[k].idmin = t[k].id;
if(l) t[k].idmin = t[l].idmin;
if(r) t[k].idmin = t[r].idmin;
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[0]-v.d[0])*(u.d[0]-v.d[0])+(ll)(u.d[1]-v.d[1])*(u.d[1]-v.d[1]);
}
ll calc(int x){
ll re=0;
for(int i=0; i<2; i++){
ll tmp=max(abs(t[x].mn[i]-T[i]), abs(t[x].mx[i]-T[i]));
re += tmp * tmp;
}
return re;
}
void query(int k){
int l=t[k].l, r=t[k].r;
ll dis=getDis(t[k], T), disl=-oo, disr=-oo;
if(dis>qn[1].dis || (dis==qn[1].dis && t[k].id<qn[1].idx)){
pop_heap(qn+1, qn+1+din, cmp);
qn[din] = QueryNode(t[k].id, dis);
// cout<<t[k].id<<" as t[k].id\n";
push_heap(qn+1, qn+1+din, cmp);
}
if(l) disl = calc(l);
if(r) disr = calc(r);
if(disl>disr){
if(disl>qn[1].dis || (disl==qn[1].dis && t[l].idmin<qn[1].idx))
query(l);
if(disr>qn[1].dis || (disr==qn[1].dis && t[r].idmin<qn[1].idx))
query(r);
}
else{
if(disr>qn[1].dis || (disr==qn[1].dis && t[r].idmin<qn[1].idx))
query(r);
if(disl>qn[1].dis || (disl==qn[1].dis && t[l].idmin<qn[1].idx))
query(l);
}
}
}kdt;
int main(){
cin>>n;
for(int i=1; i<=n; i++){
scanf("%d %d", &p[i][0], &p[i][1]);
p[i].id = p[i].idmin = i;
}
rot = kdt.build(1, n, 0);
cin>>m;
while(m--){
din = 0;
scanf("%d %d %d", &T[0], &T[1], &kk);
while(kk--) qn[++din] = QueryNode(0, -oo);
kdt.query(rot);
// while(din){
// // cout<<qn[1].dis<<" "<<qn[1].idx<<" as dis&idx\n";
// pop_heap(qn+1, qn+1+din, cmp);
// din--;
// }
printf("%d\n", qn[1].idx);
}
return 0;
}

最新文章

  1. 打印文本中的所有单词,并且打印每个单词出现的行号,非实义单词不考虑(TCPL,练习6-3)
  2. Linux aclocal
  3. json,serialize,msgpack比较
  4. matlab练习程序(构造简单多边形)
  5. dedecms 忘记后台密码
  6. C# Post方式传输报文,和处理响应
  7. Android取得电池的电量
  8. Linux的用户和组
  9. 开发者工具console
  10. 引用类型之object类型
  11. APP案例分析
  12. 【SYZOI Round1】滑稽的树
  13. 一文带你超详细了解Cookie
  14. (DIjsktra算法) nyoj1401-一场说走就走的旅行
  15. HTML5的 input:file上传 以及 类型控制
  16. 02MySQL中的数据类型
  17. linux下配置SS5(SOCK5)代理服务
  18. [.NET开发] C#使用doggleReport生成pdf报表的方法
  19. C语言 &#183; 求指数
  20. FastAdmin 升级后出现 is already in use

热门文章

  1. 零基础逆向工程30_Win32_04_资源文件_消息断点
  2. SqlServer作业指定目标服务器
  3. MVC 控制器向View传值的三种方法(转)
  4. LeetCode Search Insert Position (二分查找)
  5. IOS Modal(切换另外控件器方式)
  6. World Wind Java开发之十五——加载三维模型(转)
  7. 欠采样(undersampling)和过采样(oversampling)会对模型带来怎样的影响
  8. AngularJs学习笔记-数据绑定、管道
  9. axios向后端请求解决跨域问题
  10. vue列表过渡效果