题目链接:https://www.luogu.org/problemnew/show/P3128

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #define ll long long
  6. #define lson left, mid, rt<<1
  7. #define rson mid+1, right, rt<<1|1
  8. using namespace std;
  9. const ll maxn = 100000 + 10;
  10. ll n, m, root;
  11. ll fa[maxn], top[maxn], son[maxn], size[maxn], rev[maxn], seg[maxn], deep[maxn];
  12. ll lazy[maxn<<2], tree[maxn<<2], res, num;
  13. struct edge{
  14. ll from, to, next;
  15. }e[maxn<<2];
  16. ll head[maxn], cnt;
  17. void add(ll u, ll v)
  18. {
  19. e[++cnt].from = u;
  20. e[cnt].to = v;
  21. e[cnt].next = head[u];
  22. head[u] = cnt;
  23. }
  24. //-----segment_tree-----
  25. void PushUP(ll rt)
  26. {
  27. tree[rt] = max(tree[rt<<1], tree[rt<<1|1]);
  28. }
  29. void build(ll left, ll right, ll rt)
  30. {
  31. if(left == right)
  32. {
  33. tree[rt] = rev[left];
  34. return;
  35. }
  36. ll mid = (left + right)>>1;
  37. build(lson);
  38. build(rson);
  39. PushUP(rt);
  40. }
  41. void PushDOWN(ll left, ll right, ll rt, ll mid)
  42. {
  43. lazy[rt<<1] += lazy[rt];
  44. lazy[rt<<1|1] += lazy[rt];
  45. tree[rt<<1] += lazy[rt];//区间求和才需要加(mid - left + 1)*lazy[rt]
  46. tree[rt<<1|1] += lazy[rt];//区间求最值只需要求一个值只需要加一次lazy[rt]
  47. lazy[rt] = 0;
  48. }
  49. void update(ll l, ll r, ll add, ll left, ll right, ll rt)
  50. {
  51. if(l <= left && r >= right)
  52. {
  53. tree[rt] += add;
  54. lazy[rt] += add;
  55. return;
  56. }
  57. ll mid = (left + right)>>1;
  58. if(lazy[rt]) PushDOWN(left, right, rt, mid);
  59. if(l <= mid) update(l, r, add, lson);
  60. if(r > mid) update(l, r, add, rson);
  61. PushUP(rt);
  62. }
  63. ll query(ll l, ll r, ll left, ll right, ll rt)
  64. {
  65. ll res = -0x7fffffff;
  66. if(l <= left && r >= right)
  67. {
  68. return tree[rt];
  69. }
  70. ll mid = (left + right)>>1;
  71. if(lazy[rt]) PushDOWN(left, right, rt, mid);
  72. if(l <= mid) res = max(query(l, r, lson), res);
  73. if(r > mid) res = max(query(l, r, rson), res);
  74. return res;
  75. }
  76. //----------------------
  77. void dfs1(ll u, ll f, ll d)
  78. {
  79. ll maxson = -1;
  80. size[u] = 1;
  81. deep[u] = d;
  82. fa[u] = f;
  83. for(ll i = head[u]; i != -1; i = e[i].next)
  84. {
  85. ll v = e[i].to;
  86. if(f != v)
  87. {
  88. dfs1(v, u, d+1);
  89. size[u] += size[v];
  90. if(maxson < size[v]) son[u] = v, maxson = size[v];
  91. }
  92. }
  93. }
  94. void dfs2(ll u, ll t)
  95. {
  96. seg[u] = ++num;
  97. rev[num] = 0;
  98. top[u] = t;
  99. if(!son[u]) return;
  100. dfs2(son[u], t);
  101. for(ll i = head[u]; i != -1; i = e[i].next)
  102. {
  103. ll v = e[i].to;
  104. if(v == fa[u] || v == son[u]) continue;
  105. dfs2(v,v);
  106. }
  107. }
  108. void updRange(ll x, ll y)
  109. {
  110. while(top[x] != top[y])
  111. {
  112. if(deep[top[x]] < deep[top[y]]) swap(x, y);
  113. update(seg[top[x]], seg[x], 1, 1, n, 1);
  114. x = fa[top[x]];
  115. }
  116. if(deep[x] > deep[y]) swap(x, y);
  117. update(seg[x], seg[y], 1, 1, n, 1);
  118. }
  119. int main()
  120. {
  121. memset(head, -1, sizeof(head));
  122. scanf("%lld%lld",&n,&m); root = 1;
  123. for(ll i = 1; i < n; i++)
  124. {
  125. ll u, v;
  126. scanf("%lld%lld",&u,&v);
  127. add(u, v), add(v, u);
  128. }
  129. dfs1(root, 0, 1);
  130. dfs2(root, root);
  131. build(1, n, 1);
  132. for(ll i = 1; i <= m; i++)
  133. {
  134. ll u, v;
  135. scanf("%lld%lld",&u,&v);
  136. updRange(u, v);
  137. }
  138. printf("%lld",tree[1]);
  139. }

【luogu P3128 [USACO15DEC]最大流Max Flow】 题解的更多相关文章

  1. luogu P3128 [USACO15DEC]最大流Max Flow (树上差分)

    题目描述 Farmer John has installed a new system of N-1N−1 pipes to transport milk between the NN stalls ...

  2. [LUOGU] P3128 [USACO15DEC]最大流Max Flow

    题意:一棵树,多次给指定链上的节点加1,问最大节点权值 n个点,n-1条边很容易惯性想成一条链,幸好有样例.. 简单的树剖即可!(划去) 正常思路是树上差分,毕竟它就询问一次.. #include&l ...

  3. 洛谷P3128 [USACO15DEC]最大流Max Flow

    P3128 [USACO15DEC]最大流Max Flow 题目描述 Farmer John has installed a new system of N-1N−1 pipes to transpo ...

  4. P3128 [USACO15DEC]最大流Max Flow(LCA+树上差分)

    P3128 [USACO15DEC]最大流Max Flow 题目描述 Farmer John has installed a new system of  pipes to transport mil ...

  5. luoguP3128 [USACO15DEC]最大流Max Flow 题解(树上差分)

    链接一下题目:luoguP3128 [USACO15DEC]最大流Max Flow(树上差分板子题) 如果没有学过树上差分,抠这里(其实很简单的,真的):树上差分总结 学了树上差分,这道题就极其显然了 ...

  6. 洛谷P3128 [USACO15DEC]最大流Max Flow [树链剖分]

    题目描述 Farmer John has installed a new system of  pipes to transport milk between the  stalls in his b ...

  7. 题解——洛谷P3128 [USACO15DEC]最大流Max Flow

    裸的树上差分 因为要求点权所以在点上差分即可 #include <cstdio> #include <algorithm> #include <cstring> u ...

  8. 洛谷 P3128 [ USACO15DEC ] 最大流Max Flow —— 树上差分

    题目:https://www.luogu.org/problemnew/show/P3128 倍增求 lca 也写错了活该第一次惨WA. 代码如下: #include<iostream> ...

  9. 树上差分——点差分裸题 P3128 [USACO15DEC]最大流Max Flow

    讲解: https://rpdreamer.blog.luogu.org/ci-fen-and-shu-shang-ci-fen #include <bits/stdc++.h> #def ...

随机推荐

  1. 两种请求方式URLHttpconnection 和Httpclient提交表单 网络篇(二)

    安卓有两种发送请求的方式:URLHttpconnection 和Httpclient 下面就来讲下这两种方式,这篇是最基础的使用 进阶请看第二篇  先占位 打扫卫生去了T T 快过年了 框架就放网络篇 ...

  2. 案例46-crm练习客户登录

    1 login.jsp代码 <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  3. 安卓获取输入法高度与ViewTreeObserver讲解

    目录 安卓获取输入法高度 前言 清单 开始 ViewTreeObserver讲解 获取输入法高度原理 思路 实现 关于ViewTreeObserver 定义 继承 摘要 获取View高度的三种方法 源 ...

  4. struts 2 报错Could not find action or resul 常见错误原因分析

    1.struts.xml配置的action与我们访问的action或返回的result确实没有匹配导致.这个时候要仔细检查Struts.xml配置文件: 2.我们的action输入正确,返回结果经过无 ...

  5. JS字符串与二进制的相互转化

    //字符串转ascii码,用charCodeAt(); //ascii码转字符串,用fromCharCode(); var str = "A"; var code = str.ch ...

  6. Angular6路由复用与延迟加载的冲突解决——看看有备无患

    结论:   结论放最上面,送给匆匆查资料的你: 同时使用延迟加载 + 路由复用,一定不能使用route.routeConfig.path做key去缓存,否则会死得难看. 经实测(我没有完全去解读源代码 ...

  7. 从零开始的全栈工程师——html篇1.2

    起名方式与CSS 一.起名方式(起名方式也叫选择器) 起名的目的是为了给标签添加属性 常见的3种选择器有 标签选择器   id选择器(使用的时候加#)    class选择器(使用的时候加.) 样式的 ...

  8. 前端(三大框架、Bootstrap,jQuery,自整理)

    前端,HTML(超文本标记语言),CSS(层叠样式表)和JavaScript(脚本语言) HTML,通常说的h5,其实按标准来说,HTML4的后续版本不带编号了,并保证向前的兼容性 CSS的版本3,增 ...

  9. ECMAscript 变量作用域

    使用var操作符声明的变量与未使用var操作符声明的变量区别 未使用var操作符声明 function test() { message='hi'; console.log(message); } c ...

  10. Java设计模式—访问者模式

    原文地址:http://www.cnblogs.com/java-my-life/archive/2012/06/14/2545381.html 总结的太棒啦,导致自己看了都不想总结了...... 在 ...