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被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他 ...
随机推荐
- php对象(继承,多态)
/2.继承//function abc(){// $arr = func_get_args();//}//子类只能有一个父类 一个父类 可以有多个子类//override 重写//overlood 重 ...
- 生产环境下lnmp的权限说明
https://www.cnblogs.com/zrp2013/p/4183546.html 有关权限说明:-rwxrw-r‐-1 root root 1213 Feb 2 09:39 50.html ...
- Atlantis(hdu1542)
题意:求n个矩阵的面积并. /* 线段树维护扫描线 把每个矩形看成两条线段,从左到右添加线段,如果是矩形左边的线段,那就给线段所在的区间(y值)cover+1,反之则cover-1. 并且如果这条线段 ...
- CodeForces - 586D Phillip and Trains
这道题是一道搜索题 但是 如果没有读懂或者 或者拐过弯 就很麻烦 最多26个火车 那么每一个周期 (人走一次 车走一次) 就要更改地图 的状态 而且操作复杂 容易超时 出错 利用相对运动 计周期为 人 ...
- Error:Uninitialized object exists on backward branch 70 Exception Details:
网上下载了一个demo,编译出现如下错误: Gradle sync failed: Uninitialized object exists on backward branch 70 Exceptio ...
- 《TCP/IP详解卷1:协议》——第6章 ICMP:Internet控制报文协议(转载)
1.引言 ICMP被认为是IP层的一个组成部分,它传递差错报文以及其他需要注意的信息.ICMP报文通常被IP层或更高层协议(TCP或UDP)使用.一些ICMP报文把差错报文返回给用户进程. ICMP报 ...
- rabbitmq management Login Failed
默认用户guest 只允许localhost登录. so... 我们自己建立用户 1. 用户管理 用户管理包括增加用户,删除用户,查看用户列表,修改用户密码. 相应的命令 (1) 新增一个用户 rab ...
- Java重写equals方法和hashCode方法
package com.ddy; public class User { private Integer id; private String name; private St ...
- MongoDB 自己定义函数
定义 db.system.js.insert({ _id : "TestConcat", value : function TestConcat(s1, s2){ return s ...
- Coding Ninja 修炼笔记 (1)
大家好啊~我又回来了. 这次主要是给大家带来一些提升 Coding 效率的建议. 效率都是一点一滴优化出来的,虽然每一条建议给你带来的提升可能都不大,但是积累起来,仍然是一股不可忽视的力量. 第一条 ...