[NOI2019] 弹跳
题意:
给你平面上的$n$个点,共有$m$个弹跳装置。
每个弹跳装置可以从点$p_{i}$以$t_{i}$的代价跳到矩形$(L_{i},D_{i}),(R_{i},U_{i})$中的任何一个点。
现在请你对于每座城市求出从1号点跳到它的最小代价。
$n\leq 70000,m\leq 150000$。
题解:不把边建出来的$KD-tree$优化建图。
看一眼就知道$KD-tree$优化建图,但如果把所有边都建出来就爆炸了。
设原图上的点是实点,$KD-tree$上的点(代表一个实点和一个矩形)是虚点。
那么在$Dijkstra$到每个点的时候:
- 若是实点,在$KD-tree$上查找能连的虚点/实点并向其连带权边。
- 若是虚点,向它的两个儿子和它对应的实点连权为0的边。
时间复杂度$O(m\sqrt{n})$,空间复杂度$O(m\sqrt{n})$(实际上只有优先队列可能达到这个空间,其他都是$O(n)$)。
没了。不知道为什么有人写线段树。
代码:
#include<bits/stdc++.h>
#define maxn 200005
#define maxm 500005
#define inf 0x7fffffff
#define ll long long
#define rint register int
#define debug(x) cerr<<#x<<": "<<x<<endl
#define fgx cerr<<"--------------"<<endl
#define dgx cerr<<"=============="<<endl using namespace std;
struct Point{int x[],iid;}p[maxn];
int mx[maxn][],mn[maxn][],id[maxn],ls[maxn],rs[maxn];
int tot,np,dis[maxn<<],vis[maxn<<],tim[maxn];
int L[maxn],R[maxn],D[maxn],U[maxn];
struct node{int u,d;bool operator<(const node &b)const{return d>b.d;}};
priority_queue<node> q; vector<int> vc[maxn]; inline int read(){
int x=,f=; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
} inline node md(int u,int d){node res;res.u=u,res.d=d;return res;}
inline void upd(int u,int v){if(dis[u]>v){dis[u]=v,q.push(md(u,v));}}
inline bool ok(int xa,int ya,int xb,int yb){return xb<=xa&&ya<=yb;}
inline bool cmp(Point a,Point b){return (!np)?(a.x[]<b.x[]):(a.x[]<b.x[]);}
inline void pushup(int k){
for(rint i=;i<;i++){
mx[k][i]=mn[k][i]=p[id[k]].x[i];
if(ls[k]) mx[k][i]=max(mx[k][i],mx[ls[k]][i]),mn[k][i]=min(mn[k][i],mn[ls[k]][i]);
if(rs[k]) mx[k][i]=max(mx[k][i],mx[rs[k]][i]),mn[k][i]=min(mn[k][i],mn[rs[k]][i]);
}
}
inline int build(int l,int r,int type){
if(l>r) return ;
int mid=l+r>>,k=++tot;
id[k]=mid,np=type;
nth_element(p+l,p+mid,p+r+,cmp);
ls[k]=build(l,mid-,type^);
rs[k]=build(mid+,r,type^);
pushup(k); return k;
}
inline void add(int l,int r,int d,int u,int c,int k){
if(mx[k][]<l || mn[k][]>r || mx[k][]<d || mn[k][]>u) return;
if(ok(mn[k][],mx[k][],l,r)&&ok(mn[k][],mx[k][],d,u)){upd(k,c);return;}
if(ok(p[id[k]].x[],p[id[k]].x[],l,r)&&ok(p[id[k]].x[],p[id[k]].x[],d,u)) upd(p[id[k]].iid,c);
if(ls[k]) add(l,r,d,u,c,ls[k]); if(rs[k]) add(l,r,d,u,c,rs[k]);
} inline void Dijkstra(int s,int n){
memset(vis,,sizeof(vis));
memset(dis,,sizeof(dis));
dis[s]=,q.push(md(s,));
while(!q.empty()){
rint u=q.top().u; q.pop();
if(vis[u]) continue; vis[u]=;
if(u<=n) for(rint i=;i<vc[u].size();i++)
add(L[vc[u][i]],R[vc[u][i]],D[vc[u][i]],U[vc[u][i]],dis[u]+tim[vc[u][i]],n+);
else upd(p[id[u]].iid,dis[u]),upd(ls[u],dis[u]),upd(rs[u],dis[u]);
}
} int main(){
freopen("jump.in","r",stdin);
freopen("jump.out","w",stdout);
int n=read(),m=read(),w=read(),h=read();
for(rint i=;i<=n;i++)
p[i].x[]=read(),p[i].x[]=read(),p[i].iid=i;
tot=n,build(,n,);
for(rint i=;i<=m;i++){
int p=read();tim[i]=read();
L[i]=read(),R[i]=read();
D[i]=read(),U[i]=read();
vc[p].push_back(i);
}
Dijkstra(,n);
for(rint i=;i<=n;i++) printf("%d\n",dis[i]);
return ;
}
D2T1
[NOI2019] 弹跳的更多相关文章
- 【题解】Luogu P5471 [NOI2019]弹跳
原题传送门 先考虑部分分做法: subtask1: 暴力\(O(nm)\)枚举,跑最短路 subtask2: 吧一行的点压到vector中并排序,二分查找每一个弹跳装置珂以到达的城市,跑最短路 sub ...
- 洛谷 P5471 - [NOI2019] 弹跳(二维线段树优化建图+堆优化存边)
题面传送门 一道非常有意思的题(大概可以这么形容?) 首先看到这类一个点想一个区域内连边的题目可以很自然地想到线段树优化建图,只不过这道题是二维的,因此需要使用二维线段树优化建图,具体来说,我们外层开 ...
- [NOI2019]弹跳(KD-Tree/四分树/线段树套平衡树 优化建图+Dijkstra)
本题可以用的方法很多,除去以下三种我所知道的就还有至少三种. 方法一:类似线段树优化建图,将一个平面等分成四份(若只有一行或一列则等分成两份),然后跑Dijkstra即可.建树是$O(n\log n) ...
- luogu P5471 [NOI2019]弹跳
luogu 因为是一个点向矩形区域连边,所以可以二维数据结构优化连边,但是会MLE.关于维护矩形的数据结构还有\(KD-Tree\),所以考虑\(KDT\)优化连边,空间复杂度\(m\sqrt n\) ...
- luogu 5471 [NOI2019]弹跳 KDtree + Dijkstra
题目链接 第一眼就是 $KDtree$ 优化建图然而,空间只有 $128mb$,开不下 时间不吃紧,考虑直接跑 $Dijkstra$ $Dijkstra$ 中存储的是起点到每个输入时给出的矩阵的最 ...
- p5471 [NOI2019]弹跳
分析 代码 #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define ...
- [NOI2019]弹跳(KD-Tree)
被jump送退役了,很生气. 不过切了这题也进不了队,行吧. 退役后写了一下,看到二维平面应该就是KD树,然后可以在KD树上做最短路,然后建立堆和KDTree.然后每次更新则是直接把最短路上的节点删掉 ...
- 题解 [NOI2019]弹跳
题目传送门 题目大意 给出 \(n\) 做城市,每座城市都有横纵坐标 \(x,y\).现在给出 \(m\) 个限制 \(p,t,l,r,d,u\),表示从 \(p\) 城市出发,可以花费 \(t\) ...
- 【NOI2019】弹跳(KDT优化建图)
Description 平面上有 \(n\) 个点,分布在 \(w \times h\) 的网格上.有 \(m\) 个弹跳装置,由一个六元组描述.第 \(i\) 个装置有参数:\((p_i, t_i, ...
随机推荐
- CTF必备技能丨Linux Pwn入门教程——ROP技术(下)
Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...
- 为什么重复的GET请求变慢了?
最近在研究慢请求监控的问题,写了一个简单的测试代码:在网页端(index.html)通过fetch函数向服务端获取数据,然后打印请求耗时. function requestData() { let s ...
- 爬虫---Beautiful Soup 反反爬虫事例
前两章简单的讲了Beautiful Soup的用法,在爬虫的过程中相信都遇到过一些反爬虫,如何跳过这些反爬虫呢?今天通过知乎网写一个简单的反爬中 什么是反爬虫 简单的说就是使用任何技术手段,阻止别人批 ...
- SQLserver 《深入分析sqlserver 2008》
PDF版本: 链接:https://pan.baidu.com/s/1bheII-EdyleVJaR5r9lT9Q 提取码:f8zz
- python cookie登录DVWA,phpstudy搭建DVWA参考https://www.jianshu.com/p/97d874548300
import requestsheader={"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleW ...
- django settings实现原理及自定义项目settings配置
基于django 中的settings实现原理,实现自己项目配置文件的可插拔式设计 ##首先说一下django中settings.py中的实现原理 ''' 应该明确一点,django暴露给用户一个自定 ...
- 微信小程序 - Request | 路由跳转 | 本地存储
Request 官方文档 wx.request相当于发送ajax请求 参数 属性 类型 默认值 必填 说明 url string 是 开发者服务器接口地址 data string/object/A ...
- 5 Ways AI is Transforming the Finance Industry
https://marutitech.com/ways-ai-transforming-finance/ As global technology has evolved over the years ...
- JDOJ 1946 求最长不下降子序列个数
Description 设有一个整数的序列:b1,b2,…,bn,对于下标i1<i2<…<im,若有bi1≤bi2≤…≤bim 则称存在一个长度为m的不下降序列. 现在有n个数,请你 ...
- python 并行处理数据
来源:https://blog.csdn.net/weixin_42001089/article/details/88843152 import multiprocessing import time ...