BZOJ2626: JZPFAR
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2626
题解:裸K-Dtree,最大值?自己yy一下估价函数就好了。
两题居然是同一个错误,真是too naive。。。
代码:
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#define inf 1ll<<62
#define maxn 200000+5
#define maxm 100000+5
#define eps 1e-10
#define ll double
#define pa pair<ll,int>
#define for0(i,n) for(int i=0;i<=(n);i++)
#define for1(i,n) for(int i=1;i<=(n);i++)
#define for2(i,x,y) for(int i=(x);i<=(y);i++)
#define for3(i,x,y) for(int i=(x);i>=(y);i--)
#define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
#define mod 1000000007
#define sqr(x) (x)*(x)
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
return x*f;
}
int n,m,cur;
priority_queue<pa,vector<pa>,greater<pa> >q;
struct rec
{
int mi[],mx[],d[],l,r,id;
int& operator [](int i){return d[i];}
}p[maxn],t[maxn],now;
bool operator <(rec a,rec b){return a[cur]<b[cur];}
inline void pushup(int k)
{
int l=t[k].l,r=t[k].r;
for0(i,)
{
t[k].mi[i]=min(t[k][i],min(t[l].mi[i],t[r].mi[i]));
t[k].mx[i]=max(t[k][i],max(t[l].mx[i],t[r].mx[i]));
}
}
inline int build(int l,int r,int dir)
{
int mid=(l+r)>>;
cur=dir;
nth_element(p+l,p+mid,p+r+);
t[mid]=p[mid];
for0(i,)t[mid].mi[i]=t[mid].mx[i]=t[mid][i];
t[mid].l=l>mid-?:build(l,mid-,dir^);
t[mid].r=mid+>r?:build(mid+,r,dir^);
pushup(mid);
return mid;
}
inline ll calc(int k)
{
if(!k)return -inf-;
ll ret=;
for0(i,)ret+=max((ll)sqr(now[i]-t[k].mi[i]),(ll)sqr(t[k].mx[i]-now[i]));
return ret;
}
inline ll dist(rec a,rec b){return (ll)sqr(a[]-b[])+(ll)sqr(a[]-b[]);}
inline void query(int k)
{
if(!k)return;
ll dl=calc(t[k].l),dr=calc(t[k].r),d=dist(t[k],now);
if(d>q.top().first||(d==q.top().first&&t[k].id<-q.top().second))q.pop(),q.push(pa(d,-t[k].id));
if(dl>dr)
{
if(dl>=q.top().first)query(t[k].l);
if(dr>=q.top().first)query(t[k].r);
}else
{
if(dr>=q.top().first)query(t[k].r);
if(dl>=q.top().first)query(t[k].l);
}
} int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
n=read();
for1(i,n)p[i][]=read(),p[i][]=read(),p[i].id=i;
for0(i,)t[].mi[i]=,t[].mx[i]=-;
int rt=build(,n,);
m=read();
while(m--)
{
now[]=read();now[]=read();int k=read();
while(!q.empty())q.pop();
for1(i,k)q.push(pa(-inf,));
query(rt);
printf("%d\n",-q.top().second);
}
return ;
}
BZOJ2626: JZPFAR的更多相关文章
- 【堆】【kd-tree】bzoj2626 JZPFAR
用堆记录答案.看看当前点是否比堆顶更优. #include<cstdio> #include<queue> #include<cstring> #include&l ...
- Kd-tree题表
bzoj1941: [Sdoi2010]Hide and Seekbzoj2626: JZPFARbzoj4520: [Cqoi2016]K远点对bzoj2989: 数列bzoj2850: 巧克力王国 ...
- 【BZOJ2626】JZPFAR kd-tree+堆
[BZOJ2626]JZPFAR Description 平面上有n个点.现在有m次询问,每次给定一个点(px, py)和一个整数k,输出n个点中离(px, py)的距离第k大的点的标号.如果有两个( ...
- BZOJ2154/BZOJ2693/Luogu1829 Crash的数字表格/JZPFAR 莫比乌斯反演
传送门--Luogu 传送门--BZOJ2154 BZOJ2693是权限题 其中JZPFAR是多组询问,Crash的数字表格是单组询问 先推式子(默认\(N \leq M\),所有分数下取整) \(\ ...
- 【BZOJ】【2626】JZPFAR
KD-Tree 0.0找第k大…… 裸KD-Tree……跟之前那道找最近的k个点大同小异 一开始理解错:第K大是第K远……不是第K近……(Tunix你个sb 感觉容易出错的是0号点= =边界情况需要仔 ...
- [国家集训队2012]JZPFAR
[国家集训队2012]JZPFAR 题目 平面上有n个点.现在有m次询问,每次给定一个点(px, py)和一个整数k,输出n个点中离(px, py)的距离第k大的点的标号.如果有两个(或多个)点距离( ...
- BZOJ 2626 JZPFAR(KD-tree)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2626 题意:平面上有n个点.现在有m次询问,每次给定一个点(px, py)和一个整数k, ...
- [国家集训队]JZPFAR
嘟嘟嘟 k-d tree模板之二:查询第k大距离.(所以是怎么上黑的) 因为k-d tree的查询就是暴力嘛,所以我就想到了一个很暴力的做法:每一次查询用一个长度为k的优先队列维护.按距离递增,编号递 ...
- 解题:洛谷2093 JZPFAR
题面 初见K-D Tree 其实这样的题(欧几里得距离第$x$近点对)不应该用K-D Tree做,因为会被构造数据卡成$O(n^2)$,随机的另说. 但是并没有找到合适的K-D Tree的题(区域统计 ...
随机推荐
- android退出登陆后,清空之前所有的activity,进入登陆主界面
如题: android退出登陆后,清空之前所有的activity,进入登陆主界面 在退出登陆时只需要增加一个intent标志 Intent intent_login = new Intent(); i ...
- 所有的代码生成器都是浮云,如果可以用aspx文件作为模板
首先申明:标题中的如果是可以去掉的. 想写这篇文章很长时间了,一来是跟大家分享一下,别浪费时间在写代码生成器上面了,什么CodeSmith,XXCodeGenerator等等,都是浮云:二来想跟大家交 ...
- MST性质(用于构造最小生成树)
描述:假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集.若(u,v)是一条具有最小权值(代价)的边,其中u∈U,v∈V-U,则必存在一棵包含边(u,v)的最小生成树. 证明: 假设网N的 ...
- 剑指offer--面试题19
题目:求二叉树镜像 根据作者思路,自己所写代码如下: void BinaryTreeMirror(BinaryTreeNode* pRoot) { if(pRoot == NULL) return; ...
- linux使用:vi编辑器
初学linux,目前是概念多于操作,所以记录下一些操作: 编辑某个文件():vi 文件名 编辑后保存退出::wq 编辑后不保存退出: :q! 参数:-R 只读模式 -x 文件加密(vim命令下使用) ...
- AngularJS 基础
1. AngularJs 是一个JS 框架,是一种基于MVC的设计模式 2. script 需引用 <script src="angular.min.js">,安装包 ...
- ios开发之网络数据的下载与上传
要实现网络数据的下载与上传,主要有三种方式 > NSURLConnection 针对少量数据,使用“GET”或“POST”方法从服务器获取数据,使用“POST”方法向服务器传输数据; > ...
- 【锋利的JQuery-学习笔记】菜单栏及其2级菜单
效果图: 鼠标移动到菜单项后如下: html: <div id="nav" class="mainNav"> <ul class=" ...
- Linux下SVN的一些使用方法总结
Linux下SVN的一些使用方法总结 近期的一个项目不方便 Check 到本地,需要在测试服务器上进行编写和测试,所以就研究了一下如何在 Linux 命令行下使用 SVN. 首先 svn help ...
- TopCoder 649 div1 & div2
最近一场TC,做得是在是烂,不过最后challenge阶段用一个随机数据cha了一个明显错误的代码,最后免于暴跌rating,还涨了一点.TC题目质量还是很高的,非常锻炼思维,拓展做题的视野,老老实实 ...