【BZOJ3681】Arietta 树链剖分+可持久化线段树优化建图+网络流
【BZOJ3681】Arietta
Description
Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中。
但是她从未停止过和恋人 Velding 的书信往来。一天,她准备去探访他。
对着窗外的阳光,临行前她再次弹起了琴。
她的琴的发声十分特殊。
让我们给一个形式化的定义吧。
所有的 n 个音符形成一棵由音符 C ( 1 号节点) 构成的有根树,每一个音符有一个音高 Hi 。
Arietta 有 m 个力度,第 i 个力度能弹出 Di 节点的子树中,音高在 [Li,Ri] 中的任意一个音符。
为了乐曲的和谐,Arietta 最多会弹奏第 i 个力度 Ti 次。
Arietta 想知道她最多能弹出多少个音符。
Input
输入共 m + 3 行。
第一行两个整数 n, m ,意义如题目所述。
第二行 n - 1 个整数 Pi ,表示节点 i ( i = 2 . . . n ) 的父亲节点的编号。
第三行 n 个整数 Hi 。
接下来的 m 行,每行四个整数 Li,Ri,D,Ti
Output
输出一个整数表示 Arietta 最多能弹奏多少音符。
数据范围与约定
对于 100% 的数据,1 ≤ n, m ≤ 10000 。
对于所有数据,1 ≤ Hi , Ti , Pi ≤ n, 1 ≤ Li ≤ Ri ≤ n 。
Sample Input
1 1 2 2
5 3 2 4 1
1 3 2 1
3 5 1 4
Sample Output
HINT
第一个力度弹奏音符5,第二个力度弹奏音符1,2,4。
数据范围与约定
对于 100% 的数据,1 ≤ n, m ≤ 10000 。
对于所有数据1<=Hi,Ti,Pi<=N,1<=Li<=Ri<=N
题解:树剖还真是神通广大啊~
容易想到用最大流解决,但是边数太大,考虑用线段树优化建图的过程。我们对于每个节点都维护一棵线段树,维护它子树中所有点的音高。然后我们将x的所有儿子的线段树与x合并到一起就得到了x的线段树(然而线段树合并是不资瓷的。)
暴力合并显然边数还是爆炸,但是我们可以对原树进行轻重链剖分,将线段树变成可持久化线段树。对于将x的重儿子与x合并这个过程,直接通过可持久化解决,其余的儿子暴力插入,这样边数就变成$O(nlog^2_n)$的了。
最后在可持久化线段树上连边即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int maxn=10010;
int n,m,tot,cnt,S,T,ans;
int fa[maxn],to[maxn*240],next[maxn*240],val[maxn*240],head[maxn*80],d[maxn*80],v[maxn],rt[maxn],siz[maxn],son[maxn];
vector<int> ch[maxn];
struct sag
{
int ls,rs;
}s[maxn*80];
queue<int> q;
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
inline void add(int a,int b,int c)
{
to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
to[cnt]=a,val[cnt]=0,next[cnt]=head[b],head[b]=cnt++;
}
void insert(int &x,int y,int l,int r,int a,int b)
{
x=++tot;
if(l==r)
{
add(x+n,b,1<<30);
if(y) add(x+n,y+n,1<<30);
return ;
}
int mid=(l+r)>>1;
if(a<=mid) s[x].rs=s[y].rs,insert(s[x].ls,s[y].ls,l,mid,a,b);
else s[x].ls=s[y].ls,insert(s[x].rs,s[y].rs,mid+1,r,a,b);
}
void getall(int x,int y)
{
insert(rt[x],rt[x],1,n,v[y],y);
for(int i=0;i<(int)ch[y].size();i++) getall(x,ch[y][i]);
}
void DFS(int x)
{
siz[x]=1;
for(int i=0;i<(int)ch[x].size();i++)
{
DFS(ch[x][i]),siz[x]+=siz[ch[x][i]];
if(siz[ch[x][i]]>siz[son[x]]) son[x]=ch[x][i];
}
insert(rt[x],rt[son[x]],1,n,v[x],x);
for(int i=0;i<(int)ch[x].size();i++) if(ch[x][i]!=son[x]) getall(x,ch[x][i]);
}
void query(int x,int l,int r,int a,int b,int y)
{
if(!x) return ;
if(a<=l&&r<=b)
{
add(y+n,x+n,1<<30);
return ;
}
int mid=(l+r)>>1;
if(a<=mid) query(s[x].ls,l,mid,a,b,y);
if(b>mid) query(s[x].rs,mid+1,r,a,b,y);
}
inline int dfs(int x,int mf)
{
if(x==T) return mf;
int i,k,temp=mf;
for(i=head[x];i!=-1;i=next[i]) if(d[to[i]]==d[x]+1&&val[i])
{
k=dfs(to[i],min(temp,val[i]));
if(!k) d[to[i]]=0;
val[i]-=k,val[i^1]+=k,temp-=k;
if(!temp) break;
}
return mf-temp;
}
int bfs()
{
while(!q.empty()) q.pop();
memset(d,0,sizeof(d));
int i,u;
q.push(S),d[S]=1;
while(!q.empty())
{
u=q.front(),q.pop();
for(i=head[u];i!=-1;i=next[i]) if(!d[to[i]]&&val[i])
{
d[to[i]]=d[u]+1;
if(to[i]==T) return 1;
q.push(to[i]);
}
}
return 0;
}
int main()
{
//freopen("bz3681.out","w",stdout);
n=rd(),m=rd();
int i,a,b,x,y;
memset(head,-1,sizeof(head));
for(i=2;i<=n;i++) fa[i]=rd(),ch[fa[i]].push_back(i);
for(i=1;i<=n;i++) v[i]=rd();
DFS(1);
S=0;
for(i=1;i<=tot;i++)
{
if(s[i].ls) add(i+n,s[i].ls+n,1<<30);
if(s[i].rs) add(i+n,s[i].rs+n,1<<30);
}
for(i=1;i<=m;i++)
{
a=rd(),b=rd(),x=rd(),y=rd(),add(S,(++tot)+n,y);
query(rt[x],1,n,a,b,tot);
}
T=tot+n+1;
for(i=1;i<=n;i++) add(i,T,1);
while(bfs()) ans+=dfs(S,1<<30);
printf("%d",ans);
return 0;
}
【BZOJ3681】Arietta 树链剖分+可持久化线段树优化建图+网络流的更多相关文章
- BZOJ4012[HNOI2015]开店——树链剖分+可持久化线段树/动态点分治+vector
题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现她们面临着一个 ...
- [GDOI2016] 疯狂动物园 [树链剖分+可持久化线段树]
题面 太长了,而且解释的不清楚,我来给个简化版的题意: 给定一棵$n$个点的数,每个点有点权,你需要实现以下$m$个操作 操作1,把$x$到$y$的路径上的所有点的权值都加上$delta$,并且更新一 ...
- 【BZOJ4704】旅行 树链剖分+可持久化线段树
[BZOJ4704]旅行 Description 在Berland,有n个城堡.每个城堡恰好属于一个领主.不同的城堡属于不同的领主.在所有领主中有一个是国王,其他的每个领主都直接隶属于另一位领主,并且 ...
- BZOJ 2243: [SDOI2011]染色 树链剖分 倍增lca 线段树
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- BZOJ 2243:染色(树链剖分+区间合并线段树)
[SDOI2011]染色Description给定一棵有n个节点的无根树和m个操作,操作有2类:1.将节点a到节点b路径上所有点都染成颜色c:2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认 ...
- HDU 5029 Relief grain 树链剖分打标记 线段树区间最大值
Relief grain Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...
- 【Codeforces】【网络流】【树链剖分】【线段树】ALT (CodeForces - 786E)
题意 现在有m个人,每一个人都特别喜欢狗.另外还有一棵n个节点的树. 现在每个人都想要从树上的某个节点走到另外一个节点,且满足要么这个人自带一条狗m,要么他经过的所有边h上都有一条狗. 2<=n ...
- LOJ2269 [SDOI2017] 切树游戏 【FWT】【动态DP】【树链剖分】【线段树】
题目分析: 好题.本来是一道好的非套路题,但是不凑巧的是当年有一位国家集训队员正好介绍了这个算法. 首先考虑静态的情况.这个的DP方程非常容易写出来. 接着可以注意到对于异或结果的计数可以看成一个FW ...
- HYSBZ 4034 【树链剖分】+【线段树 】
<题目链接> 题目大意: 有一棵点数为 N 的树,以点 1 为根,且树点有权值.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x ...
随机推荐
- javascript 相等运算符
相等运算符 JavaScript提供两个相等运算符:==和===. 简单说,它们的区别是相等运算符(==)比较两个值是否相等,严格相等运算符(===)比较它们是否为“同一个值”.如果两个值不是同一类型 ...
- SQL Server 2008、SQL Server 2008R2 自动备份数据库
让SQL Server 2008自动备份数据库,需要建立一个SQL Server作业,并启动SQL Server代理,使该作业定期运行. 具体来说,可以按以下步骤进行: 一.打开SQL Server ...
- mysql_use_result & mysql_store_result & MYSQLI_ASYNC
博文一 : 在使用 mysql_query() 进行一次查询后,一般要用这两个函数之一来把结果存到一个 MYSQL_RES * 变量中. 两者的主要区别是,mysql_use_result() 的结果 ...
- 【HDU 2586】LCA模板
在一棵树上 求2个点的最短距离.那么首先利用LCA找到2个点的近期公共祖先 公式:ans = dis(x) + dis(y) - 2 * dis(lca(x,y)) 这里的dis(x)指的上x距离根节 ...
- UITableView__cell 距tableview顶端有间距
UITableView__cell 距tableview顶端有间距 如何去掉这个间距呢?解决方法如下: //top 为cell距顶端的间距 (一般为负值) self.formTable.con ...
- 1、Reactive Extensions for .NET(译)
注:本文的工程是基于 vs2010 的,在 vs2012 中区别不大. 本文的意图是让读者熟悉 Reactive Extension for .net(Rx) 的使用.通过一系列的例子,让读者感受 基 ...
- 0068 Git入门的第一节课
这是 猴子都懂的Git入门 的学习笔记 Git安装与配置 下载安装Git:http://git-scm.com/ 从开始菜单启动Git Bash $ git --version git version ...
- swift基础知识
let 声明常量var 声明变量 ?可以为空 !必须为所声明类型 swift中文教程:http://c.biancheng.net/cpp/swift/jiaocheng/
- oracle autotrace
--======================= -- 启用 AUTOTRACE功能 --======================= AUTOTRACE是一个SQL*Plus工具,用于跟踪SQL ...
- jQuery——实现弹窗
window.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...