luogu P5471 [NOI2019]弹跳
因为是一个点向矩形区域连边,所以可以二维数据结构优化连边,但是会MLE.关于维护矩形的数据结构还有\(KD-Tree\),所以考虑\(KDT\)优化连边,空间复杂度\(m\sqrt n\),无法通过
进一步的,一条题目中的边会对若干\(KDT\)上的点连边,然后这些点的子树被此点更新.考虑\(dijkstra\)的过程,每次拿出\(dis\)最小的点,并更新其他点,并且可以发现如果其他点被当前最小的\(dis_x+w_i\)更新到就不能再被更新了,那么我们可以每次取出最小的\(dis_x+w_i\),然后暴力更新\(x\)对应的一些点以及其子树,再把他们删掉,这样点扩展以及被删的总次数都是\(O(n)\)次,所以可以做到空间\(O(n)\),时间\(O(mlogn+m\sqrt n)\)
#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double
using namespace std;
const int N=70000+10,M=150000+10,inf=2109876543;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int n,m,di[N],ii=0,e[M][5];
bool cmp(int aa,int bb){return e[aa][0]<e[bb][0];}
vector<int> ee[N];
vector<int>::iterator it[N];
struct node
{
int x[2],i;
bool operator < (const node &bb) const {return x[ii]!=bb.x[ii]?x[ii]<bb.x[ii]:x[ii^1]<bb.x[ii^1];}
}a[N],b[N];
int lx[N],rx[N],ly[N],ry[N],fa[N],sz[N],ch[N][2],rt;
bool ban[N];
int bui(int l,int r)
{
if(l>r) return 0;
int mid=(l+r)>>1;
nth_element(b+l,b+mid,b+r+1);
int x=b[mid].i,ndd=ii^1;
sz[x]=1;
ii=ndd,ch[x][0]=bui(l,mid-1),fa[ch[x][0]]=x,sz[x]+=sz[ch[x][0]];
ii=ndd,ch[x][1]=bui(mid+1,r),fa[ch[x][1]]=x,sz[x]+=sz[ch[x][1]];
lx[x]=min(a[x].x[0],min(lx[ch[x][0]],lx[ch[x][1]]));
rx[x]=max(a[x].x[0],max(rx[ch[x][0]],rx[ch[x][1]]));
ly[x]=min(a[x].x[1],min(ly[ch[x][0]],ly[ch[x][1]]));
ry[x]=max(a[x].x[1],max(ry[ch[x][0]],ry[ch[x][1]]));
return x;
}
struct dj
{
int x,d;
bool operator < (const dj &bb) const {return d>bb.d;}
};
priority_queue<dj> q2;
void updd(int x,int i,int ndi)
{
if(!sz[x]||rx[x]<e[i][1]||lx[x]>e[i][2]||ry[x]<e[i][3]||ly[x]>e[i][4]) return;
if(lx[x]>=e[i][1]&&rx[x]<=e[i][2]&&ly[x]>=e[i][3]&&ry[x]<=e[i][4]&&di[x]>ndi)
{
di[x]=ndi;
ban[x]=1;
int xx=x;
while(xx) --sz[xx],xx=fa[xx];
if(it[x]!=ee[x].end()) q2.push((dj){x,di[x]+e[*it[x]][0]});
}
else if(a[x].x[0]>=e[i][1]&&a[x].x[0]<=e[i][2]&&a[x].x[1]>=e[i][3]&&a[x].x[1]<=e[i][4]&&di[x]>ndi)
{
di[x]=ndi;
ban[x]=1;
int xx=x;
while(xx) --sz[xx],xx=fa[xx];
if(it[x]!=ee[x].end()) q2.push((dj){x,di[x]+e[*it[x]][0]});
}
updd(ch[x][0],i,ndi);
updd(ch[x][1],i,ndi);
}
int main()
{
n=rd(),m=rd(),rd(),rd();
for(int i=1;i<=n;++i)
{
a[i].x[0]=rd(),a[i].x[1]=rd(),a[i].i=i;
b[i]=a[i],di[i]=inf;
}
lx[0]=ly[0]=inf,rx[0]=ry[0]=-1;
rt=bui(2,n);
for(int i=1;i<=m;++i)
{
ee[rd()].push_back(i);
for(int j=0;j<=4;++j)
e[i][j]=rd();
}
for(int i=1;i<=n;++i)
sort(ee[i].begin(),ee[i].end(),cmp),it[i]=ee[i].begin();
q2.push((dj){1,(di[1]=0)+e[*it[1]][0]});
while(!q2.empty())
{
int x=q2.top().x;
q2.pop();
updd(rt,*it[x],di[x]+e[*it[x]][0]);
if((++it[x])!=ee[x].end()) q2.push((dj){x,di[x]+e[*it[x]][0]});
}
for(int i=2;i<=n;++i) printf("%d\n",di[i]);
return 0;
}
luogu P5471 [NOI2019]弹跳的更多相关文章
- 【题解】Luogu P5471 [NOI2019]弹跳
原题传送门 先考虑部分分做法: subtask1: 暴力\(O(nm)\)枚举,跑最短路 subtask2: 吧一行的点压到vector中并排序,二分查找每一个弹跳装置珂以到达的城市,跑最短路 sub ...
- 洛谷 P5471 - [NOI2019] 弹跳(二维线段树优化建图+堆优化存边)
题面传送门 一道非常有意思的题(大概可以这么形容?) 首先看到这类一个点想一个区域内连边的题目可以很自然地想到线段树优化建图,只不过这道题是二维的,因此需要使用二维线段树优化建图,具体来说,我们外层开 ...
- 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] 弹跳
题意: 给你平面上的$n$个点,共有$m$个弹跳装置. 每个弹跳装置可以从点$p_{i}$以$t_{i}$的代价跳到矩形$(L_{i},D_{i}),(R_{i},U_{i})$中的任何一个点. 现在 ...
- Luogu P5469 [NOI2019]机器人 (DP、多项式)
不用FFT的多项式(大雾) 题目链接: https://www.luogu.org/problemnew/show/P5469 (这题在洛谷都成绿题了海星) 题解: 首先我们考虑,一个序列位置最右边的 ...
- Luogu P5468 [NOI2019]回家路线 (斜率优化、DP)
题目链接: (luogu) https://www.luogu.org/problemnew/show/P5468 题解: 爆long long毁一生 我太菜了,这题这么简单考场上居然没想到正解-- ...
- 【题解】Luogu P5470 [NOI2019]序列
原题传送门 同步赛上我一开始想了个看似正确却漏洞百出的贪心:按\(a_i+b_i\)的和从大向小贪心 随便想想发现是假的,然后就写了个28pts的暴力dp 杜神后半程说这题就是个贪心,但我没时间写了 ...
- 【题解】Luogu P5468 [NOI2019]回家路线
原题传送门 前置芝士:斜率优化 不会的可以去杜神博客学 这道题我考场上只会拆点跑最短路的70pts做法 后来回家后发现错误的爆搜都能拿满分(刀片) 还有很多人\(O(mt)\)过的,还是要坚持写正解好 ...
随机推荐
- 性能测试 | 理解单线程的Redis为何那么快?
前言 Redis是一种基于键值对(Key-Value)的NoSQL数据库,Redis的Value可以由String,hash,list,set,zset,Bitmaps,HyperLogLog等多种数 ...
- P3146 [USACO16OPEN]248
P3146 [USACO16OPEN]248 题解 第一道自己码出的区间DP快庆祝一哈 2048 每次可以合并任意相邻的两个数字,得到的不是翻倍而是+1 dp[L][R] 区间 L~R 合并结果 然后 ...
- vscode 记住git用户密码
一.选中文件-->首选项-->设置,搜索git,在setting.json中添加 "git.path":"/bin/git.exe" 二.git b ...
- Qt编写自定义控件13-多态进度条
前言 多态进度条,顾名思义,有多重状态,其实本控件主要是用来表示百分比进度的,由于之前已经存在了百分比进度条控件,名字被霸占了,按照先来先得原则,只好另外取个别名叫做多态进度条,应用场景是,某种任务有 ...
- idea设置包的导入和提示重复代码下波浪线
1.一般idea都不会导入包.即使按了(以下都是已eclipse设置idea的快捷键) alt+enter键也不能导入. 2.关闭重复代码提示(也就是重复代码有波浪线)
- Java NIO学习笔记九 NIO与IO对比
Java NIO与IO Java nio 和io 到底有什么区别,以及什么时候使用nio和io,本文做一个比较. Java NIO和IO之间的主要区别 下表总结了Java NIO和IO之间的主要区别, ...
- 手写web框架之实现依赖注入功能
我们在Controller中定义了Service成员变量,然后在Controller的Action方法中调用Service成员变量的方法,那么如果实现Service的成员变量? 之前定义了@Injec ...
- Springboot学习—CommandLineRunner接口(转载)
前言 Spring boot的CommandLineRunner接口主要用于实现在应用初始化后,去执行一段代码块逻辑,这段初始化代码在整个应用生命周期内只会执行一次. 如何使用CommandLineR ...
- 【科普杂谈】IP地址子网划分
1.学习子网前的准备知识-什么是数制 现场讲解版 二进制和十进制的关系 二进制和十六进制的关系 16进制的每个位是2进制的4位 F=1111 二进制转16进制,按上面4位一组分开转 2.IP地 ...
- JQ scrollTop 无效的场景
先要设置DOM为显示,然后在设置scrollTop,先后顺序不能调换.