题目:

戳这里啊~~~

题意:

给你三种操作:(1)点到点建边;(2)点到区间建边;(3)区间到点建边;最后求起点到其他点的最短距离

分析:

最短距离无非建边跑Dijkstra即可,考虑如何对区间建边,如果直接对区间的每一点建边,那N^2的复杂度是行不通的,考虑将区间映射到线段树上的一个点:

(1)建两颗线段树,一颗表示出度的点,一颗表示入度的点

(2)对于表示出度的树,对每一节点和它父亲节点连一条长度为0的单向边(如果能从父亲出发,那么儿子也一定能);对于表示入度的树,对每一节点和它的儿子节点连一条长度为0的单向边(如果能到达父亲,那么也一定能达到儿子),并将其叶子节点和第一颗树对应的节点连一条长度为0的单向边(相当于从到达的点又出发),完全可以只建一颗树,但这样会走很多无用的边

(3)为了能区别两颗树,就必须给两颗树从新编号,建边时,直接找到对应的编号建边即可

代码:

#include <bits/stdc++.h>using namespace std;
typedef long long LL;
const int maxn = 2e5+15;
const LL inf = 1e18;
inline int read() {int x = 0, f = 1;char c = getchar();for (; !isdigit(c); c = getchar()) if (c == '-') f = -1;for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';return x * f;
}
inline void write(LL x)
{if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');
}
int n,q,s,t,l,r,w,p,u,v,tot;
int head[maxn<<3],cnt,tra[maxn<<3],trb[maxn<<3],in[maxn],out[maxn];
struct edge{int to,nxt,w;
}e[maxn<<4];
inline void add(int u,int v,int _w){e[++cnt].to = v;e[cnt].w = _w;e[cnt].nxt = head[u];head[u] = cnt;
}
void build(int l,int r,int x){tra[x]=++tot; trb[x]=++tot;if(l == r){out[l] = trb[x];in[l] = tra[x];add(trb[x],tra[x],0); return ;}int mid = (l+r) >> 1;build(l,mid,x<<1);build(mid+1,r,x<<1|1);add(tra[x<<1],tra[x],0);add(tra[x<<1|1],tra[x],0);add(trb[x],trb[x<<1],0);add(trb[x],trb[x<<1|1],0);
}
void Updata(int l,int r,int L,int R,int x,int v,int w,int op){if(l > R || r < L) return ;if(l >= L && r <= R){if(op == 2) add(in[v],trb[x],w);else add(tra[x],out[v],w);return;}int mid = (l+r) >> 1;Updata(l,mid,L,R,x<<1,v,w,op);Updata(mid+1,r,L,R,x<<1|1,v,w,op);
}
LL dis[maxn<<3];
struct node{int x; LL len;friend bool operator <(node a,node b){return a.len > b.len;}
};
void diskstra(){for(int i = 0;i <= tot; ++i) dis[i] = inf;dis[in[s]] = dis[out[s]] = 0;priority_queue<node> q;q.push(node{in[s],0LL});while(!q.empty()){node now = q.top();q.pop();if(now.len > dis[now.x]) continue;for(int i = head[now.x]; i ; i = e[i].nxt){int v = e[i].to;if(dis[v] > dis[now.x] + e[i].w){dis[v] = dis[now.x] + e[i].w;q.push(node{v,dis[v]});}}}
}
int main(){n = read(),q =read(),s = read();build(1,n,1);while(q--){t = read();if(t == 1){u = read(),v = read(),w = read();add(in[u],out[v],w);}else{v = read(),l = read(),r = read(),w = read();Updata(1,n,l,r,1,v,w,t);}}diskstra();for(int i = 1;i <= n; ++i){if(dis[out[i]] == inf) printf("-1 ");else write(dis[out[i]]),putchar(' ');}return 0;
}

CodeForces---787D:Legacy【线段树优化建图+最短路】相关推荐

  1. CodeForces - 787D - Legacy(线段树优化建图+最短路)

    题目链接:点击查看 题目大意:给出 nnn 个点和 mmm 条边,现在需要求从 ststst 开始到所有点的最短路是多少,mmm 条边的给出方式如下: 1uvw1 \ u \ v \ w1 u v w ...

  2. Codeforces 786B Legacy (线段树优化建图)

    Codeforces 786B Legacy (线段树优化建图) 题意:\(n\)个点,有\(3\)种连边操作:1.将\(u\)指向\(v\):2.将\(v\)指向编号在区间\([l,r]\)的点:3 ...

  3. Gym - 102174G 神圣的 F2 连接着我们 (线段树优化建图 + 多源最短路)

    Description 小白非常喜欢玩 "县际争霸" 这款游戏,虽然他的技术并不容乐观."县际争霸" 的地图共有两个县,每个县里各有 n n n 个据点.同一个 ...

  4. 【CF1045A】A Last chance【贪心】【线段树优化建图】【网络流构造方案】

    题意:有nnn个武器和mmm个飞船,武器有下面三种 从给定的集合SSS中击破一个. 在给定的区间[L,R][L,R][L,R]中击破一个. 对于给定的a,b,ca,b,ca,b,c,选择000个或22 ...

  5. 线段树优化建图详解——区间连边之技巧,吊打紫题之利器

    我们从一道例题开始. CF786B Description Solution 朴素解法: 暴力连边+最短路 对于每次连边操作,我们逐一连边,最后在图上跑一遍单源最短路径算法即可. 时间复杂度 O ( ...

  6. 洛谷P3588 [POI2015]PUS(线段树优化建图)

    题面 传送门 题解 先考虑暴力怎么做,我们把所有\(r-l+1-k\)中的点向\(x\)连有向边,表示\(x\)必须比它们大,那么如果这张图有环显然就无解了,否则的话我们跑一个多源最短路,每个点的\( ...

  7. BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)

    BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...

  8. P6348 [PA2011]Journeys 线段树优化建图 区间连区间

    传送门 文章目录 题意: 思路: 题意: 每次连接[a,b][a,b][a,b]与[c,d][c,d][c,d]之间所有点,让后跑最短路. 思路: 比普通的优化建图能简单点,我们只需要加两个虚点之间边 ...

  9. CF786B Legacy(线段树优化建图)

    传送门 ovo这题该怎么做呢?我们首先考虑暴力建图,但是因为建图的操作太多直接就会MLE,所以这个就别想了-- 我们考虑如何优化建图.因为发现一个点可以向一个区间连边,一个区间也可以向一个点连边,想到 ...

最新文章

  1. child_process 子进程
  2. java虚拟机内存分为,深入理解Java虚拟机笔记(一)----内存划分
  3. php获取上传多个文件缺失
  4. Android——RatingBar(评价条)相关知识总结贴
  5. 为什么我从 npm 到 yarn 再到 npm?
  6. Strut2和FreeMarker整合时的一些问题
  7. 2020Alibaba数学预选赛第2轮试题
  8. 【九章算法免费讲座第一期】转专业找CS工作的“打狗棒法”
  9. ssl1213-多边形面积【差积,计算几何】
  10. 【Python】Numpy中对向量、矩阵的使用
  11. python sys模块_Python sys模块
  12. 接外包项目的几点技巧
  13. COM 组件编程--VC知识库读杨老师文章笔记
  14. 仿美团外卖源码加自己做了个模拟数据加载的效果
  15. 马太效应和幂律分布是怎么回事?终于有人讲明白了
  16. ASML终于认识到它的未来在哪里,进一步向中国市场靠拢
  17. HTML小案例-使用CSS3实现网页加载loding动画
  18. 广东专升本C语言程序设计(完结)
  19. ddr2代内存最大升级到多少_DDR2台式内存条单条最大多少G?
  20. 揭秘考研英语阅读理解技巧(何凯文)

热门文章

  1. IDEA刷新项目目录
  2. 【SQL数据库基础01】数据库和SQL概述
  3. 浏览器怎么查看cookie
  4. 人际关系必知的55个绝招
  5. html如何输出js换行
  6. ARM架构下在qemu模拟器中汇编实现:统计输入字符串长度并且判断是否回文
  7. 智能分析网关AI安全帽识别技术在工地场景中的应用及意义
  8. 用php写一首诗,人生像一首优美的诗
  9. Java集合总结,详细且易懂
  10. 机器学习入门8--决策树