暴力建图显然就是S->i连1,i->j'连inf(i为第j个力度能弹出的音符),j'->T连T[j]。

由于是“某棵子树中权值在某区间内的所有点”都向某个力度连边,于是线段树优化建图。由于是在树上所以需要可持久化线段树合并。

理论上可能空间会被卡,但是实际上并不能卡掉,边数最大点都不超过100W。

相比之下不太清楚为什么网上的dsu on tree做法为什么理论上就能过(可能是常数问题?),以及不理解为什么不用普通的启发式合并而非要用轻重链剖分。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define rep(i,l,r) for (int i=(l); i<=(r); i++)
  4. #define For(i,x) for (int i=h[x],k; i; i=nxt[i])
  5. using namespace std;
  6.  
  7. const int N=,M=,inf=1e9;
  8. int n,m,S,T,nd,l,r,d,t,fa[N],a[N],rt[M],ls[M],rs[M],cur[M],q[M],dis[M];
  9. int cnt=,cnt2,h[M],to[M<<],nxt[M<<],fl[M<<],h2[N],to2[N],nxt2[N];
  10.  
  11. void add(int u,int v,int w){
  12. to[++cnt]=v; fl[cnt]=w; nxt[cnt]=h[u]; h[u]=cnt;
  13. to[++cnt]=u; fl[cnt]=; nxt[cnt]=h[v]; h[v]=cnt;
  14. }
  15.  
  16. void add2(int u,int v){ to2[++cnt2]=v; nxt2[cnt2]=h2[u]; h2[u]=cnt2; }
  17.  
  18. bool bfs(){
  19. rep(i,,nd) dis[i]=; q[]=S; dis[S]=;
  20. for (int st=,ed=; st!=ed; ){
  21. int x=q[++st];
  22. For(i,x) if (fl[i] && !dis[k=to[i]]) dis[k]=dis[x]+,q[++ed]=k;
  23. }
  24. return dis[T];
  25. }
  26.  
  27. int dfs(int x,int lim){
  28. if (x==T) return lim;
  29. int c=;
  30. for (int &i=cur[x],k; i; i=nxt[i])
  31. if (fl[i] && dis[k=to[i]]==dis[x]+){
  32. int t=dfs(k,min(lim-c,fl[i]));
  33. c+=t; fl[i]-=t; fl[i^]+=t;
  34. if (c==lim) return c;
  35. }
  36. if (!c) dis[x]=-;
  37. return c;
  38. }
  39.  
  40. int dinic(){
  41. int ans=;
  42. while (bfs()){
  43. rep(i,,nd) cur[i]=h[i];
  44. ans+=dfs(S,inf);
  45. }
  46. return ans;
  47. }
  48.  
  49. void ins(int &x,int L,int R,int p,int k){
  50. x=++nd;
  51. if (L==R){ add(k,x,inf); return; }
  52. int mid=(L+R)>>;
  53. if (p<=mid) ins(ls[x],L,mid,p,k); else ins(rs[x],mid+,R,p,k);
  54. if (ls[x]) add(ls[x],x,inf);
  55. if (rs[x]) add(rs[x],x,inf);
  56. }
  57.  
  58. void link(int x,int L,int R,int l,int r,int k){
  59. if (!x) return;
  60. if (L==l && r==R){ add(x,k,inf); return; }
  61. int mid=(L+R)>>;
  62. if (r<=mid) link(ls[x],L,mid,l,r,k);
  63. else if (l>mid) link(rs[x],mid+,R,l,r,k);
  64. else link(ls[x],L,mid,l,mid,k),link(rs[x],mid+,R,mid+,r,k);
  65. }
  66.  
  67. int merge(int x,int y,int L,int R){
  68. if (!x || !y) return x+y;
  69. int mid=(L+R)>>,k=++nd;
  70. if (L==R){ add(x,k,inf); add(y,k,inf); return k; }
  71. ls[k]=merge(ls[x],ls[y],L,mid);
  72. rs[k]=merge(rs[x],rs[y],mid+,R);
  73. if (ls[k]) add(ls[k],k,inf);
  74. if (rs[k]) add(rs[k],k,inf);
  75. return k;
  76. }
  77.  
  78. void dfs(int x){
  79. ins(rt[x],,n,a[x],x);
  80. for (int i=h2[x],k; i; i=nxt2[i])
  81. dfs(k=to2[i]),rt[x]=merge(rt[x],rt[k],,n);
  82. }
  83.  
  84. int main(){
  85. freopen("bzoj3681.in","r",stdin);
  86. freopen("bzoj3681.out","w",stdout);
  87. scanf("%d%d",&n,&m); S=n+m+; nd=T=n+m+;
  88. rep(i,,n) scanf("%d",&fa[i]),add2(fa[i],i);
  89. rep(i,,n) scanf("%d",&a[i]),add(S,i,);
  90. dfs();
  91. rep(i,,m){
  92. scanf("%d%d%d%d",&l,&r,&d,&t);
  93. link(rt[d],,n,l,r,i+n); add(i+n,T,t);
  94. }
  95. printf("%d\n",dinic());
  96. return ;
  97. }

[BZOJ3681]Arietta(可持久化线段树合并优化建图+网络流)的更多相关文章

  1. 【BZOJ3681】Arietta 树链剖分+可持久化线段树优化建图+网络流

    [BZOJ3681]Arietta Description Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中.但是她从未停止过和恋人 Velding 的书信往来.一 ...

  2. LOJ #2537. 「PKUWC 2018」Minimax (线段树合并 优化dp)

    题意 小 \(C\) 有一棵 \(n\) 个结点的有根树,根是 \(1\) 号结点,且每个结点最多有两个子结点. 定义结点 \(x\) 的权值为: 1.若 \(x\) 没有子结点,那么它的权值会在输入 ...

  3. BZOJ 4771 七彩树(可持久化线段树合并)

    题意 https://www.lydsy.com/JudgeOnline/problem.php?id=4771 思路 和 HDU 3333 其实有点像,不过是把序列的问题放在了树上,多维护一个深度即 ...

  4. BZOJ - 4771 七彩树 (可持久化线段树合并)

    题目链接 对每个结点建立两棵线段树,一棵记录该结点的子树下每种颜色对应的最小深度,另一棵记录子树下的每个深度有多少结点(每种颜色的结点只保留最浅的深度即可),自底而上令父节点继承子结点的线段树,如果合 ...

  5. 【NOI2019】弹跳(KDT优化建图)

    Description 平面上有 \(n\) 个点,分布在 \(w \times h\) 的网格上.有 \(m\) 个弹跳装置,由一个六元组描述.第 \(i\) 个装置有参数:\((p_i, t_i, ...

  6. CF786B Legacy(线段树优化建图)

    嘟嘟嘟 省选Day1T2不仅考了字符串,还考了线段树优化建图.当时不会,现在赶快学一下. 线段树能优化的图就是像这道题一样,一个点像一个区间的点连边,或一个区间像一个点连边.一个个连就是\(O(n ^ ...

  7. BZOJ5461 PKUWC2018Minimax(概率期望+线段树合并+动态规划)

    离散化后,容易想到设f[i][j]为i节点权值为j的概率,不妨设j权值在左子树,则有f[i][j]=f[lson][j](pi·f[rson][1~j]+(1-pi)·f[rson][j~m]). 考 ...

  8. [NOI2018]你的名字(SAM+线段树合并)

    考虑l=1,r=n的68分,对S和T建SAM,对T的SAM上的每个节点,计算它能给答案带来多少贡献. T上节点x代表的本质不同的子串数为mx[x]-mx[fa[x]],然后需要去掉所代表子串与S的最长 ...

  9. uoj#388. 【UNR #3】配对树(线段树合并)

    传送门 先考虑一个贪心,对于一条边来说,如果当前这个序列中在它的子树中的元素个数为奇数个,那么这条边就会被一组匹配经过,否则就不会 考虑反证法,如果在这条边两边的元素个数都是偶数,那么至少有两组匹配经 ...

随机推荐

  1. 从库延迟增大,MySQL日志出现InnoDB: page_cleaner: 1000ms intended loop took 17915ms.

    今天同事负责的数据库从库出现从库延迟增大,MySQL日志InnoDB: page_cleaner: 1000ms intended loop took 17915ms. 了解原因,keepalived ...

  2. 【django学习】request.POST与request.POST.get两者主要区别

    本文链接:https://blog.csdn.net/xun527/article/details/87777576request.POST是用来接收前端传过来的数据 一.request.POST.g ...

  3. adc0和adc1

    1 单片机里ADC是数模转换器:功能就是将模拟信号(电压0-5V)转换成数字信号 可以转换成8位数字量(即00H~FFH)也可以转换成10位.12位.16位的数字量.转换后的数字量与模拟量在数值上成正 ...

  4. SSA与ASS字幕

    SSA字幕与ASS字幕 SSA全称SubStationAlpha,是由CSLow(又称Kotus)创建的一种字幕格式,用以实现比传统字幕诸如srt等格式更为复杂的功能.SSA目前的版本为v4.00.S ...

  5. AI人工智能学习数据集

    AI人工智能学习数据集,列表如下. 商务合作,科技咨询,版权转让:向日葵,135—4855__4328,xiexiaokui#qq.com boston_house_prices.csvbreast_ ...

  6. flutte的第一个hello world程序

    用命令行创建项目: flutter create flutterdemo VSCode或者AS连接手机后 输入 flutter run 编译后就可以将默认的代码显示在手机上了 开始写hello wor ...

  7. 004-行为型-03-观察者模式(Observer)

    一.概述 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象. 定义了对象之间的一对多依赖,让多个观察者对象同时监听某一 ...

  8. Composer三步曲:安装、使用、发布

    转载地址:https://segmentfault.com/a/1190000011858458 原文是在我自己博客中,小伙伴也可以点阅读原文进行跳转查看,还有好听的背景音乐噢~ 在现代化的PHP开发 ...

  9. ES6深入浅出-8 新版的类(下集)-2.全部语法

    解答提问 两边都没有构造函数的情况 父类没有构造函数,子类有构造函数的情况 下面用到的了this.body这个属性,所以super()必须要放在这行代码的上面. 在调用this之前必须调用super( ...

  10. 报错:(未解决)java.lang.VerifyError: Instruction type does not match stack map

    报错背景: CDH中集成kafka的服务,解决完kafka的jar包报错之后重启,发现这个报错. 报错现象: java.lang.VerifyError: Instruction type does ...