题意:

有n个点,q个询问,

每次询问有一种操作。

操作1:u→[l,r](即u到l,l+1,l+2,...,r距离均为w)的距离为w;

操作2:[l,r]→u的距离为w

操作3:u到v的距离为w

最终求起点到其他点的最短距离,到达不了输出-1

题解

线段树优化建图+最短路...

不知道这种东西,百度了一下,好像最早的是POI2015的PUS,然后2017/2018的oi也都出过,

还是要见识一下的...

顺便记录一下,封装好的djisktra和graph

代码如下:

  1. #include <bits/stdc++.h>
  2. #define endl '\n'
  3. #define ll long long
  4. #define ull unsigned long long
  5. #define fi first
  6. #define se second
  7. #define mp make_pair
  8. #define pii pair<int,int>
  9. #define all(x) x.begin(),x.end()
  10. #define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
  11. #define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
  12. #define per(ii,a,b) for(int ii=b;ii>=a;--ii)
  13. #define forn(ii,x) for(int ii=head[x];ii;ii=e[ii].next)
  14. #pragma GCC optimize("Ofast")
  15. #define show(x) cout<<#x<<"="<<x<<endl
  16. #define show2(x,y) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<endl
  17. #define show3(x,y,z) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
  18. #define show4(w,x,y,z) cout<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
  19. #define show5(v,w,x,y,z) cout<<#v<<" "<<v<<" "<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
  20. #define showa(a,b) cout<<#a<<'['<<b<<"]="<<a[b]<<endl
  21. using namespace std;
  22. const int maxn=1e6+10,maxm=2e6+10;
  23. const int INF=0x3f3f3f3f;
  24. const int mod=1e9+7;
  25. const double PI=acos(-1.0);
  26. //head
  27. int casn,n,m,k;
  28. int num[maxn];
  29. class graph{
  30. public:
  31. struct edge{
  32. int from,to;ll cost;
  33. edge(int a,int b,ll c){from=a,to=b,cost=c;}
  34. };
  35. vector<vector<edge>> node;
  36. int ud=0;
  37. graph(int n=maxn,int f=0){node.resize(n+2);ud=f;}
  38. void add(int a,int b,int c=1){node[a].emplace_back(a,b,c);if(ud)node[b].emplace_back(b,a,c);}
  39. };
  40.  
  41. class dijkstra{
  42. public:
  43. struct road{
  44. int now;ll dis;
  45. road(int a,ll b){now=a,dis=b;}
  46. bool operator<(const road &rhs)const{return dis>rhs.dis;}
  47. };
  48. vector<ll> dis;
  49. priority_queue<road>q;
  50. ll INF;
  51. dijkstra(graph &g,int st){
  52. INF=0x3f3f3f3f3f3f3f3f;
  53. dis.resize(g.node.size()+1,INF);
  54. q.emplace(st,0);
  55. dis[st]=0;
  56. while(!q.empty()){
  57. road t=q.top();q.pop();
  58. for(auto e:g.node[t.now]){
  59. ll cost=t.dis+e.cost;
  60. if(cost<dis[e.to]){
  61. dis[e.to]=cost;
  62. q.emplace(e.to,cost);
  63. }
  64. }
  65. }
  66. }
  67. };
  68.  
  69. class segtree{
  70. public:
  71. #define nd node[now]
  72. #define ndl node[now<<1]
  73. #define ndr node[now<<1|1]
  74. struct segnode {
  75. int l,r;int id;
  76. int mid(){return (r+l)>>1;}
  77. int len(){return r-l+1;}
  78. };
  79. graph *g;
  80. int cnt,flag;
  81. vector<segnode> node;
  82. vector<int> ff;
  83. segtree(int n,graph *x,int y,int id) {
  84. g=x;cnt=id;flag=y;
  85. node.resize(n<<2|3);
  86. maketree(1,n);
  87. }
  88. void pushup(int now){
  89. if(!flag){
  90. g->add(nd.id,ndl.id,0);
  91. g->add(nd.id,ndr.id,0);
  92. }else {
  93. g->add(ndl.id,nd.id,0);
  94. g->add(ndr.id,nd.id,0);
  95. }
  96. }
  97. void maketree(int s,int t,int now=1){
  98. nd={s,t,++cnt};
  99. if(s==t){
  100. if(!flag) g->add(nd.id,s,0);
  101. else g->add(s,nd.id,0);
  102. return ;
  103. }
  104. maketree(s,nd.mid(),now<<1);maketree(nd.mid()+1,t,now<<1|1);
  105. pushup(now);
  106. }
  107. void query(int s,int t){
  108. ff.clear();
  109. count(s,t);
  110. }
  111. void count(int s,int t,int now=1){
  112. if(s>nd.r||t<nd.l)return ;
  113. if(s<=nd.l&&t>=nd.r) {
  114. ff.emplace_back(nd.id);
  115. return ;
  116. }
  117. count(s,t,now<<1);count(s,t,now<<1|1);
  118. }
  119. };
  120.  
  121. int main() {
  122. IO;
  123. int n,q,s;
  124. cin>>n>>q>>s;
  125. graph g(n*10);
  126. segtree intree(n,&g,1,n);
  127. segtree outtree(n,&g,0,intree.cnt);
  128. int k,a,b;ll c,d;
  129. while(q--){
  130. cin>>k;
  131. if(k==1){
  132. cin>>a>>b>>c;
  133. g.add(a,b,c);
  134. }else if(k==2){
  135. cin>>a>>b>>c>>d;
  136. outtree.query(b,c);
  137. for(auto &i:outtree.ff) g.add(a,i,d);
  138. }else{
  139. cin>>a>>b>>c>>d;
  140. intree.query(b,c);
  141. for(auto &i:intree.ff) g.add(i,a,d);
  142. }
  143. }
  144. dijkstra ne(g,s);
  145. rep(i,1,n) cout<<(ne.dis[i]>=ne.INF?-1:ne.dis[i])<<' ';
  146. return 0;
  147. }

codeforces 787D - Legacy 线段树优化建图,最短路的更多相关文章

  1. CF786B Legacy 线段树优化建图

    问题描述 CF786B LG-CF786B 题解 线段树优化建图 线段树的一个区间结点代表 \([l,r]\) 区间点. 然后建立区间点的时候就在线段树上建边,有效减少点的个数,从而提高时空效率. 优 ...

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

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

  3. 【BZOJ4383】[POI2015]Pustynia 线段树优化建图

    [BZOJ4383][POI2015]Pustynia Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r ...

  4. AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图

    AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...

  5. loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点

    loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...

  6. bzoj3073: [Pa2011]Journeys 线段树优化建图

    bzoj3073: [Pa2011]Journeys 链接 BZOJ 思路 区间和区间连边.如何线段树优化建图. 和单点连区间类似的,我们新建一个点,区间->新点->区间. 又转化成了单点 ...

  7. BZOJ 3073: [Pa2011]Journeys Dijkstra+线段树优化建图

    复习一下线段树优化建图:1.两颗线段树的叶子节点的编号是公用的. 2.每次连边是要建两个虚拟节点 $p1,p2$ 并在 $p1,p2$ 之间连边. #include <bits/stdc++.h ...

  8. bzoj4383 [POI2015]Pustynia 拓扑排序+差分约束+线段树优化建图

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4383 题解 暴力的做法显然是把所有的条件拆分以后暴力建一条有向边表示小于关系. 因为不存在零环 ...

  9. Codeforces 1045A Last chance 网络流,线段树,线段树优化建图

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045A.html 题目传送们 - CF1045A 题意 你有 $n$ 个炮,有 $m$ 个敌人,敌人排成一 ...

随机推荐

  1. tcping ,一个好用的TCP端口检测工具

    1.常用的用法(windows) tcp -w 10 -t -d -i 5 -j --color 81.156.165.66 443 2. http模式 -u,与-h命令连用,每一行输出目标的url ...

  2. openflow流表分析(草稿)

    OVS bridge 有两种模式:“normal” 和 “flow”.“normal” 模式的 bridge 同普通的 Linux 桥,而 “flow” 模式的 bridge 是根据其流表(flow ...

  3. EntityFramework Core笔记:查询数据(3)

    1. 基本查询 1.1 加载全部数据 using System.Linq; using (var context = new LibingContext()) { var roles = contex ...

  4. 获取data-*属性值

    下面就详细介绍四种方法获取data-*属性的值 <li id=">获取id</li> 需要获取的就是data-id 和 dtat-vice-id的值 一:getAtt ...

  5. BZOJ4977[Lydsy1708月赛]跳伞求生——贪心+堆+模拟费用流

    题目链接: 跳伞求生 可以将题目转化成数轴上有$n$个人和$m$个房子,坐标分别为$a_{i}$和$b_{i}$,每个人可以进一个他左边的房子,每个房子只能进一个人.每个房子有一个收益$c_{i}$, ...

  6. linux服务器间文件夹拷贝

    要求,在A机器执行脚本,把A机器的某个目录文件拷贝到B机器. 第一版ftp实现: 1.A 机器先安装 ftp 客户端 $ sudo yum install ftp 2.B机器安装ftp服务端 $ su ...

  7. 状压DP天秀

    状压DP,依靠的是把状态用某种压缩方式表示出来进而DP,大多数时候是二进制状压. 直接看例题吧. 一双木棋     九尾狐吃棉花糖     islands and bridges 愤怒的小鸟   芯片 ...

  8. 配置sudo记录日志

    sudosudo命令用来以其他身份来执行命令,预设的身份为root.在/etc/sudoers中设置了可执行sudo指令的用户.若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员.用户使用 ...

  9. BSGS及扩展BSGS算法及例题

    \(BSGS(baby-step-giant-step)\)算法是用来解高次同余方程的最小非负整数解的算法,即形如这个的方程: \(a^x\equiv b(mod\ p)\) 其中\(p\)为质数(其 ...

  10. 洛谷P4155 BZOJP4444 [SCOI2015]国旗计划

    自己做出来的第一道倍增(fake) 原题链接 看到题目,贪心水题!不仅思维难度低,代码也好(难)写,三下五除二就写了出来,过了样例.但是一交,只有40pts.一道紫题能让我快速水40pts,良心出题人 ...