【kd-tree】hdu5992 Finding Hotels
比较裸的kd-tree,但是比较考验剪枝。
貌似除了经典的矩形距离剪枝之外,
还必须加个剪枝是某个矩形内的最小价格如果大于价格限制的话,则剪枝。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 200010
#define EPS 0.00000001
#define INF 1000000000000000007.0
#define KD 2
struct data{
int x,y,v;
double d;
int id;
data(const int &_x,const int &_y,const int &_v,const double &_d,const int &_id){
x=_x; y=_y; v=_v; d=_d; id=_id;
}
data(){}
}ans;
bool operator < (const data &a,const data &b){
if(fabs(a.d-b.d)>=EPS){
return a.d-b.d<-EPS;
}
return a.id<b.id;
}
int qp[KD],qv;
int n,root;
bool dn;
double sqr(int x)
{
return (double)x*(double)x;
}
int Abs(int x)
{
return x<0 ? (-x) : x;
}
struct Node
{
int minn[KD],maxx[KD],p[KD],v,id,minv;
int ch[2];
void Init()
{
for(int i=0;i<KD;++i)
minn[i]=maxx[i]=p[i];
minv=v;
ch[0]=ch[1]=0;
}
bool CheckIn()
{
for(int i=0;i<KD;++i)
if(!(minn[i]<=qp[i] && qp[i]<=maxx[i]))
return 0;
return 1;
}
int Dis()
{
if(CheckIn()){
return 0;
}
int res=2147483647;
res=min(res,Abs(minn[0]-qp[0]));
res=min(res,Abs(maxx[0]-qp[0]));
res=min(res,Abs(minn[1]-qp[1]));
res=min(res,Abs(maxx[1]-qp[1]));
return res;
}
}T[N<<1];
void Update(int rt)
{
for(int i=0;i<2;++i){
if(T[rt].ch[i]){
for(int j=0;j<KD;++j){
T[rt].minn[j]=min(T[rt].minn[j],T[T[rt].ch[i]].minn[j]);
T[rt].maxx[j]=max(T[rt].maxx[j],T[T[rt].ch[i]].maxx[j]);
}
T[rt].minv=min(T[rt].minv,T[T[rt].ch[i]].minv);
}
}
}
bool operator < (const Node &a,const Node &b)
{
return a.p[dn]!=b.p[dn] ? a.p[dn]<b.p[dn] : a.p[dn^1]<b.p[dn^1];
}
int Buildtree(int l=1,int r=n,bool d=0)
{
dn=d;
int m=(l+r>>1);
nth_element(T+l,T+m,T+r+1);
T[m].Init();
if(l!=m) T[m].ch[0]=Buildtree(l,m-1,d^1);
if(m!=r) T[m].ch[1]=Buildtree(m+1,r,d^1);
Update(m);
return m;
}
double Dis(int a[],int b[])
{
return sqrt(sqr(a[0]-b[0])+sqr(a[1]-b[1]));
}
void Query(int rt=root)
{
if(T[rt].v<=qv){
ans=min(ans,data(T[rt].p[0],T[rt].p[1],T[rt].v,Dis(T[rt].p,qp),T[rt].id));
}
int dd[2];
for(int i=0;i<2;i++)
if(T[rt].ch[i])
dd[i]=T[T[rt].ch[i]].Dis();
else dd[i]=2147483647;
bool f=(dd[0]<=dd[1]);
if(T[T[rt].ch[!f]].minv<=qv && (double)dd[!f]-ans.d<(-EPS)) Query(T[rt].ch[!f]);
if(T[T[rt].ch[f]].minv<=qv && (double)dd[f]-ans.d<(-EPS)) Query(T[rt].ch[f]);
}
int Zu,m;
int main()
{
// freopen("k.in","r",stdin);
scanf("%d",&Zu);
for(int zu=1;zu<=Zu;++zu){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%d%d%d",&T[i].p[0],&T[i].p[1],&T[i].v);
T[i].id=i;
}
root=(1+n>>1);
Buildtree();
for(int i=1;i<=m;++i){
ans.d=INF;
scanf("%d%d%d",&qp[0],&qp[1],&qv);
Query();
printf("%d %d %d\n",ans.x,ans.y,ans.v);
}
}
return 0;
}
【kd-tree】hdu5992 Finding Hotels的更多相关文章
- HDU5992 - Finding Hotels
原题链接 Description 给出个二维平面上的点,每个点有权值.次询问,求所有权值小于等于的点中,距离坐标的欧几里得距离最小的点.如果有多个满足条件的点,输出最靠前的一个. Solution 拿 ...
- hdu-5992 Finding Hotels(kd-tree)
题目链接: Finding Hotels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/ ...
- 【POJ 3740】 Easy Finding
[题目链接] http://poj.org/problem?id=3740 [算法] Dancing Links算法解精确覆盖问题 详见这篇文章 : https://www.cnblogs.com/g ...
- 【HDU5992】Finding Hotels 【KD树】
题意 给出n个酒店的坐标和价格,然后m个查询,每个查询给出一个人的坐标和能承受的最大价格,然后找出在他价格承受范围以内,距离他最近的宾馆,如果有多个,那么输出第一个 分析 kd树的模板题 #inclu ...
- 【Symmetric Tree】cpp
题目: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). F ...
- 【Same Tree】cpp
题目: Given two binary trees, write a function to check if they are equal or not. Two binary trees are ...
- 【LSGDOJ1834 Tree】树链剖分
题目描述 给定一个N个结点的无向树,树中的结点按照1...N编号,树中的边按照1...N − 1编号,每条边都赋予一个权值.你需要编写程序支持以下三种操作: 1. CHANGE i v:将i号边 ...
- 【BZOJ4154】Generating Synergy【kd树】
题意 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 分析 我们以dfs序为横坐标,深度为纵坐标,建kd树.我们每次更新,都是在kd树中更 ...
- 【BZOJ3489】A simple rmq problem【kd树】
题意 给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直接输出0.我会采取一些措施强制在线. 分析 预处理 ...
随机推荐
- 用tkinter实现的gui小工具
import tkinter import requests import json from tkinter import * class FindLocation(object): def __i ...
- linux内核网络接收数据流程图【转】
转自:http://blog.chinaunix.net/uid-23069658-id-3141409.html 4.3 数据接收流程图 各层主要函数以及位置功能说明: 1)s ...
- 1438. Shopaholic
Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description Lindsay is a shopaholic. Whenever th ...
- docker配置桥接网络
[root@localhost ~]# cd /etc/sysconfig/network-scripts/ [root@localhost network-scripts]# cp ifcfg-et ...
- 学习1:python输入输出
1. 输出 >>> print "hello world" hello world >>> print 'hello world' hello ...
- FineReport——登录不到决策系统
在不断的测试过程中,可能会造成缓存数据的累积,所以在登录过程中可能会出现登录不到决策系统,而是跳转到某一模板页面 解决方法就是清理缓存或者换一个浏览器测试.
- ReentrantLock 分析
带着疑问去分析 ReentrantLock是如何实现锁管理的. ReentrantLock是如何实现重入的. ReentrantLock是如何实现公平锁与非公平锁. ReentantLock的公平锁为 ...
- Flash中的注册点和中心点
用一句话概括注册点和中心点的作用,那就是:注册点用来定位,中心点用来变形 当然,这句话不是非常准确,只是暂时先这么理解,下面会详细讲解. 认识注册点 每个元件都有一个注册点.在元件编辑窗口.或在舞台中 ...
- mysql-备份及关联python
阅读目录 IDE工具介绍 MySQL数据库备份 mysqldump实现逻辑备份 回复逻辑备份 备份/恢复案例 自动化备份 表的导出和导入 数据库迁移 pymysql模块 一 链接.执行sql.关闭(游 ...
- Single Number I&& II——还没看,倒过头来再看
Single Number I Given an array of integers, every element appears twice except for one. Find that si ...