Problem 遗产

题目大意

给出一个带权有向图,有三种操作:

1.u->v添加一条权值为w的边

2.区间[l,r]->v添加权值为w的边

3.v->区间[l,r]添加权值为w的边

求st点到每个点的最短路

Solution

首先我们思考到,若是每次对于l,r区间内的每一个点都执行一次加边操作,不仅耗时还耗空间。

那么我们要想到一个办法去优化它。一看到lr区间,我们就会想到线段树对吧。

没错啦这题就是用线段树去优化它。

首先我们建一棵线段树,然后很容易想到,我们只需要把这一棵线段树当做图中的一部分去跑dijkstra,也可以跑出正确答案。

当然这棵树上的每一条边边权都为0。

看到2.3操作,我们需要建两颗线段树,其中一颗线段树是区间到点,另一个是点到区间。

区间到点的线段树是反着连有向边的,这个简单思考一下便可得出。

建树的时候我们需要对于每一个叶子节点连向对应的单点。

这样一来,因为每个区间最多只会有$\log n$个点,我们只需要最多连$\log n$条边就可以完成一次加边操作。

最后跑dijkstra的时候一定要加堆优化,否则会很惨的。。因为边数特别大。。。

当然本题解写的非常之简略,可以去bilibili[嘿嘿嘿]搜索“codeforces div ABC”(好像是这样)就可以搜索到某大神的直播讲题。

好的接下来是扯淡时间,首先我先在自己学校oj上交了一发,然后a掉了。于是我就很高兴地开始写本篇题解。写着写着突然想去cf上面交一发。。然后直接第七个点就爆炸了。对拍以后发现是自己的dijkstra出了问题。

那么现在问题来了,为什么我们的oj上可以ac呢?

调了数据发现我们oj上的数据只有五个点&&前四个点n<5。。。。

于是就继续改,对拍了一个中午都没错。。结果发现自己oj上拿下来的标程是错的。。

然而这个题目我卡了好久好久好久好久啊。。都快调疯了。

最后发现是dijkstra写错了。。。我都想扇死自己了。

最后A掉了以后,搞了一发数据,扔到了oj上,卡掉了80%的Ac代码。

还有一个非常需要注意到的地方是,总的边数经过计算可得知为$6n+q\log n$条边,也就是≥2500000。

点数也要开到5n级别,也就是≥500000。

还有,dijkstra的distance数组一定要开long long不然会炸裂

加边时间复杂度:$O(q\log n)$

最短路时间复杂度$O(n\log(q\log n))$

Data Maker

此题的数据生成器:(建议调数据大小的时候要在全程序范围内修改,否则只修改define部分会跑出来非法的数据,可不能怪我哟嘿嘿嘿)

 #include <ctime>
#include <cstdio>
#include <iostream>
#include <cstdlib>
#define maxN 100000
#define maxQ 100000
#define maxW 100000000
#define starT (rand()%100000+1)
using namespace std;
int main(){
srand((unsigned)time(NULL));
freopen("cf787d7.in","w",stdout);
int n=maxN,q=maxQ,s=starT;
printf("%d %d %d\n",n,q,s);
for(int i=;i<=q;i++){
int num=rand()%+;
if(num==)printf("1 %d %d %d\n",rand()%maxN+,rand()%maxN+,rand()%maxW+);
else if(num<){
int l=rand()%+;
printf("2 %d %d %d %d\n",rand()%maxN+,l,l++rand()%()+,rand()%maxW+);
}else{
int l=rand()%+;
printf("3 %d %d %d %d\n",rand()%maxN+,l,l++rand()%()+,rand()%maxW+);
}
}
}

AC Code

 #include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
int n,eq,s,u,v,l,r,Tsk,nodetot,now,tot=;
priority_queue< pair<long long,int> > q;
struct node{
int to,next,w;
}e[];
bool vis[];
int h[],lch[],w;
long long dist[];
void add(int u,int v,int w){
e[++tot].to=v;e[tot].next=h[u];h[u]=tot;e[tot].w=w;
}
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;
}
void addTree(int v,int l,int r,long long w,int nl,int nr,int now){
if(nl>=l&&nr<=r)add(v,now,w);
else{
int mid=(nl+nr)>>;
if(r<=mid)addTree(v,l,r,w,nl,mid,lch[now-n]);
else if(l>mid)addTree(v,l,r,w,mid+,nr,lch[now-n]+);
else{
addTree(v,l,mid,w,nl,mid,lch[now-n]);
addTree(v,mid+,r,w,mid+,nr,lch[now-n]+);
}
}
}
void Treeadd(int v,int l,int r,long long w,int nl,int nr,int now){
if(nl>=l&&nr<=r)add(now,v,w);
else{
int mid=(nl+nr)>>;
if(r<=mid)Treeadd(v,l,r,w,nl,mid,lch[now-n]);
else if(l>mid)Treeadd(v,l,r,w,mid+,nr,lch[now-n]+);
else{
Treeadd(v,l,mid,w,nl,mid,lch[now-n]);
Treeadd(v,mid+,r,w,mid+,nr,lch[now-n]+);
}
}
}
void buildTreest(int now,int l,int r){
if(l==r){
add(now,l,);
return;
};
int mid=(l+r)>>;
add(now,++nodetot,);
lch[now-n]=nodetot;
add(now,++nodetot,);
buildTreest(lch[now-n],l,mid);
buildTreest(lch[now-n]+,mid+,r);
}
void buildTreeet(int now,int l,int r){
if(l==r){
add(l,now,);
return;
};
int mid=(l+r)>>;
add(++nodetot,now,);
lch[now-n]=nodetot;
add(++nodetot,now,);
buildTreeet(lch[now-n],l,mid);
buildTreeet(lch[now-n]+,mid+,r);
}
void Dijkstra(int st){
dist[st]=;
now=st;
q.push(make_pair(,st));
while(!q.empty()){
vis[now]=;
pair<long long,int> x=q.top();
q.pop();
now=x.second;
for(int i=h[now];~i;i=e[i].next){
if(dist[e[i].to]>dist[now]+e[i].w){
dist[e[i].to]=dist[now]+e[i].w;
q.push(make_pair(-dist[e[i].to],e[i].to));
}
}
}
}
int main(){
memset(h,-,sizeof(h));
memset(dist,0x7f,sizeof(dist));
n=read();
eq=read();
s=read();
nodetot=n+;
buildTreest(n+,,n);
buildTreeet(++nodetot,,n);
for(int i=;i<=eq;i++){
Tsk=read();
if(Tsk==){
v=read();
u=read();
w=read();
add(v,u,w);
}else if(Tsk==){
v=read();
l=read();
r=read();
w=read();
addTree(v,l,r,w,,n,n+);
}else{
v=read();
l=read();
r=read();
w=read();
Treeadd(v,l,r,w,,n,n*);
}
}
Dijkstra(s);
for(int i=;i<=n-;i++)printf("%lld ",(dist[i]==0x7f7f7f7f7f7f7f7f)?-:dist[i]);
printf("%lld\n",(dist[n]==0x7f7f7f7f7f7f7f7f)?-:dist[n]);
}

[CF787D]遗产(Legacy)-线段树-优化Dijkstra(内含数据生成器)的更多相关文章

  1. CF786B Legacy && 线段树优化连边

    线段树优化连边 要求点 \(x\) 向区间 \([L, R]\) 连边, 一次的复杂度上限为 \(O(n)\) 然后弄成线段树的结构 先父子连边边权为 \(0\) 这样连边就只需要连父亲就可以等效于连 ...

  2. 【Luogu P3371&P4779】【模板】单源最短路径(线段树优化Dijkstra)

    线段树优化$\rm dijkstra$ 线段树每个节点维护$[l,r]$中$dist$最小的点,删除则把该点$dist$赋值为$+\infty$,然后更新该点影响到的线段树上的其他节点即可. 可以得到 ...

  3. CF786B Legacy 线段树优化建图 + spfa

    CodeForces 786B Rick和他的同事们做出了一种新的带放射性的婴儿食品(???根据图片和原文的确如此...),与此同时很多坏人正追赶着他们.因此Rick想在坏人们捉到他之前把他的遗产留给 ...

  4. Codeforces.786B.Legacy(线段树优化建图 最短路Dijkstra)

    题目链接 \(Description\) 有\(n\)个点.你有\(Q\)种项目可以选择(边都是有向边,每次给定\(t,u,v/lr,w\)): t==1,建一条\(u\to v\)的边,花费\(w\ ...

  5. 【BZOJ】BZOJ3040 最短路 线段树优化Dijkstra

    题目描述 N个点,M条边的有向图,求点1到点N的最短路(保证存在). 1<=N<=1000000,1<=M<=10000000 输入格式 第一行两个整数N.M,表示点数和边数. ...

  6. 堆优化/zkw线段树优化 dijkstra

    #include <bits/stdc++.h> using namespace std; const int MAXN = 100005; const int MAXM = 200005 ...

  7. B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路

    B - Legacy CodeForces - 787D 这个题目开始看过去还是很简单的,就是一个最短路,但是这个最短路的建图没有那么简单,因为直接的普通建图边太多了,肯定会超时的,所以要用线段树来优 ...

  8. 【bzoj3073】[Pa2011]Journeys 线段树优化建图+堆优化Dijkstra

    题目描述 Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a, ...

  9. G. 神圣的 F2 连接着我们 线段树优化建图+最短路

    这个题目和之前写的一个线段树优化建图是一样的. B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路 之前这个题目可以相当于一个模板,直接套用就可以了. 不 ...

随机推荐

  1. R语言-Kindle特价书爬榜示例 & 输出HTML小技巧(转)

    自从买了kindle以后,总是想要定期刷有没有便宜的书,amazon经常有些1元/2元的书打特价,但是每次都去刷那些榜单太麻烦了,而且榜单又不能按照价格排名,捞书有点累 所以自己用R语言的rvest包 ...

  2. NodeJS在线聊天室(NodeJS & SocketIO & Express & EJS & MongoDB & Gulp)

    项目背景 这个项目主要是为了玩玩NodeJS,项目的方向大概是做出类似QQ的在线聊天系统.想要在线体验可以点击在线演示. 项目使用PM2进行部署和管理,功能在不断的迭代开发中.如果你觉得这个项目比较有 ...

  3. 红包项目总结---MVC版

    起因: 针对传统版的明显缺陷做优化.主要是提升可维护性. 效果  线上:  未发布 线下:http://10.27.5.1/svn/FED/code/hongbao/year-end   hb-fac ...

  4. Win10无法连接远程桌面提示“你的凭据不工作”的三个解决方法

    Win10无法连接远程桌面提示"你的凭据不工作"的三个解决方法(转藏) 解决方法一:修改组策略 1.在"开始"窗口运行gpedit.msc,进入计算机配置-&g ...

  5. jQuery总结--版本二 事件处理函数

    一:事件处理函数 (1) one(事件名称, fn) 仅对指定事件监听一次,监听事件只会执行一次 <!DOCTYPE html> <html> <head lang=&q ...

  6. 配置Nginx作为web server详解

    keepalived+nginx:实现高可用 corosync+ngin Nginx: 轻量级的反向代理 web服务器 处理静态文件,索引文件以及自动索引,打开文件描述缓存 使用缓存加速反向代理,简单 ...

  7. 页面中的平滑滚动——smooth-scroll.js的使用

    正常的本页面锚链接跳转的时候跟PPT似的,特别生硬,用户体验非常差. 这时候我们就可以借助smooth-scroll.js这个插件,来实现本页面的平滑的跳转. 1首先,导入必须的JS文件 <sc ...

  8. 一天搞定CSS(扩展):CSS Hack

    做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我们会极不情愿的使用这个不太友好的方式来达到大家要求的页面表现.我个人是不太推荐使用hack的,要知道 ...

  9. LinkedList集合

    LinkedList集合特点: 1,有序,允许重复(有序指与添加顺序一致) 2,有下标,可以通过下标获取元素,以及将元素插入指定位置 3,底层使用的数据结构是链表以及堆栈结构,线程不安全 4,链表内存 ...

  10. 论文笔记 Spatial contrasting for deep unsupervised learning

    在我们设计无监督学习模型时,应尽量做到 网络结构与有监督模型兼容 有效利用有监督模型的基本模块,如dropout.relu等 无监督学习的目标是为有监督模型提供初始化的参数,理想情况是"这些 ...