博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1941[Sdoi2010]Hide and Seek
阅读量:6760 次
发布时间:2019-06-26

本文共 1615 字,大约阅读时间需要 5 分钟。

题意:

平面上n个点,求一个点使得离它最近的点和最远的点离它的曼哈顿距离差最小(若选的点处已有点,则改点不算)。n≤500000

题解:

第一次写kd树,感觉眼睛又瞎了(玄学复杂度)。首先先把所有点横坐标和纵坐标轮流为关键字排序建一个平衡树,维护每棵子树里的横纵坐标最大最小值。在树上查询时就启发式搜索,比如说正在查询里某点最远的点,则如果当前子树的横纵坐标最大最小值与某点的曼哈顿距离小于答案,就返回,否则对左右子树估价,那边越可能得到最优解就先往哪边走。这么暴力的操作,却可以证明,单次查询均摊复杂度为O(sqrt(n))。好神奇(不过常数应该不小)。

对应于本题,先将所有点建成kd树,然后有奇怪性质:所求点一定是这些点中的一个,所以枚举所有点,查询离这个点最远最近的点的与它的曼哈顿距离差,寻找最小的一个输出。估价函数具体见代码,注意求最远点和求最近点的估价函数不一样。

代码:

1 #include 
2 #include
3 #include
4 #define inc(i,j,k) for(int i=j;i<=k;i++) 5 #define maxn 500010 6 #define INF 0x3fffffff 7 using namespace std; 8 9 inline int read(){10 char ch=getchar(); int f=1,x=0;11 while(ch<'0'||ch>'9'){
if(ch=='-')f=-1; ch=getchar();}12 while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();13 return f*x;14 }15 int n,f,rt,mxans,mnans;16 struct p{
int pos[2]; bool operator < (const p &a)const{
return pos[f]
>1; nth_element(ps+l,ps+mid,ps+r+1);31 inc(i,0,1)nds[mid].mx[i]=nds[mid].mn[i]=ps[mid].pos[i]; nds[mid].pos=ps[mid];32 if(l
dr){45 if(mxans
dl)querymin(nds[x].lc,a); if(mnans>dr)querymin(nds[x].rc,a);55 }else{56 if(mnans>dr)querymin(nds[x].rc,a); if(mnans>dl)querymin(nds[x].lc,a);57 }58 }59 int query(p a){60 mxans=0; querymax(rt,a); mnans=INF; querymin(rt,a); return mxans-mnans;61 }62 int main(){63 n=read(); inc(i,1,n)ps[i].pos[0]=read(),ps[i].pos[1]=read(); rt=build(1,n,0);64 int ans=INF; inc(i,1,n)ans=min(ans,query(ps[i])); printf("%d",ans); return 0;65 }

 

20160906

转载于:https://www.cnblogs.com/YuanZiming/p/5861859.html

你可能感兴趣的文章
C#中为什么需要装箱拆箱操作?
查看>>
PHP类中一般方法与静态方法的疑问
查看>>
[转]PHP花括号变量
查看>>
【Opencv学习】摄像头采集、录像、截图小工具
查看>>
Fedora16安装中文语言包和中文输入法
查看>>
Windows 8实用窍门系列:14.windows 8中粘贴板(剪切板)的使用
查看>>
长连接API小心“窜包”问题
查看>>
开发者基础知识游戏,共10关,欢迎挑战
查看>>
ASP.NET中 RadioButtonList(单选按钮组)的使用
查看>>
SESSION 丢失
查看>>
DES可逆加解密
查看>>
图解Undo原理
查看>>
Kinect for Windows SDK V1.7 发布
查看>>
JAVA中的参数按值传递与按引用传递
查看>>
与Recommender System相关的会议及期刊
查看>>
如何理解ip路由和操作linux的路由表
查看>>
WCF的几种寄宿方式 ( 转)
查看>>
数字数据fzu 2120 数字排列
查看>>
ORACLE 数据库 SQL 转换 只取 年和月
查看>>
区间查询[2009国家集训队]小Z的袜子(hose)
查看>>