[NOI2019]弹跳(KD-Tree)
被jump送退役了,很生气。
不过切了这题也进不了队,行吧。
退役后写了一下,看到二维平面应该就是KD树,然后可以在KD树上做最短路,然后建立堆和KDTree。然后每次更新则是直接把最短路上的节点删掉,然后合并KDTree
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+,M=15e5+;
struct point{int w,l,r,u,d;}p[N];
struct node{int u,d;};
vector<int>G[N];
int n,m,W,H,now,dis,cnt,rt,tot,hd[N],v[M],nxt[M],w[M],vis[N],d[N],ch[N][];
bool operator<(node x,node y){return x.d>y.d;}
priority_queue<node>q;
void adde(int x,int y,int z){v[++cnt]=y,nxt[cnt]=hd[x],w[cnt]=z,hd[x]=cnt;}
void add(int fa,int&o,int xl,int xr,int yl,int yr,int x,int y)
{
if(x<xl||x>xr||y<yl||y>yr)return;
if(!o)o=++tot;
if(o!=rt)adde(fa+n,o+n,);
if(xl==xr&&yl==yr){adde(o+n,now,);return;}
int xm=xl+xr>>,ym=yl+yr>>;
add(o,ch[o][],xl,xm,yl,ym,x,y);
add(o,ch[o][],xl,xm,ym+,yr,x,y);
add(o,ch[o][],xm+,xr,yl,ym,x,y);
add(o,ch[o][],xm+,xr,ym+,yr,x,y);
}
void link(int o,int xl,int xr,int yl,int yr,int xL,int xR,int yL,int yR)
{
if(!o||xR<xl||xL>xr||yR<yl||yL>yr||d[o+n]<=dis)return;
if(xl>=xL&&xr<=xR&&yl>=yL&&yr<=yR){d[o+n]=dis,q.push((node){o+n,d[o+n]});return;}
int xm=xl+xr>>,ym=yl+yr>>;
link(ch[o][],xl,xm,yl,ym,xL,xR,yL,yR);
link(ch[o][],xl,xm,ym+,yr,xL,xR,yL,yR);
link(ch[o][],xm+,xr,yl,ym,xL,xR,yL,yR);
link(ch[o][],xm+,xr,ym+,yr,xL,xR,yL,yR);
}
int main()
{
scanf("%d%d%d%d",&n,&m,&W,&H);
for(int i=,x,y;i<=n;i++)scanf("%d%d",&x,&y),now=i,add(,rt,,W,,H,x,y);
for(int i=;i<=m;i++)
scanf("%d%d%d%d%d%d",&now,&p[i].w,&p[i].l,&p[i].r,&p[i].u,&p[i].d),G[now].push_back(i);
memset(d,,sizeof d);
d[]=,q.push((node){,});
while(!q.empty())
{
int u=q.top().u;q.pop();
if(vis[u])continue;
vis[u]=;
for(int i=,x;i<G[u].size();i++)
x=G[u][i],dis=d[u]+p[x].w,link(rt,,W,,H,p[x].l,p[x].r,p[x].u,p[x].d);
for(int i=hd[u];i;i=nxt[i])if(d[v[i]]>d[u]+w[i])q.push((node){v[i],d[v[i]]=d[u]+w[i]});
}
for(int i=;i<=n;i++)printf("%d\n",d[i]);
}
[NOI2019]弹跳(KD-Tree)的更多相关文章
- K-D Tree学习笔记
用途 做各种二维三维四维偏序等等. 代替空间巨大的树套树. 数据较弱的时候水分. 思想 我们发现平衡树这种东西功能强大,然而只能做一维上的询问修改,显得美中不足. 于是我们尝试用平衡树的这种二叉树结构 ...
- AOJ DSL_2_C Range Search (kD Tree)
Range Search (kD Tree) The range search problem consists of a set of attributed records S to determi ...
- k-d tree 学习笔记
以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...
- 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2459 Solved: 834[Submit][Status][Discu ...
- K-D Tree
这篇随笔是对Wikipedia上k-d tree词条的摘录, 我认为解释得相当生动详细, 是一篇不可多得的好文. Overview A \(k\)-d tree (short for \(k\)-di ...
- K-D Tree题目泛做(CXJ第二轮)
题目1: BZOJ 2716 题目大意:给出N个二维平面上的点,M个操作,分为插入一个新点和询问到一个点最近点的Manhatan距离是多少. 算法讨论: K-D Tree 裸题,有插入操作. #inc ...
- k-d Tree in TripAdvisor
Today, TripAdvisor held a tech talk in Columbia University. The topic is about k-d Tree implemented ...
- k-d tree算法
k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点匹配的时候就会利用到k ...
- k-d tree模板练习
1. [BZOJ]1941: [Sdoi2010]Hide and Seek 题目大意:给出n个二维平面上的点,一个点的权值是它到其他点的最长距离减最短距离,距离为曼哈顿距离,求最小权值.(n< ...
- [模板] K-D Tree
K-D Tree K-D Tree可以看作二叉搜索树的高维推广, 它的第 \(k\) 层以所有点的第 \(k\) 维作为关键字对点做出划分. 为了保证划分均匀, 可以以第 \(k\) 维排名在中间的节 ...
随机推荐
- XmlBeanDefinitionReader
- 使用JS写一个计算器
先上效果图: 简单的加减乘除功能还是有的,所以我们就考虑怎么来实现这个功能. 根据预期效果,可以确定页面中的布局要用到table tr td. 所以先放上页面布局,table的边框宽度border,c ...
- HDU3306-Another kind of Fibonacci(矩阵构造)
Another kind of Fibonacci Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- 04.Delphi通过接口IInterface实现多重继承
IInterface表示申明了一些函数,自己本身没有实现部分,需要由继承它的类来实现函数 uSayHello代码如下 unit uSayHello; interface uses SysUtils, ...
- 7.1 Varnish VCL
根据以上的配置增加集群,修改default.vcl # This ) # man page for details on VCL syntax and semantics. # # Default b ...
- hadoop 配置问题以及HDFS下如何读写文件
辛辛苦苦学两年 ,一举回到解放前!!! 大数据开始学真的头疼 关键是linux你玩的不6 唉难受 hadoop 配置参见博客 http://dblab.xmu.edu.cn/blog/install- ...
- Centos7安装mysql5.7.21
1.卸载系统自带的 MariaDB [root@CentOS ~]# rpm -qa | grep mariadb mariadb-libs--.el7.x86_64 [root@CentOS ~]# ...
- HDU - 6205 card card card (尺取法)
题意:有n堆牌,ai表示每堆牌的牌数,bi表示每堆牌的penaltyvalue,操作开始前,可以重复进行将第一堆牌挪到最后一堆这一操作.然后,对于挪完后的牌,从第一堆开始,依次取.对于每一堆牌,首先将 ...
- python面试题整理(二)
1.进程,线程,协程定义,有什么区别 进程是操作系统分配资源的最小单位,一个进程对应一块CPU 线程是进程中的某一个控制单元,是CPU调度的最小单元,线程之间相互独立,进程结束线程也会结束,一个进程至 ...
- mitmproxy(TLS错误)
一.原来的基础上添加代码 """ This inline script allows conditional TLS Interception based on a us ...