题目描述

小 w 和小 c 在 H 国,近年来,随着 H 国的发展,H 国的道路也在不断变化着

根据 H 国的道路法,H 国道路都有一个值 \(w\) ,表示如果小 w 和小 c 通过这条道路,那么他们的 L 值会减少 \(w\) ,但是如果小 w 和 小 c 在之前已经经过了这条路,那么他们的 L 值不会减少

H 国有 \(N\) 个国家,最开始 H 国有 \(N-1\) 条道路,这 \(N-1\) 条道路刚好构成一棵树

小 w 将和小 c 从 H 国的城市 1 出发,游览 H 国的所有城市,总共游览 32766 天,对于每一天,他们都希望游览结束后 L 值还是一个正数, 那么他们出发时 L 值至少为多少

H 国的所有边都是无向边,没有一条道路连接相同的一个城市

输入输出格式

输入格式:

输入第 1 行,一个整数 \(N\)

输入第 2 至第 \(N\) 行,每行三个正整数 \(u, v, w\) ,表示城市 \(u\) 与城市 \(v\) 有一条值为 \(w\) 道路

输入第 \(N+1\) 行,一个整数 \(M\) ,表示 H 国有 \(M\) 条正在变化的道路

输入第 \(N+2\) 行到第 \(N+M+1\) 行,每行 5 个整数 \(u, v, w, l, r\) ,表示城市 \(u\) 到城市 \(v\) 有一条值为 \(w\) 的道路, 这条道路存在于第 \(l\) 天到第 \(r\) 天

输出格式:

输出共 32766 行,第 \(i\) 行表示第 \(i\) 天游览的 L 值至少为多少

输入输出样例

输入样例#1:

4

1 3 3

3 4 4

2 4 5

3

1 2 1 1 2

2 3 8 2 3

3 4 2 1 1

输出样例#1:

7

9

13

由于版面原因,仅显示三行,接下来32763行都是13

说明

第一天,选择 1 -(1)> 2 -(0)> 1 -(3)> 3 -(2)> 4,L 值总共减少了 6,所以 L 值至少为 7

第二天,选择 1 -(1)> 2 -(0)> 1 -(3)> 3 -(4)> 4,L 值总共减少了 8,所以 L 值至少为 9

第三天及之后,选择 1 -(3)> 3 -(4)> 4 -(5)> 2,L 值总共减少了 12,所以 L 值至少为 13

subtask1 : 15分,\(N = 100, rm = 233\)

subtask2 : 15分,\(N = 1000, rm = 2333\)

subtask3 : 20分,\(N = 49998, rm = 32766, l = r\)

subtask4:20分,\(N = 49999, rm = 32766, r = rm\)

subtask5:30分,\(N = 50000, rm = 32766\)

对于subtask3 : \(M = rm\) ,对于其他subtask:\(M=3\times rm\)

对于所有数据 : \(1\leq N\leq 50000, 1\leq l\leq r\leq rm\leq 32766, 1\leq w\leq 10^9\)

题解

又是一道LCT与其它数据结构结合的题目

肯定离线做,怎么离线?时间线段树分治

考虑线段树,一条边在 \(l\) 到 \(r\) 中出现,就在线段树中 \(l\) 到 \(r\) 的区间加上这条边

最后访问线段树的每个叶子节点,然后往下递归的时候如果区间上有边的标记,就加边;到叶子节点的时候,算答案;回溯的时候,把在这个区间内加的边又删去。(当然,这个线段树虽然要打标记,但是不会有pushdown的)

然后就做完了

  1. #include<bits/stdc++.h>
  2. #define ui unsigned int
  3. #define ll long long
  4. #define db double
  5. #define ld long double
  6. #define ull unsigned long long
  7. const int MAXN=200000+10,inf=0x3f3f3f3f;
  8. int n,m,scnt;
  9. ll ans;
  10. struct edge{
  11. int u,v,w;
  12. };
  13. edge side[MAXN];
  14. #define lc(x) ch[(x)][0]
  15. #define rc(x) ch[(x)][1]
  16. struct LCT{
  17. int ch[MAXN][2],fa[MAXN],rev[MAXN],stack[MAXN],cnt,Mx[MAXN],id[MAXN],val[MAXN];
  18. inline void init()
  19. {
  20. memset(Mx,-inf,sizeof(Mx));
  21. memset(val,-inf,sizeof(val));
  22. }
  23. inline bool nroot(int x)
  24. {
  25. return lc(fa[x])==x||rc(fa[x])==x;
  26. }
  27. inline void reverse(int x)
  28. {
  29. std::swap(lc(x),rc(x));
  30. rev[x]^=1;
  31. }
  32. inline void pushup(int x)
  33. {
  34. Mx[x]=val[x],id[x]=x;
  35. if(Mx[lc(x)]>Mx[x])Mx[x]=Mx[lc(x)],id[x]=id[lc(x)];
  36. if(Mx[rc(x)]>Mx[x])Mx[x]=Mx[rc(x)],id[x]=id[rc(x)];
  37. }
  38. inline void pushdown(int x)
  39. {
  40. if(rev[x])
  41. {
  42. if(lc(x))reverse(lc(x));
  43. if(rc(x))reverse(rc(x));
  44. rev[x]=0;
  45. }
  46. }
  47. inline void rotate(int x)
  48. {
  49. int f=fa[x],p=fa[f],c=(rc(f)==x);
  50. if(nroot(f))ch[p][rc(p)==f]=x;
  51. fa[ch[f][c]=ch[x][c^1]]=f;
  52. fa[ch[x][c^1]=f]=x;
  53. fa[x]=p;
  54. pushup(f);
  55. pushup(x);
  56. }
  57. inline void splay(int x)
  58. {
  59. cnt=0;
  60. stack[++cnt]=x;
  61. for(register int i=x;nroot(i);i=fa[i])stack[++cnt]=fa[i];
  62. while(cnt)pushdown(stack[cnt--]);
  63. for(register int y=fa[x];nroot(x);rotate(x),y=fa[x])
  64. if(nroot(y))rotate((lc(y)==x)==(lc(fa[y])==y)?y:x);
  65. pushup(x);
  66. }
  67. inline void access(int x)
  68. {
  69. for(register int y=0;x;x=fa[y=x])splay(x),rc(x)=y,pushup(x);
  70. }
  71. inline void makeroot(int x)
  72. {
  73. access(x);splay(x);reverse(x);
  74. }
  75. inline void split(int x,int y)
  76. {
  77. makeroot(x);access(y);splay(y);
  78. }
  79. inline void link(int x,int y)
  80. {
  81. makeroot(x);fa[x]=y;
  82. }
  83. inline void cut(int x,int y)
  84. {
  85. split(x,y);fa[x]=lc(y)=0;pushup(y);
  86. }
  87. };
  88. LCT T1;
  89. #undef lc
  90. #undef rc
  91. template<typename T> inline void read(T &x)
  92. {
  93. T data=0,w=1;
  94. char ch=0;
  95. while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
  96. if(ch=='-')w=-1,ch=getchar();
  97. while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
  98. x=data*w;
  99. }
  100. template<typename T> inline void write(T x,char c='\0')
  101. {
  102. if(x<0)putchar('-'),x=-x;
  103. if(x>9)write(x/10);
  104. putchar(x%10+'0');
  105. if(c!='\0')putchar(c);
  106. }
  107. template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
  108. template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
  109. template<typename T> inline T min(T x,T y){return x<y?x:y;}
  110. template<typename T> inline T max(T x,T y){return x>y?x:y;}
  111. #define Mid ((l+r)>>1)
  112. #define lson rt<<1,l,Mid
  113. #define rson rt<<1|1,Mid+1,r
  114. struct SEG{
  115. std::vector<int> V[MAXN];
  116. inline void Update(int rt,int l,int r,int L,int R,int k)
  117. {
  118. if(L<=l&&r<=R)V[rt].push_back(k);
  119. else
  120. {
  121. if(L<=Mid)Update(lson,L,R,k);
  122. if(R>Mid)Update(rson,L,R,k);
  123. }
  124. }
  125. inline void Query(int rt,int l,int r)
  126. {
  127. std::stack< std::pair<int,int> > S;
  128. for(register int i=0,limit=V[rt].size();i<limit;++i)
  129. {
  130. int u=side[V[rt][i]].u,v=side[V[rt][i]].v,w=side[V[rt][i]].w,sn=V[rt][i]+n;
  131. T1.split(u,v);
  132. if(w<T1.Mx[v])
  133. {
  134. ans-=T1.Mx[v]-w;
  135. int so=T1.id[v];
  136. T1.cut(so,side[so-n].u);T1.cut(so,side[so-n].v);
  137. S.push(std::make_pair(so,1));
  138. T1.val[sn]=w;
  139. T1.link(sn,u);T1.link(sn,v);
  140. S.push(std::make_pair(sn,0));
  141. }
  142. }
  143. if(l==r)write(ans+1,'\n');
  144. else Query(lson),Query(rson);
  145. while(!S.empty())
  146. {
  147. std::pair<int,int> now=S.top();
  148. S.pop();
  149. int sn=now.first;
  150. if(!now.second)T1.cut(side[sn-n].u,sn),T1.cut(side[sn-n].v,sn),ans-=side[sn-n].w;
  151. else T1.link(side[sn-n].u,sn),T1.link(side[sn-n].v,sn),ans+=side[sn-n].w;
  152. }
  153. }
  154. };
  155. SEG T2;
  156. #undef Mid
  157. #undef lson
  158. #undef rson
  159. int main()
  160. {
  161. read(n);
  162. for(register int i=1;i<n;++i)
  163. {
  164. int u,v,w,sn=i+n;
  165. read(u);read(v);read(w);
  166. side[++scnt]=(edge){u,v,w};
  167. ans+=w;
  168. T1.val[sn]=w;
  169. T1.link(sn,u);T1.link(sn,v);
  170. }
  171. read(m);
  172. for(register int i=1;i<=m;++i)
  173. {
  174. int u,v,w,l,r;
  175. read(u);read(v);read(w);read(l);read(r);
  176. side[++scnt]=(edge){u,v,w};
  177. T2.Update(1,1,32766,l,r,scnt);
  178. }
  179. T2.Query(1,1,32766);
  180. return 0;
  181. }

【刷题】洛谷 P4319 变化的道路的更多相关文章

  1. 洛谷 P4319 变化的道路 解题报告

    P4319 变化的道路 题目描述 小 w 和小 c 在 H 国,近年来,随着 H 国的发展,H 国的道路也在不断变化着 根据 H 国的道路法,H 国道路都有一个值 \(w\),表示如果小 w 和小 c ...

  2. 洛谷P4319 变化的道路

    题意:给定图,每条边都有一段存在时间.求每段时间的最小生成树. 解:动态MST什么毒瘤...洛谷上还是蓝题... 线段树分治 + lct维护最小生成树. 对时间开线段树,每条边的存在时间在上面会对应到 ...

  3. 洛谷P1462 通往奥格瑞玛的道路(二分+spfa,二分+Dijkstra)

    洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建 ...

  4. 洛谷P1462-通往奥格瑞玛的道路-二分+最短路

    洛谷P1462-通往奥格瑞玛的道路 题目描述 在艾泽拉斯,有\(n\)个城市.编号为\(1,2,3,...,n\). 城市之间有\(m\)条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联 ...

  5. 【题解】洛谷P2296 [NOIP2014TG] 寻找道路(SPFA+DFS)

    题目来源:洛谷P2296 思路 一开始看还以为是一道水题 虽然本来就挺水的 本道题的难点在于如何判断是否路径上的点都会直接或者间接连着终点 我们需要在一开始多建一个反向图 然后从终点DFS回去 把路径 ...

  6. 洛谷 P1462 通往奥格瑞玛的道路

    洛谷 题意:要求在限定油耗内,求最小花费的最大值. 求最小值最大很容易想到二分答案.所以我们往二分的方向去想. 我们二分一个费用,然后要保证到终点时满足限定油耗,所以跑最短路. 不过松弛条件要改一下: ...

  7. 2018.10.30 一题 洛谷4660/bzoj1168 [BalticOI 2008]手套——思路!问题转化与抽象!+单调栈

    题目:https://www.luogu.org/problemnew/show/P4660 https://www.lydsy.com/JudgeOnline/problem.php?id=1168 ...

  8. 【洛谷P4319】 变化的道路 线段树分治+LCT

    最近学了一下线段树分治,感觉还蛮好用... 如果正常动态维护最大生成树的话用 LCT 就行,但是这里还有时间这一维的限制. 所以,我们就把每条边放到以时间为轴的线段树的节点上,然后写一个可撤销 LCT ...

  9. 洛谷 P1462 通往奥格瑞玛的道路 解题报告

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

随机推荐

  1. Android——调用高德地图API前期准备

    1.登陆高德开放平台注册账号http://lbs.amap.com/ 2.创建自己的应用并且添加新key 获取发布版安全码获取方法: 在AndroidStudio的Terminal中编译: 输入如下图 ...

  2. EasyUI系列学习笔记(一)——注册

    前面介绍过EasyUI是一个前段框架,开发之前需要导入底层包:我这里采用的是EasyUI 1.4版本~ 今天主要是搭建一个EasyUI的环境,同时做一个登陆页面... 环境搭建 导入需要的文件到项目中 ...

  3. L2-016 愿天下有情人都是失散多年的兄妹

    L2-016 愿天下有情人都是失散多年的兄妹 (25 分)   呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母.高祖父母)则不可通婚.本题就请你 ...

  4. AssetBundle压缩/内部结构/下载和加载

    一.AssetBundle的压缩方式   Unity支持三种AssetBundle打包的压缩方式:LZMA, LZ4, 以及不压缩.    1.LZMA压缩方式  是一种默认的压缩形式,这种标准压缩格 ...

  5. Unity — — UGUI之背包物品拖放

    最新背包代码: Unity3D — — UGUI之简易背包 Unity版本:2017.3 功能:用UGUI实现简单的背包物品拖放/交换功能 一.简介 在UGUI下,物品的拖放脚本实现主要依赖于Unit ...

  6. PSO算法的改进(参数)

    ## 基本PSO的改进 虽然粒子群在求解优化函数时,表现了较好的寻优能力:通过迭代寻优计算,能够迅速找到近似解:但基本的PSO容易陷入局部最优,导致结果误差较大. 两个方面:1.将各种先进理论引入到P ...

  7. 学习python,第一篇

    name = "danie" name2 = name print(name,name2) name = "itxpl" print(name,name2) 结 ...

  8. 记录一个IIS的服务器错误问题的解决方案

    部署一个mvc项目到iis的时候提示有下面这样的错误, 看提示是Microsoft.CodeDom.Providers.DotNetCompilerPlatform,权限问题. 我是第一次遇到,所以只 ...

  9. Bitcoin Core P2P网络层

    目录 数据结构 节点发现和节点连接 地址管理 节点发现 节点连接 插口(Sockets)和消息 Socket线程 (net.cpp) 消息线程 ProcessMessages (net_process ...

  10. Thirteenth scrum meeting 2015/11/11

    发布bug整理集结: 手机用户体验优化优化: (1)主界面和课程界面的字体规格以及界面结构不同 (2)课程图片的大小格式不统一,造成美观下降 ( 3 )按钮的位置不美观 平板用户体验: (1)Tab键 ...