bzoj 1941 Hide and Seek
题目大意:
n个点,求每个点到其最远点距离-到其最近点距离(除自己之外)的最小值
思路:
对于估计函数的理解还不够深刻
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
#define ll long long
#define inf 2139062143
#define MAXN 500100
#define MOD 998244353
#define rep(i,s,t) for(register int i=(s),i##__end=(t);i<=i##__end;++i)
#define dwn(i,s,t) for(register int i=(s),i##__end=(t);i>=i##__end;--i)
#define ren(x) for(register int i=fst[x];i;i=nxt[i])
#define pb(i,x) vec[i].push_back(x)
#define pls(a,b) (a+b)%MOD
#define mns(a,b) (a-b+MOD)%MOD
#define mul(a,b) (1LL*(a)*(b))%MOD
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int rt,n,Dim,ret1,ret2,ans;
struct node{int mx[],mn[],d[],l,r;}tr[MAXN],g;
bool operator < (const node a,const node b) {return a.d[Dim]<b.d[Dim];}
struct kd_tree
{
void upd(int k)
{
node gl=tr[tr[k].l],gr=tr[tr[k].r];
rep(i,,)
{
if(tr[k].l) tr[k].mn[i]=min(tr[k].mn[i],gl.mn[i]),tr[k].mx[i]=max(tr[k].mx[i],gl.mx[i]);
if(tr[k].r) tr[k].mn[i]=min(tr[k].mn[i],gr.mn[i]),tr[k].mx[i]=max(tr[k].mx[i],gr.mx[i]);
}
}
int build(int l,int r,int D)
{
int mid=l+r>>;Dim=D;nth_element(tr+l,tr+mid,tr+r+);
rep(i,,) tr[mid].mn[i]=tr[mid].mx[i]=tr[mid].d[i];
if(l<mid) tr[mid].l=build(l,mid-,D^);
if(mid<r) tr[mid].r=build(mid+,r,D^);
upd(mid);return mid;
}
int Get1(int k,int res=)
{
rep(i,,) res+=max(abs(g.d[i]-tr[k].mn[i]),abs(g.d[i]-tr[k].mx[i]));
return res;
}
int Get2(int k,int res=)
{
rep(i,,) res+=max(,tr[k].mn[i]-g.d[i]);
rep(i,,) res+=max(,g.d[i]-tr[k].mx[i]);return res;
}
int dis(int k,int res=) {rep(i,,) res+=abs(tr[k].d[i]-g.d[i]);return res;}
void query(int k)
{
int dl1=,dr1=,dl2=inf,dr2=inf;
ret1=max(ret1,dis(k));if(dis(k)) ret2=min(ret2,dis(k));
if(tr[k].l) dl1=Get1(tr[k].l),dl2=Get2(tr[k].l);
if(tr[k].r) dr1=Get1(tr[k].r),dr2=Get2(tr[k].r);
if(dl1>dr1)
{
if(dl1>ret1)
{
query(tr[k].l);
if(dr1>ret1||dr2<ret2) query(tr[k].r);
}else
{
if(dr2<ret2) query(tr[k].r);
if(dl2<ret2) query(tr[k].l);
}
}else
{
if(dr1>ret1)
{
query(tr[k].r);
if(dl1>ret1||dl2<ret2) query(tr[k].l);
}else
{
if(dl2<ret2) query(tr[k].l);
if(dr2<ret2) query(tr[k].r);
}
}
}
}kd;
int main()
{
n=read();rep(i,,n) tr[i].d[]=read(),tr[i].d[]=read();
rt=kd.build(,n,),ans=inf;
rep(i,,n)
{
g=tr[i],ret1=,ret2=inf;kd.query(rt);
ans=min(ans,ret1-ret2);
}
printf("%d\n",ans);
}
bzoj 1941 Hide and Seek的更多相关文章
- bzoj 1941 Hide and Seek —— K-D树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1941 曼哈顿最小距离估价:max( 0, t[x].mn[i] - v.p[i] ) + m ...
- BZOJ - 1941 Hide and Seek (kd树)
题目链接 kd树模板题,求二维空间上的最远点/最近点. 对所有点建立kd树,分别查询每个点即可.单次查询期望时间复杂度$O(logn)$ #include<bits/stdc++.h> u ...
- HDU 1941 Hide and Seek(离散化+树状数组)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1941 题意:给出平面上n个点,找出一点p,使得距离p最近和最远的点的距离之差最小.输出这 ...
- 【BZOJ】【1941】【SDOI2010】Hide and Seek
KD-Tree 一开始看错题了
- bzoj:1941: [Sdoi2010]Hide and Seek
1941: [Sdoi2010]Hide and Seek Time Limit: 16 Sec Memory Limit: 162 MBSubmit: 531 Solved: 295[Submi ...
- BZOJ 3402: [Usaco2009 Open]Hide and Seek 捉迷藏
题目 3402: [Usaco2009 Open]Hide and Seek 捉迷藏 Time Limit: 3 Sec Memory Limit: 128 MB Description 贝 ...
- 【BZOJ-1941】Hide and Seek KD-Tree
1941: [Sdoi2010]Hide and Seek Time Limit: 16 Sec Memory Limit: 162 MBSubmit: 830 Solved: 455[Submi ...
- 【BZOJ1941】Hide and Seek(KD-Tree)
[BZOJ1941]Hide and Seek(KD-Tree) 题面 BZOJ 洛谷 题解 \(KD-Tree\)对于每个点搜一下最近点和最远点就好了 #include<iostream> ...
- [BZOJ1941][Sdoi2010]Hide and Seek
[BZOJ1941][Sdoi2010]Hide and Seek 试题描述 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他 ...
随机推荐
- 2016 Multi-University Training Contest 5 solutions BY ZSTU
ATM Mechine E(i,j):存款的范围是[0,i],还可以被警告j次的期望值. E(i,j) = \(max_{k=1}^{i}{\frac{i-k+1}{i+1} * E(i-k,j)+\ ...
- 【收藏】SSH原理与运用
http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html http://www.ruanyifeng.com/blog/2011/12/ ...
- HDU 6035 (虚树)(统计颜色)
HDU 6035 Colorful Tree Problem : 给一棵树,每个结点有一种颜色,定义每条路径的权值为这条路径上颜色的种数,询问所有路径(C(n,2)条)的权值之和. Solution ...
- poj2689素数问题
打算重新刷一下数论题,忘了很多了,水平也很差,此题入手就不顺了,刷了一个早上,只是一个简单 的素数应用罢了.题意:找出区间长度不超过10^6的最近的素数和最远的素数(相邻的), 算法:数在int范围内 ...
- Meteor package.js
在本章中,我们将学习如何创建自己的 meteor 包. 创建包 让我们添加在桌面上的新文件夹用来创建新的包.使用命令提示符窗口执行如下命令. C:\Users\Administrator\Deskto ...
- java 配置时遇到的问题及解决办法
1. 最近JDK更新很频繁,以至于我安装时版本太多,选择也会出现问题 首先,确定你选择的是32位版本还是64位版本(貌似64位系统下也可以安装32位的JDK), 这个相当重要,因为这个会影响到ecli ...
- vs2010下配置CUDA出现kernel launch failed问题,内核无效
首先, 推荐一篇不错的配置文档~手把手教你 CUDA 5.5与VS2010编译环境的搭建.笔者就是在这篇文章的指导下成功地在VS2010上搭建了CUDA 6.5~ 其次. 文末给出的执行演示样例不好使 ...
- POJ 1927 Area in Triangle(计算几何)
Area in Triangle 博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/40707691 题目大意: 给你一个三角形的三 ...
- 2016/05/11 Thinkphp 3.2.2 验证码 使用 及校验
先新建一个公共控制器,用于放置验证码的实例化代码(不用新建控制器也行,任意公共控制器都可以). 例如:PublicController.class.php 4 5 6 7 8 9 10 11 12 1 ...
- iOS开发——高级篇——Runloop相关一
一.什么是runLoop 1.说白了,runloop就是运行循环 2.runloop,他是多线程的法宝 通常来讲,一个线程一次只能执行一个任务,执行完之后就退出线程.但是,对于主线程是不能退出的,因此 ...