luogu

因为是一个点向矩形区域连边,所以可以二维数据结构优化连边,但是会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]弹跳的更多相关文章

  1. 【题解】Luogu P5471 [NOI2019]弹跳

    原题传送门 先考虑部分分做法: subtask1: 暴力\(O(nm)\)枚举,跑最短路 subtask2: 吧一行的点压到vector中并排序,二分查找每一个弹跳装置珂以到达的城市,跑最短路 sub ...

  2. 洛谷 P5471 - [NOI2019] 弹跳(二维线段树优化建图+堆优化存边)

    题面传送门 一道非常有意思的题(大概可以这么形容?) 首先看到这类一个点想一个区域内连边的题目可以很自然地想到线段树优化建图,只不过这道题是二维的,因此需要使用二维线段树优化建图,具体来说,我们外层开 ...

  3. luogu 5471 [NOI2019]弹跳 KDtree + Dijkstra

    题目链接 第一眼就是 $KDtree$ 优化建图然而,空间只有 $128mb$,开不下   时间不吃紧,考虑直接跑 $Dijkstra$ $Dijkstra$ 中存储的是起点到每个输入时给出的矩阵的最 ...

  4. p5471 [NOI2019]弹跳

    分析 代码 #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define ...

  5. [NOI2019] 弹跳

    题意: 给你平面上的$n$个点,共有$m$个弹跳装置. 每个弹跳装置可以从点$p_{i}$以$t_{i}$的代价跳到矩形$(L_{i},D_{i}),(R_{i},U_{i})$中的任何一个点. 现在 ...

  6. Luogu P5469 [NOI2019]机器人 (DP、多项式)

    不用FFT的多项式(大雾) 题目链接: https://www.luogu.org/problemnew/show/P5469 (这题在洛谷都成绿题了海星) 题解: 首先我们考虑,一个序列位置最右边的 ...

  7. Luogu P5468 [NOI2019]回家路线 (斜率优化、DP)

    题目链接: (luogu) https://www.luogu.org/problemnew/show/P5468 题解: 爆long long毁一生 我太菜了,这题这么简单考场上居然没想到正解-- ...

  8. 【题解】Luogu P5470 [NOI2019]序列

    原题传送门 同步赛上我一开始想了个看似正确却漏洞百出的贪心:按\(a_i+b_i\)的和从大向小贪心 随便想想发现是假的,然后就写了个28pts的暴力dp 杜神后半程说这题就是个贪心,但我没时间写了 ...

  9. 【题解】Luogu P5468 [NOI2019]回家路线

    原题传送门 前置芝士:斜率优化 不会的可以去杜神博客学 这道题我考场上只会拆点跑最短路的70pts做法 后来回家后发现错误的爆搜都能拿满分(刀片) 还有很多人\(O(mt)\)过的,还是要坚持写正解好 ...

随机推荐

  1. 查找与排序算法(Searching adn Sorting)

    1,查找算法 常用的查找算法包括顺序查找,二分查找和哈希查找. 1.1 顺序查找(Sequential search) 顺序查找: 依次遍历列表中每一个元素,查看是否为目标元素.python实现代码如 ...

  2. MySQL Cluster 集群部署

    前言 此篇博客用以介绍 MySQL Cluster 集群部署方法 一.节点规划 序号 IP地址 节点名称 1 172.16.1.201 mysql-manage 2 172.16.1.202 mysq ...

  3. 【SQL】 java.sql.SQLException: You can't specify target table 'emp' for update in FROM clause

    在执行sql: delete from emp where id in (select id from emp where cdate<'2018-02-02') 时报出以下异常: ### Th ...

  4. MS SQL 数据类型转换

    MS SQL 转换数据类型 select cast(列A as int) 列A select convert(int,列A) 列A --转字符串为int select len(ltrim(str('数 ...

  5. 安装k8s-1master多node节点

    卸载比较新的18.3版本,安装17.03版本 删除旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker- ...

  6. Centos安装openjdk

    转载自:https://blog.csdn.net/youzhouliu/article/details/51183115 openjdk在linux各个平台下安装源中可以找到. 命令查找安装源中有什 ...

  7. VS2012编译php扩展

    注意:用VS2015来做会比较好! 开发前准备工作:cygwinvisual studio 2012php编译后的程序      使用的是 xampp集成安装包,所以编译后的程序路径为D:\xampp ...

  8. docker 导出多个镜像合并成一个tar

    导出单个镜像 docker save [images] > [name.tar] 倒出多个镜像合并成一个tar包 docker save [images] [images] > [name ...

  9. STS如何将一个文件夹设置缺省的创建路径(build path)

    STS中的build path是一种缺省的路径,相当于windows的环境变量中的path,利用它可以将jsp等文件放入其中,程序只需要文件名就可以找到它. (1)在Package Explorer中 ...

  10. 【VS开发】【DSP开发】如何使用WinDriver为PCIe采集卡装驱动

    如何使用WinDriver为PCIe采集卡装驱动 第一步:使用WinDriver生成驱动 1.运行Drier Wizard 2.点击New host driverproject 3.在列表中,选择待安 ...