4515: [Sdoi2016]游戏

链接

分析:

  树链剖分 + 超哥线段树。注意细节。

代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<iostream>
  6. #include<cctype>
  7. #include<set>
  8. #include<vector>
  9. #include<queue>
  10. #include<map>
  11. #define Root 1, n, 1
  12. #define lson l, mid, rt << 1
  13. #define rson mid + 1, r, rt << 1 | 1
  14. using namespace std;
  15. typedef long long LL;
  16.  
  17. inline int read() {
  18. int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
  19. for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
  20. }
  21.  
  22. const int N = ;
  23. const LL INF = 123456789123456789ll;
  24. struct Edge{ int to, nxt, w; } e[N << ];
  25. int head[N], dep[N], siz[N], fa[N], son[N], dfn[N], bel[N], n, En, Index;
  26. LL dis[N];
  27. struct Line{
  28. LL k, b;
  29. Line() { k = , b = INF; }
  30. Line(LL _k,LL _b) { k = _k, b = _b; }
  31. LL f(LL x) { return x * k + b; }
  32. };
  33.  
  34. inline void add_edge(int u,int v,int w) {
  35. ++En; e[En].to = v, e[En].w = w, e[En].nxt = head[u]; head[u] = En;
  36. ++En; e[En].to = u, e[En].w = w, e[En].nxt = head[v]; head[v] = En;
  37. }
  38.  
  39. struct SegmentTree{
  40. LL ans[N << ], A[N]; Line T[N << ];
  41. void init() {
  42. for (int i = ; i <= (N << ); ++i) ans[i] = INF;
  43. }
  44. inline void pushup(int rt) { ans[rt] = min(ans[rt], min(ans[rt << ], ans[rt << | ])); }
  45. void Cover(int l,int r,int rt,Line v) {
  46. int mid = (l + r) >> ;
  47. if (v.f(A[mid]) < T[rt].f(A[mid])) ans[rt] = min(ans[rt], min(v.f(A[l]), v.f(A[r]))), swap(v, T[rt]); // A[l]!!!
  48. if (l == r) return ;
  49. if (v.f(A[l]) > T[rt].f(A[l]) && v.f(A[r]) > T[rt].f(A[r])) return ;
  50. if (v.k > T[rt].k) Cover(lson, v);
  51. else Cover(rson, v);
  52. pushup(rt);
  53. }
  54. void update(int l,int r,int rt,int L,int R,Line v) {
  55. if (L <= l && r <= R) { Cover(l, r, rt, v); return ; }
  56. int mid = (l + r) >> ;
  57. if (L <= mid) update(lson, L, R, v);
  58. if (R > mid) update(rson, L, R, v);
  59. pushup(rt);
  60. }
  61. LL query(int l,int r,int rt,int L,int R) {
  62. if (L <= l && r <= R) return ans[rt]; // L <= r !!!
  63. int mid = (l + r) >> ;
  64. LL res = min(T[rt].f(A[max(l, L)]), T[rt].f(A[min(r, R)]));
  65. if (L <= mid) res = min(res, query(lson, L, R));
  66. if (R > mid) res = min(res, query(rson, L, R));
  67. return res;
  68. }
  69. }T;
  70. void dfs1(int u) {
  71. dep[u] = dep[fa[u]] + ;
  72. siz[u] = ;
  73. for (int i = head[u]; i; i = e[i].nxt) {
  74. int v = e[i].to;
  75. if (v == fa[u]) continue;
  76. fa[v] = u;
  77. dis[v] = dis[u] + e[i].w;
  78. dfs1(v);
  79. siz[u] += siz[v];
  80. if (!son[u] || siz[son[u]] < siz[v]) son[u] = v;
  81. }
  82. }
  83. void dfs2(int u,int top) {
  84. bel[u] = top;
  85. dfn[u] = ++Index; T.A[Index] = dis[u];
  86. if (!son[u]) return ;
  87. dfs2(son[u], top);
  88. for (int i = head[u]; i; i = e[i].nxt)
  89. if (e[i].to != fa[u] && e[i].to != son[u]) dfs2(e[i].to, e[i].to);
  90. }
  91. int LCA(int u,int v) {
  92. while (bel[u] != bel[v]) dep[bel[u]] > dep[bel[v]] ? u = fa[bel[u]] : v = fa[bel[v]];
  93. return dep[u] < dep[v] ? u : v;
  94. }
  95. void Change(int u,int w,Line x) {
  96. while (bel[u] != bel[w])
  97. T.update(Root, dfn[bel[u]], dfn[u], x), u = fa[bel[u]];
  98. T.update(Root, dfn[w], dfn[u], x);
  99. }
  100. void Query() {
  101. int u = read(), v = read(); LL res = INF;
  102. while (bel[u] != bel[v]) {
  103. if (dep[bel[u]] < dep[bel[v]]) swap(u, v);
  104. res = min(res, T.query(Root, dfn[bel[u]], dfn[u]));
  105. u = fa[bel[u]];
  106. }
  107. if (dep[u] < dep[v]) swap(u, v);
  108. res = min(res, T.query(Root, dfn[v], dfn[u]));
  109. printf("%lld\n", res);
  110. }
  111. int main() {
  112. n = read();int m = read();
  113. for (int i = ; i < n; ++i) {
  114. int u = read(), v = read(), w = read();
  115. add_edge(u, v, w);
  116. }
  117. dfs1(); dfs2(, ); T.init();
  118. while (m --) {
  119. int opt = read();
  120. if (opt == ) {
  121. int u = read(), v = read(), w = LCA(u, v);LL a = read(), b = read();
  122. Change(u, w, Line(-a, b + dis[u] * a));
  123. Change(v, w, Line(a, b + a * (dis[u] - (dis[w] << ))));
  124. }
  125. else Query();
  126. }
  127. return ;
  128. }

4515: [Sdoi2016]游戏的更多相关文章

  1. bzoj 4515: [Sdoi2016]游戏

    Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,Alice 会 ...

  2. BZOJ.4515.[SDOI2016]游戏(树链剖分 李超线段树)

    BZOJ 洛谷 每次在路径上加的数是个一次函数,容易看出是树剖+李超线段树维护函数最小值.所以其实依旧是模板题. 横坐标自然是取个确定的距离标准.取每个点到根节点的距离\(dis[i]\)作为\(i\ ...

  3. 【BZOJ4515】[Sdoi2016]游戏 树链剖分+线段树

    [BZOJ4515][Sdoi2016]游戏 Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 1234567 ...

  4. BZOJ4515: [Sdoi2016]游戏

    Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,Alice 会 ...

  5. bzoj千题计划276:bzoj4515: [Sdoi2016]游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=4515 把lca带进式子,得到新的式子 然后就是 维护树上一次函数取min 一个调了一下午的错误: 当 ...

  6. [SDOI2016]游戏

    Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,Alice 会 ...

  7. Luogu 4069 [SDOI2016]游戏

    BZOJ 4515 树链剖分 + 李超线段树 要求支持区间插入一条线段,然后查询一个区间内的最小值.可以使用李超线段树解决,因为要维护一个区间内的最小值,所以每一个结点再维护一个$res$表示这个区间 ...

  8. [bzoj4515][Sdoi2016]游戏-树链剖分+李超线段树

    Brief Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,A ...

  9. 【题解】Luogu P4069 [SDOI2016]游戏

    原题传送门 看到这种题,想都不用想,先写一个树链剖分 然后发现修改操作增加的是等差数列,这使我们想到了李超线段树 先进性树剖,然后用李超线段树维护区间最小,这样就做完了(写码很容易出错) 复杂度为\( ...

随机推荐

  1. Jquery Ajax 提交json数据

    在MVC控制器(这里是TestController)下有一个CreateOrder的Action方法 [HttpPost] public ActionResult CreateOrder(List&l ...

  2. [翻译] USING GIT IN XCODE [6] 在XCODE中使用GIT[6]

    USING GIT IN XCODE KEEPING IN SYNC WITH REMOTE REPOSITORIES As you make changes in your local workin ...

  3. 前端 网络三剑客之html 01

    一.引语 1.html是什么? 1.超文本标记语言(Hypertext Markup Language):简称HTML或html.是通过标签语言来标记要显示的网页中的各个部分. 2.它遵循一套浏览器的 ...

  4. 铁乐学python27_模块学习2

    大部份内容摘自博客http://www.cnblogs.com/Eva-J/ collections模块 在内置数据类型(dict.list.set.tuple)的基础上, collections模块 ...

  5. 铁乐学python_day10_作业

    1.继续整理函数相关知识点,写博客. 2.写函数,接收n个数字,求这些参数数字的和.(动态传参) def sum_n(*args): sum = 0 for i in args: sum += i r ...

  6. XXX esx.problem.hyperthreading.unmitigated.formatOnHost not found XXX (Build 9313334)

    昨天把一台服务器(VMware ESXi, 6.0.0, 5572656)更新了一下补丁,更新到最新版(VMware ESXi, 6.0.0, 9313334),服务器重启后,vCenter出现以下错 ...

  7. scrapy爬虫框架之Xpath选择器

    问题: 本篇博文主要记录scrapy框架爬取伯乐在线文章的相关知识,在实践中学习对框架的理解.今天主要记录了xpath的相关用法以及语法规范. ----->>>点击进入爬取页面 一. ...

  8. JavaScript实现限时抢购实例

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  9. ZOJ 4103 浙江省第16届大学生程序设计竞赛 D题 Traveler 构造

    这个题,正赛的时候也没有过,不过其实已经有了正确的解法,可惜时间不多了,就没有去尝试. 题意是有n个点,i点能通向i-1,然后i和i*2.i*2+1互通. 请你构造一种路径从1能走完所有点,并且不重复 ...

  10. 多线程之CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...