[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\) 维排名在中间的节 ...
随机推荐
- nested exception is javax.management.InstanceAlreadyExistsException: webservice:name=statFilter,type=StatFilter
Caused by: org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [ ...
- XmlBeanDefinitionReader
- 【C】揭秘rand()函数;
原文地址:http://www.cnblogs.com/ngnetboy/archive/2012/11/23/2784078.html 相信只要是程序猿都会知道rand()函数是用来取随机数的一个库 ...
- Python 3.8 新功能【新手必学】
Python 3.8 是 Python 编程语言的最新主要版本, 它包含许多新功能和优化. Python 3.8 Python 3.8 的一些新功能包括: 1. 海象运算符 PS:很多人 ...
- springboot 中单机 redis 实现分布式锁
在微服务中经常需要使用分布式锁,来执行一些任务.例如定期删除过期数据,在多个服务中只需要一个去执行即可. 以下说明非严格意义的分布式锁,因为 redis 实现严格意义的分布式锁还是比较复杂的,对于日常 ...
- C# 控件缩写规范
标准控件缩写规范 类 型 前 缀 示 例 Adrotator adrt adrtTopAd BulletedList blst blstCity Button btn btnSubmit Calend ...
- 吴裕雄--天生自然java开发常用类库学习笔记:同步与死锁
class MyThread implements Runnable{ private int ticket = 5 ; // 假设一共有5张票 public void run(){ for(int ...
- Problem I: Ingenious Lottery Tickets
Problem I: Ingenious Lottery Tickets Your friend Superstitious Stanley is always getting himself int ...
- MAC设置允许任何来源
在升级了macOS Sierra (10.12)版本后在“安全性与隐私”中不再有“任何来源”选项 接下来,我们就打开终端,然后输入以下命令: sudo spctl --master-disable 输 ...
- python学习笔记2018-9-17
1.print("{0:^30}\n{1:^30}\n{1:10}".format("age","name")) {0:^30}中的0是一个 ...