思路

这个题哪里有那么费脑筋

我们可以树链剖分嘛LCT昨天学的时候睡着了,不是太会

两遍dfs+一个5行的BIT

其实树链剖分学好了对倍增和LCT理解上都有好处

一条路径上的修改

由于一条剖出来的链是连续的,我们要选择数据结构维护

不过这里不用维护太多东西,只是区间+1

我们可以选择常数小,好写的树状数组(从50行的线段树变成5行的

BIT)

而且使得\(O(nlog_{2})\)的算法跑的并不慢

具体就是用差分思想,修改区间[L,R]时

$[1,R] +1 $ \([1,L-1] -1\)达到修改的目的

最后查询时

直接每次查询[1,i]的值就可得到i的最终压力值

代码

  1. #include <bits/stdc++.h>
  2. #define FOR(i,a,b) for(int i=a;i<=b;++i)
  3. using namespace std;
  4. const int maxn=2e5+7;
  5. int read() {
  6. int x=0,f=1;char s=getchar();
  7. for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
  8. for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
  9. return x*f;
  10. }
  11. vector<int> G[maxn];
  12. int n,m,top[maxn],f[maxn],siz[maxn],idx[maxn],cnt,son[maxn],dep[maxn];
  13. void dfs1(int u,int fa) {
  14. f[u]=fa;
  15. siz[u]=1;
  16. dep[u]=dep[fa]+1;
  17. for(vector<int>::iterator it=G[u].begin();it!=G[u].end();++it) {
  18. if(*it==fa) continue;
  19. dfs1(*it,u);
  20. siz[u]+=siz[*it];
  21. if(siz[son[u]] < siz[*it]) son[u]=*it;
  22. }
  23. }
  24. void dfs2(int u,int topf) {
  25. idx[u]=++cnt;
  26. top[u]=topf;
  27. if(!son[u]) return;
  28. dfs2(son[u],topf);
  29. for(std::vector<int>::iterator it=G[u].begin();it!=G[u].end();++it)
  30. if(!idx[*it]) dfs2(*it,*it);
  31. }
  32. namespace BIT {
  33. int sum[maxn];
  34. int lowbit(int x) {return x&-x;}
  35. void add(int x,int k) {for(int i=x;i<=n;i+=lowbit(i)) sum[i]+=k;}
  36. int query(int x) {int ans=0;for(int i=x;i>=1;i-=lowbit(i)) ans+=sum[i];return ans;}
  37. void modify(int x,int y) {if(x!=n)add(y+1,-1);add(x,1);}
  38. }
  39. void change(int x,int y) {
  40. while(top[x]!=top[y]) {
  41. if(dep[top[x]] < dep[top[y]]) swap(x,y);
  42. BIT::modify(idx[top[x]],idx[x]);
  43. x=f[top[x]];
  44. }
  45. if(dep[x] > dep[y]) swap(x,y);
  46. BIT::modify(idx[x],idx[y]);
  47. }
  48. int main() {
  49. n=read(),m=read();
  50. FOR(i,2,n) {
  51. int x=read(),y=read();
  52. G[x].push_back(y),G[y].push_back(x);
  53. }
  54. dfs1(1,0);dfs2(1,1);
  55. FOR(i,1,m) change(read(),read());
  56. int ans=0;
  57. FOR(i,1,n) ans=max(ans,BIT::query(i));
  58. cout<<ans<<"\n";
  59. return 0;
  60. }

P3128 [USACO15DEC]最大流Max Flow的更多相关文章

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

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

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

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

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

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

  4. 【luogu P3128 [USACO15DEC]最大流Max Flow】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3128 菜 #include <cstdio> #include <cstring> ...

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

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

  6. 洛谷P3128 [USACO15DEC]最大流Max Flow [倍增LCA]

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

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

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

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

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

  9. 洛谷P3128 [USACO15DEC]最大流Max Flow(树上差分)

    题意 题目链接 Sol 树上差分模板题 发现自己傻傻的分不清边差分和点差分 边差分就是对边进行操作,我们在\(u, v\)除加上\(val\),同时在\(lca\)处减去\(2 * val\) 点差分 ...

随机推荐

  1. Java -- 深入浅出GC自动回收机制

    1,去年开春去美团和58同城面试的时候第一个问题基本上都是来说说 Java GC机制,当时年轻的我也很耿直,直接说不会,现在想想还是当时年轻啊.刚好这段时间被各大论坛的面试题刷屏,见到最多的也是也是这 ...

  2. Unity shader学习之Grab Pass实现玻璃效果

    GrabPass可将当前屏幕的图像绘制在一张纹理中,可用来实现玻璃效果. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7201324.html shader ...

  3. linux正则

    正则表达式 分两类:  基本正则表达式:BRE  扩展正则表达式:ERE :grep -E, egrep 正则表达式引擎:  采用不同算法,检查处理正则表达式的软件模块       PCRE(Perl ...

  4. vm虚拟机黑屏解决办法

    以管理员打开cmd 输入 netsh winsock reset --------------------- 然后 reboot

  5. python django简单的登陆实现

    实现方法: 1,可以先定义一个基础的页面访问路径 例如:http://127.0.0.1:8000/index/  定义index路径 在urls urlpatterns = [ url(r'^ind ...

  6. 01 while 循环输入1 2 3 4 5 6 8 9 10

      start = 1while True:    if start == 7:        start += 1        continue    print(start)    start ...

  7. 在HUE中将文本格式的数据导入hive数仓中

    今天有一个需求需要将一份文档形式的hft与fdd的城市关系关系的数据导入到hive数仓中,之前没有在hue中进行这项操作(上家都是通过xshell登录堡垒机直接连服务器进行操作的),特此记录一下. - ...

  8. nodejs之pm2自动重启服务

    pm2 start xxx #启动服务器 pm2 list #查看运行状态 pm2 logs #查看日志 pm2 restart xxx #重启应用 pm2 stop xxx #停止应用 监听修改,并 ...

  9. Linux基础命令---防火墙iptables

    iptables iptables指令用来设置Linux内核的ip过滤规则以及管理nat功能.iptables用于在Linux内核中设置.维护和检查IPv4数据包过滤规则表.可以定义几个不同的表.每个 ...

  10. Linux基础命令---添加组groupadd、删除组groupdel

    groupadd 指定群组名称来建立新的群组账号,需要时可以从系统中取得新的群组值. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. ...