用线段树维护建图,即把用线段树把每个区间都标号了,Tree1中子节点有到达父节点的单向边,Tree2中父节点有到达子节点的单向边.

每次将源插入Tree1,汇插入Tree2,中间用临时节点相连。那么Tree1中的所用子节点都可以到达,Tree2中的所用子节点。 

感觉很有道理啊,以前从来没用用线段树这样维护过建图。分层图最短路没有像BZOJ2763可以直接向先一层连边,因为边已经很多了。

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <queue>
  6. #include <vector>
  7. #define pa pair<int,int>
  8. #define pa3 pair<int,pa>
  9. #define mp make_pair
  10. #define fi first
  11. #define se second
  12. #define pb push_back
  13. using namespace std;
  14. const int Maxn=;
  15. const int Maxk=;
  16. struct Edge{int to,next,w;}edge[Maxn<<];
  17. vector<int> P1,P2;
  18. priority_queue<pa3,vector<pa3>,greater<pa3> > Q;
  19. int n,m,Id1[Maxn],Id2[Maxn],head[Maxn],dis[Maxn][Maxk],cnt,Block;
  20. int Kase,v,k;
  21. inline void Add(int u,int v,int w)
  22. {edge[cnt].to=v;edge[cnt].next=head[u];edge[cnt].w=w;head[u]=cnt++;}
  23. inline int Max(int x,int y) {return x>y?x:y;}
  24. inline void Get_Int(int &x)
  25. {
  26. x=; char ch=getchar(); int f=;
  27. while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
  28. while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();} x*=f;
  29. }
  30. inline void Put_Int(int x)
  31. {
  32. char ch[]; int top=;
  33. if (x==) ch[++top]='';
  34. while (x) ch[++top]=x%+'',x/=;
  35. while (top) putchar(ch[top--]); putchar('\n');
  36. }
  37. void Build1(int o,int l,int r)
  38. {
  39. Block=Max(Block,o);
  40. if (l==r) {Id1[l]=o; return;}
  41. int mid=(l+r)>>;
  42. Build1(o<<,l,mid),Build1(o<<|,mid+,r);
  43. Add(o<<,o,),Add(o<<|,o,);
  44. }
  45. void Build2(int o,int l,int r)
  46. {
  47. if (l==r) {Id2[l]=Block+o; Add(Id2[l],Id1[l],);return;}
  48. int mid=(l+r)>>;
  49. Build2(o<<,l,mid),Build2(o<<|,mid+,r);
  50. Add(Block+o,Block+(o<<),),Add(Block+o,Block+(o<<|),);
  51. }
  52. void Modify1(int o,int l,int r,int p,int q)
  53. {
  54. if (l==p && r==q) {P1.pb(o); return;}
  55. int mid=(l+r)>>;
  56. if (q<=mid) Modify1(o<<,l,mid,p,q);
  57. if (p>=mid+) Modify1(o<<|,mid+,r,p,q);
  58. if (p<=mid && q>=mid+)
  59. Modify1(o<<,l,mid,p,mid),Modify1(o<<|,mid+,r,mid+,q);
  60. }
  61. void Modify2(int o,int l,int r,int p,int q)
  62. {
  63. if (l==p && r==q) {P2.pb(o+Block); return;}
  64. int mid=(l+r)>>;
  65. if (q<=mid) Modify2(o<<,l,mid,p,q);
  66. if (p>=mid+) Modify2(o<<|,mid+,r,p,q);
  67. if (p<=mid && q>=mid+)
  68. Modify2(o<<,l,mid,p,mid),Modify2(o<<|,mid+,r,mid+,q);
  69. }
  70.  
  71. void Dij()
  72. {
  73. memset(dis,0x7f,sizeof(dis));
  74. Q.push(mp(,mp(Id1[],))); dis[Id1[]][]=;
  75. while (!Q.empty())
  76. {
  77. int u=Q.top().se.fi,v=Q.top().se.se; Q.pop();
  78. for (int i=head[u];i!=-;i=edge[i].next)
  79. {
  80. if (dis[edge[i].to][v]>dis[u][v]+edge[i].w)
  81. {
  82. dis[edge[i].to][v]=dis[u][v]+edge[i].w;
  83. Q.push(mp(dis[edge[i].to][v],mp(edge[i].to,v)));
  84. }
  85. if (v<k)
  86. {
  87. if (dis[edge[i].to][v+]>dis[u][v])
  88. {
  89. dis[edge[i].to][v+]=dis[u][v];
  90. Q.push(mp(dis[edge[i].to][v+],mp(edge[i].to,v+)));
  91. }
  92. }
  93. }
  94. }
  95. }
  96.  
  97. int main()
  98. {
  99. Get_Int(Kase);
  100. for (int kase=;kase<=Kase;kase++)
  101. {
  102. Get_Int(n),Get_Int(m),Get_Int(k);
  103. memset(head,-,sizeof(head)); Block=;
  104. Build1(,,n); Block++; Build2(,,n);
  105. int tot=(Block<<)+,a,b,c,d,w;
  106. for (int i=;i<=m;i++)
  107. {
  108. Get_Int(a),Get_Int(b),Get_Int(c),Get_Int(d),Get_Int(w);
  109. P1.clear(),P2.clear();
  110. Modify1(,,n,a,b);
  111. Modify2(,,n,c,d);
  112. tot++;
  113. for (int j=;j<P1.size();j++) Add(P1[j],tot,w);
  114. for (int j=;j<P2.size();j++) Add(tot,P2[j],);
  115.  
  116. P1.clear(),P2.clear();
  117. Modify1(,,n,c,d);
  118. Modify2(,,n,a,b);
  119. tot++;
  120. for (int j=;j<P1.size();j++) Add(P1[j],tot,w);
  121. for (int j=;j<P2.size();j++) Add(tot,P2[j],);
  122. }
  123. }
  124. Dij();
  125. if (dis[Id2[n]][k]==0x7fffffff) puts("CreationAugust is a sb!"); else
  126. Put_Int(dis[Id2[n]][k]);
  127. return ;
  128. }

把标答代码改成Dij系列..

HDU 5669 线段树优化建图+分层图最短路的更多相关文章

  1. BZOJ5017 [SNOI2017]炸弹 - 线段树优化建图+Tarjan

    Solution 一个点向一个区间内的所有点连边, 可以用线段树优化建图来优化 : 前置技能传送门 然后就得到一个有向图, 一个联通块内的炸弹可以互相引爆, 所以进行缩点变成$DAG$ 然后拓扑排序. ...

  2. 【BZOJ3681】Arietta 树链剖分+可持久化线段树优化建图+网络流

    [BZOJ3681]Arietta Description Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中.但是她从未停止过和恋人 Velding 的书信往来.一 ...

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

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

  4. 【ARC069F】Flags 2-sat+线段树优化建图+二分

    Description ​ 数轴上有 n 个旗子,第 ii 个可以插在坐标 xi或者 yi,最大化两两旗子之间的最小距离. Input ​ 第一行一个整数 N. ​ 接下来 N 行每行两个整数 xi, ...

  5. 【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序

    题目描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足:  Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆.  现在 ...

  6. 【bzoj4699】树上的最短路(树剖+线段树优化建图)

    题意 给你一棵 $n$ 个点 $n-1$ 条边的树,每条边有一个通过时间.此外有 $m$ 个传送条件 $(x_1,y_1,x_2,y_2,c)$,表示从 $x_1$ 到 $x_2$ 的简单路径上的点可 ...

  7. 【BZOJ4276】[ONTAK2015]Bajtman i Okrągły Robin 线段树优化建图+费用流

    [BZOJ4276][ONTAK2015]Bajtman i Okrągły Robin Description 有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2 ...

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

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

  9. 【bzoj4383】[POI2015]Pustynia 线段树优化建图+差分约束系统+拓扑排序

    题目描述 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r,k以及接下来k个正整数,表示a[l],a[l+1],...,a[r- ...

随机推荐

  1. [问题2014A10] 解答

    [问题2014A10]  解答 考虑如下变形: \[(I_n-A)^2=(AA'-A)(I_n-A)=A(A'-I_n)(I_n-A)=-A(I_n-A)'(I_n-A).\] 因为 \(A\) 是非 ...

  2. Robots.txt 协议详解及使用说明

    一.Robots.txt协议 Robots协议,也称为爬虫协议.机器人协议等,其全称为“网络爬虫排除标准(Robots Exclusion Protocol)”.网站通过Robots协议告诉搜索引擎哪 ...

  3. python操作数据库产生中文乱码问题【已解决】

    记:最近在使用python进行学生成绩管理系统设计时,遇到了一个中文显示的问题,这个问题困扰了一个上午,查阅了有关资料,锁定了原因——编码问题.最终更改编码设置,问题得到了解决. 具体做法: 1 Py ...

  4. HTML布局与框架

    HTML块 HTML块元素 块元素在显示时,通常会以新行开始 如:<h1>.<p>.<ul> <!DOCTYPE html> <html> ...

  5. python 发送邮件实例

    留言板回复作者邮件提醒 -----------2016-5-11 15:03:58-- source:python发送邮件实例

  6. redis 安装及相关问题解决

    安装redis 下载,或者用scp命令从其他服务器拷贝 一.安装 解压:tar -zxvf redis-3.0.1.tar.gz 进入:cd redis-3.0.1 编译: make 二.解决问题 1 ...

  7. [教程] 离线封装原版WIN7系统 100%纯净

    raymond 发表于 2015-11-28 18:54:15 https://www.itsk.com/thread-360376-1-4.html 对于之前我用母盘封装的系统,纯粹是为了体积而折腾 ...

  8. MySQL限时解答

    MySQL在国内各个行业的使用率越来越高,使用场景也越多,相应的遇到的疑惑也越来越多.在遇到这些问题之后,目前已有的解决途径有 1.培训(这是从长计议的方式,不能解决燃眉之急) 2.BBS(目前BBS ...

  9. laravel开发微信公众号1 之基本配置

    需要用到的packagist:       https://github.com/overtrue/laravel-wechat  ( 目前最优雅的laravel微信sdk) 首先安装 compose ...

  10. JQuery中的id选择器含有特殊字符时,不能选中dom元素

    1.jquery类库在我们实际项目中用的很多,大家经常需要根据控件的id,获取对应的html元素.但是:当id含有特殊字符的时候,是不能选中的 2.jquery的id选择器只支持,单词.阿拉伯数字.下 ...