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)\)过的,还是要坚持写正解好 ...
随机推荐
- DockerFile 简单使用
Dockerfile 是用来构建 Docker 镜像的构建文件,是由一系列命令和参数构成的脚本. 以 CentOS 为例(https://hub.docker.com/_/centos): FROM ...
- leetcode-hard-array-149. Max Points on a Line -NO
mycode 不会.... 参考 因为每次遍历一个点,也就是i的时候,都是新建的一个lines,所以也就是考虑了k相同b不同的情况 最后gcd函数就求最大公约数,来解决斜率精度的问题 class S ...
- P3951 小凯的疑惑
P3951 小凯的疑惑 题解 题意也就是求解不能用 ax+by 表示的最大数 ans(a,b,x,y,都是正整数) 给定 a ( =7 ) , b ( =3 ) 我们可以把数轴非负半轴上的数按照a的 ...
- 使用KerasNet
1.安装Python3.6,必须是3.6因为当前KerasNet的配套版本是3.6 https://www.python.org/ftp/python/3.6.8/python-3.6.8-amd64 ...
- python MySQLdb连接mysql时报错
故障现象: >>> import MySQLdb >>> conn = MySQLdb.connect(host=,charset="utf8" ...
- 深度学习之Seq_seq网络
知识点 """ 机器翻译: 历史: 1.逐字翻译 2.基于统计学的机器翻译 3.循环网络和编码 翻译过程: 输入 -- > encoder -->向量 --& ...
- php如何开启gd2扩展
extension=php_gd2.dll 找到php的配置文件php.ini,搜索extension=php_gd2.dll,去掉前面的分号即可:如果没有直接添加这种情况适合于windows系统和编 ...
- 根据规则去掉List 对象数组中的重复元素
package container.main; import java.util.ArrayList; import java.util.Comparator; import java.util.Li ...
- Linux命令集锦:chown命令
chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者变成文件所属的组. 使用 chown -R liu /usr/wang //将目录/usr ...
- PhpSpreadSheet 读写excel文件
phpoffice 系列很好用.PhpSpreadSheet取代了原先的phpexcel,用来处理excel文件 https://phpspreadsheet.readthedocs.io/en/la ...