【24.91】【Tsinsen 1302】&【BZOJ 2626】JZPFAR
AC次数:137 平均分:40.31
下面n行,每行两个整数x_i, y_i,表示n个点的坐标。点的标号按照输入顺序,分别为1..n。
下面一行,一个整数m,表示询问个数。
下面m行,每行三个整数px_i, py_i, k_i,表示一个询问。
0 0
0 1
0 2
3
1 1 2
0 0 3
0 1 1
1
1
100%的数据中,n<=10^5, m<=10^4, 1<=k<=20,所有点(包括询问的点)的坐标满足绝对值<=10^9,n个点中任意两点坐标不同,m个询问的点的坐标在某范围内随机分布。
【题解】
kd-tree。
注意求的是第k“远"
在找到时候用一个队列维护当前找到的前k远的距离(因为k最大只有20,所以不用写恶心的二分检索了)。
即dl[1..k],其中dl[k]是第k远,dl[1]是最远的。
然后估价函数的判断变成
gujia[某个方向] >= dl[k]
满足则继续往那个方向找。
ma_x[2],mi_n[2]是某个子树的里面点的坐标最大可能形成的矩形的左上角和右上角坐标。
[0]是x,[1]是y;
【代码】
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int MAXN = 150000;
const int MAXK = 30;
struct point
{
long long d[2], ma_x[2], mi_n[2];
int l, r, id;
};
struct ddl
{
long long dis;
int id;
};
int n, root, now, k;
point t[MAXN], p[MAXN], op;
long long x[MAXN], y[MAXN];
ddl dl[MAXK];
bool cmp(point a, point b)
{
if (a.d[now] < b.d[now])
return true;
return false;
}
void push_up(int rt)
{
int l = t[rt].l, r = t[rt].r;
for (int i = 0; i <= 1; i++)
{
if (l)
{
t[rt].ma_x[i] = max(t[rt].ma_x[i], t[l].ma_x[i]);
t[rt].mi_n[i] = min(t[rt].mi_n[i], t[l].mi_n[i]);
}
if (r)
{
t[rt].ma_x[i] = max(t[rt].ma_x[i], t[r].ma_x[i]);
t[rt].mi_n[i] = min(t[rt].mi_n[i], t[r].mi_n[i]);
}
}
}
int build(int begin, int end, int fx)
{
int m = (begin + end) >> 1;
now = fx;
nth_element(p + begin, p + m, p + end + 1, cmp);//左闭右开区间
t[m] = p[m];
for (int i = 0; i <= 1; i++)
t[m].ma_x[i] = t[m].mi_n[i] = p[m].d[i];
if (begin < m)
t[m].l = build(begin, m - 1, 1 - fx);
if (m < end)
t[m].r = build(m + 1, end, 1 - fx);
push_up(m);
return m;
}
void input_data()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%lld%lld", &x[i], &y[i]);
p[i].d[0] = x[i];
p[i].d[1] = y[i];
p[i].id = i;
}
root = build(1, n, 0);
}
long long get_dis(point a, point b)
{
return (a.d[0] - b.d[0])*(a.d[0] - b.d[0]) + (a.d[1] - b.d[1])*(a.d[1] - b.d[1]);
}
long long gujia_max(int rt)
{
long long temp = 0;
for (int i = 0; i <= 1; i++)
temp += max((t[rt].ma_x[i] - op.d[i])*(t[rt].ma_x[i] - op.d[i]), (t[rt].mi_n[i] - op.d[i])*(t[rt].mi_n[i] - op.d[i]));
return temp;
}
void query(int rt)
{
long long dis = get_dis(t[rt], op);
int tempk = k;
while (dl[tempk].dis < dis || (dl[tempk].dis == dis && t[rt].id < dl[tempk].id))
{
tempk--;
if (!tempk)
break;
}
if (tempk != k) //比第k远的大。就看看它是第几远。
{
for (int i = k; i >= tempk + 2; i--)
dl[i] = dl[i - 1];
dl[tempk + 1].dis = dis;
dl[tempk + 1].id = t[rt].id;
}
long long gl = -2, gr = -2;
int l = t[rt].l, r = t[rt].r;
if (l)
gl = gujia_max(l);
if (r)
gr = gujia_max(r);
if (gl < gr)
{
if (dl[k].dis <= gr) //注意估价函数的判断
query(r);
if (dl[k].dis <= gl)
query(l);
}
else
{
if (dl[k].dis <= gl)
query(l);
if (dl[k].dis <= gr)
query(r);
}
}
void output_ans()
{
int m;
scanf("%d", &m);
for (int i = 1; i <= m; i++)
{
memset(dl, 255, sizeof(dl));
scanf("%lld%lld%d", &op.d[0], &op.d[1], &k);
query(root);
printf("%d\n", dl[k].id);
}
}
int main()
{
//freopen("F:\\rush.txt", "r", stdin);
input_data();
output_ans();
return 0;
}
【24.91】【Tsinsen 1302】&【BZOJ 2626】JZPFAR的更多相关文章
- 【BZOJ 2749】 2749: [HAOI2012]外星人 (数论-线性筛?类积性函数)
2749: [HAOI2012]外星人 Description Input Output 输出test行,每行一个整数,表示答案. Sample Input 1 2 2 2 3 1 Sample Ou ...
- 纳税服务系统【用户模块之使用POI导入excel、导出excel】
前言 再次回到我们的用户模块上,我们发现还有两个功能没有完成: 对于将网页中的数据导入或导出到excel文件中,我们是完全没有学习过的.但是呢,在Java中操作excel是相对常用的,因此也有组件供我 ...
- C# 获取 mp3文件信息【包括:文件大小、歌曲长度、歌手、专辑】
C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612 string fil ...
- 【BZOJ 2194】2194: 快速傅立叶之二(FFT)
2194: 快速傅立叶之二 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1273 Solved: 745 Description 请计算C[k]= ...
- 【BZOJ 4663】 (最小割)
4663: Hack Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 69 Solved: 26 Description 由于 FZYZ 教学区禁止使 ...
- 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目 目录索引
索引 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目(1)搭建MVC环境 注册区域 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目(2)创建 ...
- 【如何快速的开发一个完整的iOS直播app】(原理篇)
原文转自:袁峥Seemygo 感谢分享.自我学习 目录 [如何快速的开发一个完整的iOS直播app](原理篇) [如何快速的开发一个完整的iOS直播app](播放篇) [如何快速的开发一个完整的 ...
- 推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】
最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽 ...
- 【MyEclipse 2015】 逆向破解实录系列【终】(纯研究)
声明 My Eclipse 2015 程序版权为Genuitec, L.L.C所有. My Eclipse 2015 的注册码.激活码等授权为Genuitec, L.L.C及其付费用户所有. 本文只从 ...
随机推荐
- Flume的可靠性
Flume的可靠性 当节点出现故障时,日志能够被传送到其他节点上而不会丢失. Flume提供了三种级别的可靠性保障,从强到弱依次分别为:end-to- end(收到数据agent首先将event写到磁 ...
- 【agc009b】Tournament
Description 一场锦标赛有n个人,总共举办n-1次比赛,每次比赛必定一赢一输,输者不能再参赛.也就是整个锦标赛呈一个二叉树形式.已知一号选手是最后的胜者,以及对于i号选手(i>1)都知 ...
- 六、Docker+Gitlab
原文:六.Docker+Gitlab (1)下载镜像: docker pull gitlab/gitlab-ce (2)运行镜像: GITLAB_HOME=`pwd`/data/gitlab dock ...
- Photon + Unity3D 线上游戏开发 学习笔记(三)
好的,说了两篇了 如今我们正式的入手,揭开photon 的盖头哈 建立photon项目 第一步: 在Visual studio建立一个空的 待会为了測试也会在里面建立一个client 项目 (只 ...
- poj 1191 棋盘切割 (压缩dp+记忆化搜索)
一,题意: 中文题 二.分析: 主要利用压缩dp与记忆化搜索思想 三,代码: #include <iostream> #include <stdio.h> #include & ...
- Python Tricks(二十)—— 阶乘的极简实现
使用 reduce # 比如计算 9 的阶乘 >> reduce(lambda x, y: x*y, range(1, 9+1)) 362880 当然这里的 reduce 直接返回具体的数 ...
- 区分json与jsonp
JSON(JavaScript Object Notation)和JSONP(JSON with Padding)虽然只有一个字母的差别,但其实他们根本不是一回事儿,下边简单区分概括一下: JSON是 ...
- POJ 3669 Meteor Shower BFS 水~
http://poj.org/problem?id=3669 题目大意: 一个人从(0,0)出发,这个地方会落下陨石,当陨石落在(x,y)时,会把(x,y)这个地方和相邻的的四个地方破坏掉,求该人到达 ...
- 程序员的困境 - R中国用户组-炼数成金
原文:http://www.oschina.net/news/43389/the-plight-of-programmer 在大型公司中不能腐蚀自己的学习能力和时间能力. 最近我为一个内核程序员的职位 ...
- uva 10710 - Chinese Shuffle(完美洗牌)
option=com_onlinejudge&Itemid=8&category=474&page=show_problem&problem=1651"> ...