bzoj3681: Arietta(网络流)
主席树优化建图?
然而我连代码都看不懂
贴个题解好了->这里
//minamoto
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#define inf 0x3f3f3f3f
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=;
int head[N*],dep[N*],cur[N*],ver[N*],edge[N*],Next[N*],tot=;
int fa[N],L[N*],R[N*],sz[N],son[N],rt[N],v[N];
queue<int> q;vector<int> ch[N];int S,T,cnt,n,m;
inline void add(int u,int v,int e){
ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e;
ver[++tot]=u,Next[tot]=head[v],head[v]=tot,edge[tot]=;
}
bool bfs(){
while(!q.empty()) q.pop();
for(int i=S;i<=T;++i) cur[i]=head[i];
memset(dep,-,sizeof(dep));
q.push(S),dep[S]=;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=Next[i]){
int v=ver[i];
if(dep[v]<&&edge[i]){
dep[v]=dep[u]+,q.push(v);
if(v==T) return true;
}
}
}
return false;
}
int dfs(int u,int limit){
if(u==T||!limit) return limit;
int flow=,f;
for(int i=cur[u];i;cur[u]=i=Next[i]){
int v=ver[i];
if(dep[v]==dep[u]+&&(f=dfs(v,min(limit,edge[i])))){
flow+=f,limit-=f;
edge[i]-=f,edge[i^]+=f;
if(!limit) break;
}
}
if(!flow) dep[u]=-;
return flow;
}
int dinic(){
int flow=;
while(bfs()) flow+=dfs(S,inf);
return flow;
}
void update(int &p,int x,int l,int r,int a,int b){
p=++cnt;
if(l==r){
add(p+n,b,inf);
if(x) add(p+n,x+n,inf);
return;
}
int mid=l+r>>;
if(a<=mid) R[p]=R[x],update(L[p],L[x],l,mid,a,b);
else L[p]=L[x],update(R[p],R[x],mid+,r,a,b);
}
inline void getall(int x,int y){
update(rt[x],rt[x],,n,v[y],y);
for(int i=,s=ch[y].size();i<s;++i) getall(x,ch[y][i]);
}
void DFS(int u){
sz[u]=;
for(int i=,s=ch[u].size();i<s;++i){
int v=ch[u][i];
DFS(v),sz[u]+=sz[v];
if(sz[v]>sz[son[u]]) son[u]=v;
}
update(rt[u],rt[son[u]],,n,v[u],u);
for(int i=,s=ch[u].size();i<s;++i)
if(ch[u][i]!=son[u]) getall(u,ch[u][i]);
}
void query(int p,int l,int r,int ql,int qr,int x){
if(!p) return;
if(ql<=l&&qr>=r) return (void)(add(x+n,p+n,inf));
int mid=l+r>>;
if(ql<=mid) query(L[p],l,mid,ql,qr,x);
if(qr>mid) query(R[p],mid+,r,ql,qr,x);
}
int main(){
//freopen("testdata.in","r",stdin);
n=read(),m=read();
for(int i=;i<=n;++i) fa[i]=read(),ch[fa[i]].push_back(i);
for(int i=;i<=n;++i) v[i]=read();
DFS();
S=;
for(int i=;i<=cnt;++i){
if(L[i]) add(i+n,L[i]+n,inf);
if(R[i]) add(i+n,R[i]+n,inf);
}
for(int i=;i<=m;++i){
int l=read(),r=read(),p=read(),t=read();
add(S,(++cnt)+n,t);
query(rt[p],,n,l,r,cnt);
}
T=cnt+n+;
for(int i=;i<=n;++i) add(i,T,);
printf("%d\n",dinic());
return ;
}
bzoj3681: Arietta(网络流)的更多相关文章
- 【BZOJ-3681】Arietta 网络流 + 线段树合并
3681: Arietta Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 182 Solved: 70[Submit][Status][Discuss ...
- [BZOJ3681]Arietta(可持久化线段树合并优化建图+网络流)
暴力建图显然就是S->i连1,i->j'连inf(i为第j个力度能弹出的音符),j'->T连T[j]. 由于是“某棵子树中权值在某区间内的所有点”都向某个力度连边,于是线段树优化建图 ...
- BZOJ3681: Arietta
题解: 数据结构来优化网络流,貌似都是用一段区间来表示一个点,然后各种乱搞... 发现主席树好吊...在树上建主席树貌似有三种方法: 1.建每个点到根节点这条链上的主席树,可以回答和两点间的路径的XX ...
- 【BZOJ3681】Arietta 树链剖分+可持久化线段树优化建图+网络流
[BZOJ3681]Arietta Description Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中.但是她从未停止过和恋人 Velding 的书信往来.一 ...
- 【BZOJ 3681】Arietta
传送门 题目描述 Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中. 但是她从未停止过和恋人 Velding 的书信往来.一天,她准备去探访他. 对着窗外的阳光,临 ...
- plain framework 1 网络流 缓存数据详解
网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...
- 网络流模板 NetworkFlow
身边的小伙伴们都在愉快地刷网络流,我也来写一发模板好了. Network Flow - Maximum Flow Time Limit : 1 sec, Memory Limit : 65536 KB ...
- COGS732. [网络流24题] 试题库
«问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...
- ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)
//有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...
随机推荐
- 关于IDT报错乱码总结
可算是把我折腾坏了.一筹莫展.最后才把这些问题搞好.有些事不知道做以前,怎么都想不到.发现了方法之后,原来也不过这样.我觉得自己记性太差.还是好好写下来吧.写下来顺便会帮我重新再梳理一遍.原先乱码是因 ...
- DFS的简单应用(zoj2110,poj1562)
zoj2110 简单的dfs应用,注意have数组的处理 #include<iostream> #include<cstdio> #include<cstdlib> ...
- 学习完Spring MVC体会
学习完spring mvc感觉很不错,万事开头难,付出定有回报,坚持必将成功
- Asp.net工作流workflow实战(一)
最近开发一个项目用到了工作流引擎,之前研究过微软的workflow所有就用它了,距离上次用有一段时间了,好多东西有点模糊了,就在此处一遍写代码一遍回忆. 首先,在我的项目中新建了.netframwor ...
- netty中的引导Bootstrap客户端
一.Bootstrap Bootstrap 是 Netty 提供的一个便利的工厂类, 我们可以通过它来完成 Netty 的客户端或服务器端的 Netty 初始化.下面我以 Netty 源码例子中的 E ...
- arm-linux-3.4.2移植for2440
----------------------------2440 上内核3.4.2移植------------------------ PS:因wifi项目中无wifi驱动,需新内核. 1.首先在内核 ...
- hibernate 持久化对象的生命周期
持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...
- 2.JasperReports学习笔记2-创建简单的报表例子
转自:http://www.blogjava.net/vjame/archive/2013/10/12/404908.html 一.创建简单的jrxml文件 这里可以手动创建jrxml文件,也可以使用 ...
- mac上如何查看gif
今天生成了一个gif,结果用mac自带的图片预览功能打开,图片被切成一张一张的,不是动图效果了.原以为还得下第三方看图软件,后来百度下发现mac本身也可以打开. 方法一: 鼠标右击图片,选择“快速查看 ...
- 实现hadoop中的机架感知
hadoop中声明是有机架感知的功能,能够提高hadoop的性能.平时我们使用的hadoop集群,实际上是从来没有使用上这个功能的. hadoop中所说的 机架感知的实现实际上这样的: hadoop启 ...