[BZOJ3681]Arietta(可持久化线段树合并优化建图+网络流)
暴力建图显然就是S->i连1,i->j'连inf(i为第j个力度能弹出的音符),j'->T连T[j]。
由于是“某棵子树中权值在某区间内的所有点”都向某个力度连边,于是线段树优化建图。由于是在树上所以需要可持久化线段树合并。
理论上可能空间会被卡,但是实际上并不能卡掉,边数最大点都不超过100W。
相比之下不太清楚为什么网上的dsu on tree做法为什么理论上就能过(可能是常数问题?),以及不理解为什么不用普通的启发式合并而非要用轻重链剖分。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
using namespace std; const int N=,M=,inf=1e9;
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];
int cnt=,cnt2,h[M],to[M<<],nxt[M<<],fl[M<<],h2[N],to2[N],nxt2[N]; void add(int u,int v,int w){
to[++cnt]=v; fl[cnt]=w; nxt[cnt]=h[u]; h[u]=cnt;
to[++cnt]=u; fl[cnt]=; nxt[cnt]=h[v]; h[v]=cnt;
} void add2(int u,int v){ to2[++cnt2]=v; nxt2[cnt2]=h2[u]; h2[u]=cnt2; } bool bfs(){
rep(i,,nd) dis[i]=; q[]=S; dis[S]=;
for (int st=,ed=; st!=ed; ){
int x=q[++st];
For(i,x) if (fl[i] && !dis[k=to[i]]) dis[k]=dis[x]+,q[++ed]=k;
}
return dis[T];
} int dfs(int x,int lim){
if (x==T) return lim;
int c=;
for (int &i=cur[x],k; i; i=nxt[i])
if (fl[i] && dis[k=to[i]]==dis[x]+){
int t=dfs(k,min(lim-c,fl[i]));
c+=t; fl[i]-=t; fl[i^]+=t;
if (c==lim) return c;
}
if (!c) dis[x]=-;
return c;
} int dinic(){
int ans=;
while (bfs()){
rep(i,,nd) cur[i]=h[i];
ans+=dfs(S,inf);
}
return ans;
} void ins(int &x,int L,int R,int p,int k){
x=++nd;
if (L==R){ add(k,x,inf); return; }
int mid=(L+R)>>;
if (p<=mid) ins(ls[x],L,mid,p,k); else ins(rs[x],mid+,R,p,k);
if (ls[x]) add(ls[x],x,inf);
if (rs[x]) add(rs[x],x,inf);
} void link(int x,int L,int R,int l,int r,int k){
if (!x) return;
if (L==l && r==R){ add(x,k,inf); return; }
int mid=(L+R)>>;
if (r<=mid) link(ls[x],L,mid,l,r,k);
else if (l>mid) link(rs[x],mid+,R,l,r,k);
else link(ls[x],L,mid,l,mid,k),link(rs[x],mid+,R,mid+,r,k);
} int merge(int x,int y,int L,int R){
if (!x || !y) return x+y;
int mid=(L+R)>>,k=++nd;
if (L==R){ add(x,k,inf); add(y,k,inf); return k; }
ls[k]=merge(ls[x],ls[y],L,mid);
rs[k]=merge(rs[x],rs[y],mid+,R);
if (ls[k]) add(ls[k],k,inf);
if (rs[k]) add(rs[k],k,inf);
return k;
} void dfs(int x){
ins(rt[x],,n,a[x],x);
for (int i=h2[x],k; i; i=nxt2[i])
dfs(k=to2[i]),rt[x]=merge(rt[x],rt[k],,n);
} int main(){
freopen("bzoj3681.in","r",stdin);
freopen("bzoj3681.out","w",stdout);
scanf("%d%d",&n,&m); S=n+m+; nd=T=n+m+;
rep(i,,n) scanf("%d",&fa[i]),add2(fa[i],i);
rep(i,,n) scanf("%d",&a[i]),add(S,i,);
dfs();
rep(i,,m){
scanf("%d%d%d%d",&l,&r,&d,&t);
link(rt[d],,n,l,r,i+n); add(i+n,T,t);
}
printf("%d\n",dinic());
return ;
}
[BZOJ3681]Arietta(可持久化线段树合并优化建图+网络流)的更多相关文章
- 【BZOJ3681】Arietta 树链剖分+可持久化线段树优化建图+网络流
[BZOJ3681]Arietta Description Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中.但是她从未停止过和恋人 Velding 的书信往来.一 ...
- LOJ #2537. 「PKUWC 2018」Minimax (线段树合并 优化dp)
题意 小 \(C\) 有一棵 \(n\) 个结点的有根树,根是 \(1\) 号结点,且每个结点最多有两个子结点. 定义结点 \(x\) 的权值为: 1.若 \(x\) 没有子结点,那么它的权值会在输入 ...
- BZOJ 4771 七彩树(可持久化线段树合并)
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=4771 思路 和 HDU 3333 其实有点像,不过是把序列的问题放在了树上,多维护一个深度即 ...
- BZOJ - 4771 七彩树 (可持久化线段树合并)
题目链接 对每个结点建立两棵线段树,一棵记录该结点的子树下每种颜色对应的最小深度,另一棵记录子树下的每个深度有多少结点(每种颜色的结点只保留最浅的深度即可),自底而上令父节点继承子结点的线段树,如果合 ...
- 【NOI2019】弹跳(KDT优化建图)
Description 平面上有 \(n\) 个点,分布在 \(w \times h\) 的网格上.有 \(m\) 个弹跳装置,由一个六元组描述.第 \(i\) 个装置有参数:\((p_i, t_i, ...
- CF786B Legacy(线段树优化建图)
嘟嘟嘟 省选Day1T2不仅考了字符串,还考了线段树优化建图.当时不会,现在赶快学一下. 线段树能优化的图就是像这道题一样,一个点像一个区间的点连边,或一个区间像一个点连边.一个个连就是\(O(n ^ ...
- 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]). 考 ...
- [NOI2018]你的名字(SAM+线段树合并)
考虑l=1,r=n的68分,对S和T建SAM,对T的SAM上的每个节点,计算它能给答案带来多少贡献. T上节点x代表的本质不同的子串数为mx[x]-mx[fa[x]],然后需要去掉所代表子串与S的最长 ...
- uoj#388. 【UNR #3】配对树(线段树合并)
传送门 先考虑一个贪心,对于一条边来说,如果当前这个序列中在它的子树中的元素个数为奇数个,那么这条边就会被一组匹配经过,否则就不会 考虑反证法,如果在这条边两边的元素个数都是偶数,那么至少有两组匹配经 ...
随机推荐
- Unity制作王者荣耀商业级手游
<王者荣耀>这种现象级手机游戏是如何制作出来的呢?本文以<王者荣耀>MOBO类型的多人在线战术竞技游戏为入口,覆盖Unity游戏制作开发前端与Node.js服务器端的开发必备知 ...
- Java_jdbc 基础笔记之一 数据库连接
方式一: 1.创建一个Driver实现类的对象 2.准备连接数据库的基本信息:url,user,password 3.调用Driver接口的connect(url,info)获取数据库连接 * Dri ...
- Mysql中如何查看慢查询以及查看线程
一.MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句 1,slow_query_log这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句. 2,long_query_time ...
- python PIL/cv2/base64相互转换
PIL和cv2是python中两个常用的图像处理库,PIL一般是anaconda自带的,cv2是opencv的python版本.base64在网络传输图片的时候经常用到. ##PIL读取.保存图片方法 ...
- Microsoft OA
Given a string S consisting of N lowercase letters, return the minimum number of letters that must b ...
- python的argparse模块parse_known_args()方法的使用
parse_known_args()方法的用处就是有些时候,你的选项配置可能不会在一个函数或包中调用完成 在很多使用,我们可能会需要根据一些输入的选项,比如在深度学习中,我们可能会根据传入的模型设置- ...
- linux下nacos的1.1.3版本集群部署
windows单机版参见0.9.0.RELEASE版本的spring cloud alibaba nacos实例 ,linux集群版我们还是用上次下载的nacos压缩包,通过rz -y上传到wlf用户 ...
- Laya的动画制作,整图动画,序列图动画,时间轴动画,龙骨动画
参考: Laya动画基础 Egret帧动画工具类 版本:2.1.1.1 序列图动画 白鹭的序列图动画,使用TexureMerger合图,然后使用MovieClip类播放. Laya的话,使用图集打包工 ...
- systemctl service
一.systemctl常用命令 systemctl list-units ##列出当前系统服务的状态 systemctl list-unit-files ##列出服务 ...
- 【 Linux 】Systemd 使用说明(1)
1. 前言 在 CentOS 7 中使用 systemd 取代了 init 的启动模式,这样的更新换代有什么好处呢?首先需要对 init 和 systemd 有个概念的认识. 2. init 概述 在 ...