题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3073

建两棵线段树,一棵从下往上连边,一棵从上往下连边,叶子节点之间也有连边;

区间向区间连边时,可以新建一个节点,log2n 条边就能变成 2logn 条边;

注意区间向区间连边也要连反边,别忘了连反边时 ++cnt !

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. #define mid ((l+r)>>1)
  7. using namespace std;
  8. int const xxn=5e5+,xn=4e6+,xm=3e7+;
  9. int n,m,hd[xn],ct,to[xm],nxt[xm],w[xm],dis[xn];
  10. int rt[],cnt,ls[xxn<<],rs[xxn<<],st[xxn],ed[xxn];
  11. bool vis[xn];
  12. struct N{
  13. int d,id;
  14. bool operator < (const N &y) const
  15. {return d==y.d?id<y.id:d>y.d;}
  16. };
  17. priority_queue<N>q;
  18. int rd()
  19. {
  20. int ret=,f=; char ch=getchar();
  21. while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
  22. while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
  23. return f?ret:-ret;
  24. }
  25. int gt[];
  26. void wr(int x)
  27. {
  28. if(!x){puts(""); return;}
  29. if(x<)putchar('-'),x=-x;
  30. int t=;
  31. while(x)gt[++t]=x%,x/=;
  32. for(int i=t;i;i--)putchar(gt[i]+'');
  33. puts("");
  34. }
  35. void add(int x,int y,int z){to[++ct]=y; nxt[ct]=hd[x]; w[ct]=z; hd[x]=ct;}
  36. void build(int x,int l,int r,bool tp)
  37. {
  38. if(l==r)
  39. {
  40. if(!tp)st[l]=x; else ed[l]=x;
  41. return;
  42. }
  43. ls[x]=++cnt; rs[x]=++cnt;
  44. build(ls[x],l,mid,tp); build(rs[x],mid+,r,tp);
  45. if(!tp)add(ls[x],x,),add(rs[x],x,);
  46. else add(x,ls[x],),add(x,rs[x],);
  47. }
  48. void link(int x,int l,int r,int L,int R,int c,bool tp)
  49. {
  50. if(l>=L&&r<=R)
  51. {
  52. if(!tp)add(x,c,); else add(c,x,);
  53. return;
  54. }
  55. if(mid>=L)link(ls[x],l,mid,L,R,c,tp);
  56. if(mid<R)link(rs[x],mid+,r,L,R,c,tp);
  57. }
  58. void dij(int s)
  59. {
  60. memset(dis,0x3f,sizeof dis);
  61. dis[s]=; q.push((N){,s});
  62. while(q.size())
  63. {
  64. int x=q.top().id; q.pop();
  65. if(vis[x])continue; vis[x]=;
  66. for(int i=hd[x],u;i;i=nxt[i])
  67. if(dis[u=to[i]]>dis[x]+w[i])
  68. dis[u]=dis[x]+w[i],q.push((N){dis[u],u});
  69. }
  70. }
  71. int main()
  72. {
  73. n=rd(); m=rd(); int p=rd();
  74. rt[]=++cnt; build(rt[],,n,);
  75. rt[]=++cnt; build(rt[],,n,);
  76. for(int i=;i<=n;i++)add(ed[i],st[i],);
  77. for(int i=,a,b,c,d;i<=m;i++)
  78. {
  79. a=rd(); b=rd(); c=rd(); d=rd(); int t=++cnt;
  80. link(rt[],,n,a,b,t,); link(rt[],,n,c,d,t,);
  81. t=++cnt;//!!!
  82. link(rt[],,n,c,d,t,); link(rt[],,n,a,b,t,);
  83. }
  84. dij(ed[p]);
  85. for(int i=;i<=n;i++)wr(dis[ed[i]]);
  86. return ;
  87. }

bzoj 3073 Journeys —— 线段树优化连边的更多相关文章

  1. 【题解】Journeys(线段树优化连边)

    [#3073. Pa2011]Journeys (线段树优化连边) 这张图太直观了,直接讲透了线段树优化连边的原理和正确性. 考虑建立两颗线段树,一颗是外向树,一颗是内向树,相当于网络流建模一样,我们 ...

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

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

  3. bzoj 3073: [Pa2011]Journeys -- 线段树优化最短路

    3073: [Pa2011]Journeys Time Limit: 20 Sec  Memory Limit: 512 MB Description     Seter建造了一个很大的星球,他准备建 ...

  4. bzoj 3073 [Pa2011]Journeys ——线段树优化连边

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3073 建两棵线段树,一棵孩子向父亲连边,是走出去的:一棵父亲向孩子连边,是走进来的. 注意第 ...

  5. BZOJ3073: [Pa2011]Journeys(线段树优化建图 Dijkstra)

    题意 \(n\)个点的无向图,构造\(m\)次边,求\(p\)到任意点的最短路. 每次给出\(a, b, c, d\) 对于任意\((x_{a \leqslant x \leqslant b}, y_ ...

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

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

  7. 【BZOJ3073】[Pa2011]Journeys 线段树+堆优化Dijkstra

    [BZOJ3073][Pa2011]Journeys Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在 ...

  8. bzoj千题计划311:bzoj5017: [Snoi2017]炸弹(线段树优化tarjan构图)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5017 暴力: 对于每一个炸弹,枚举所有的炸弹,看它爆炸能不能引爆那个炸弹 如果能,由这个炸弹向引爆 ...

  9. BZOJ 3790 神奇项链(回文自动机+线段树优化DP)

    我们预处理出来以i为结尾的最长回文后缀(回文自动机的构建过程中就可以求出)然后就是一个区间覆盖,因为我懒得写贪心,就写了线段树优化的DP. #include<iostream> #incl ...

随机推荐

  1. [Bzoj3675][Apio2014]序列分割(斜率优化)

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 4021  Solved: 1569[Submit][Stat ...

  2. springBoot 跨域处理

    首先喝水不忘挖井人,博客参考:https://www.cnblogs.com/nananana/p/8492185.html 方式一:新增一个configration类 或 在Application中 ...

  3. http://www.cnblogs.com/shihaiming/

    原文:http://www.bubuko.com/infodetail-917303.html 右击项目,点击Run as,如下图: 即可看到有很多现有的maven命令,点击即可运行,并在控制台可以看 ...

  4. Android Studio 1.3RC版 build加速

    Android Studio 确实是好用.但build的速度却是奇慢无比!.! ! 我上网找了非常多build加速的设置,却不能适配到我的1.3RC版... . .心塞.无耐,忍着超级无敌慢的速度硬是 ...

  5. 全卷积网络FCN详解

    http://www.cnblogs.com/gujianhan/p/6030639.html CNN能够对图片进行分类,可是怎么样才能识别图片中特定部分的物体? (图像语义分割) FCN(Fully ...

  6. linux shell操作

    ---------------------------------------------------- 原文:http://unix.stackexchange.com/questions/2863 ...

  7. Windows-速度优化的几个方面

    One. Win+R - > cmd- > msconfig 禁用不需要的启动项! Two. 关闭一些视觉选项 Three. 设置应用启动快捷键

  8. Qt:解析命令行

    Qt从5.2版開始提供了两个类QCommandLineOption和QCommandLineParser来解析应用的命令行參数. 一.命令行写法 命令行:"-abc" 在QComm ...

  9. Javascript中没有引用传递,只有按值传递

    很多人,包括我,受书本知识消化不彻底的影响,认为 JS 中参数有两种传递方式:数字.字符串等按值传递:数组.对象等按地址(引用)传递.对此种观点,我们要谨慎. var v1 = [] var v2 = ...

  10. 20170218-取值Domain

    1.通过视图DD07V, 例子:取SD 凭证类别的DOMAIN(VBTYP)DATA: LT_DD07V TYPE TABLE OF DD07V.SELECT * INTO T_DD07V FROM ...