【BZOJ-3681】Arietta 网络流 + 线段树合并
3681: Arietta
Time Limit: 20 Sec Memory Limit: 64 MB
Submit: 182 Solved: 70
[Submit][Status][Discuss]
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
Source
Shinrein祭 #1
Solution
怎么看都和A+B problem很类似,所以肯定是 主席树优化构图 + 网络流
这样的树形态主席树,用线段树合并会很方便得到每个子树对应的主席树形态,注意一下细节就好了,数组大小得斟酌着开!!!..
这样的话,点数大概是$O(2NlogN+M)$级,边数大概在$O(2NlogN+MlogL)$级。
但是这题内存64M还是有点小卡的..一开始没有判断lson和rson是否存在就直接连边了,造成连了大量无用的边,MLE了一次,在连边的时候注意一下是否有意义即可。
不知道程序里好像有什么奇怪的地方..本机拍一组大样例RE..因为连边时有某个点编号连完后变大了10倍..其余的应该是没什么问题..谁知道这沙茶程序出了啥毛病(捂脸
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
inline int read()
{int x=0,f=1; char ch=getchar();while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}return x*f;
}#define MAXN 400010
#define INF 0x7fffffffint N,M,sz=1;struct EdgeNode{int next,to,cap;
}edge[1000010];
int head[MAXN],cnt=1;
inline void AddEdge(int u,int v,int w) {cnt++; edge[cnt].next=head[u]; head[u]=cnt; edge[cnt].to=v; edge[cnt].cap=w;}
inline void InsertEdge(int u,int v,int w) {/*printf("<%d,%d>%d\n",u,v,w);*/ AddEdge(u,v,w); AddEdge(v,u,0);}int h[MAXN],cur[MAXN],S,T;
queue<int>q;
inline bool Bfs()
{for (int i=0; i<=sz; i++) h[i]=-1;q.push(S); h[S]=0;while (!q.empty()) {int now=q.front(); q.pop();for (int i=head[now]; i; i=edge[i].next)if (edge[i].cap && h[edge[i].to]==-1)h[edge[i].to]=h[now]+1,q.push(edge[i].to);}return h[T]!=-1;
}inline int Dfs(int now,int low)
{if (now==T) return low;int w,used=0;for (int i=cur[now]; i; i=edge[i].next)if (edge[i].cap && h[edge[i].to]==h[now]+1) {int w=Dfs(edge[i].to,min(low-used,edge[i].cap));edge[i].cap-=w; edge[i^1].cap+=w; used+=w;if (used==low) return used;if (edge[i].cap) cur[now]=i;}if (!used) h[now]=-1;return used;
}inline int Dinic()
{int re=0;while (Bfs()) {for (int i=0; i<=sz; i++) cur[i]=head[i];re+=Dfs(S,INF);}return re;
}struct SgtNode{int lson,rson;
}tree[10010*80];int root[MAXN];
inline void Insert(int &x,int l,int r,int pos)
{x=++sz;if (l==r) {InsertEdge(x,T,1);return;}int mid=(l+r)>>1;if (pos<=mid) Insert(tree[x].lson,l,mid,pos),InsertEdge(x,tree[x].lson,INF);else Insert(tree[x].rson,mid+1,r,pos),InsertEdge(x,tree[x].rson,INF);
}inline int Merge(int x,int y,int l,int r)
{if (!x || !y) return x|y;int z=++sz;if (l==r) {InsertEdge(z,x,INF),InsertEdge(z,y,INF);return z;}int mid=(l+r)>>1;tree[z].lson=Merge(tree[x].lson,tree[y].lson,l,mid);if (tree[z].lson) InsertEdge(z,tree[z].lson,INF);tree[z].rson=Merge(tree[x].rson,tree[y].rson,mid+1,r);if (tree[z].rson) InsertEdge(z,tree[z].rson,INF);return z;
}inline void Query(int x,int l,int r,int L,int R,int id)
{if (!x) return;if (L<=l && R>=r) {InsertEdge(id,x,INF);return;}int mid=(l+r)>>1;if (L<=mid) Query(tree[x].lson,l,mid,L,R,id);if (R>mid) Query(tree[x].rson,mid+1,r,L,R,id);
}vector<int>son[MAXN];
inline void DFS(int now)
{for (int i=0; i<son[now].size(); i++) {DFS(son[now][i]);root[now]=Merge(root[now],root[son[now][i]],1,N);}
}int main()
{N=read(),M=read();for (int i=2,x; i<=N; i++) x=read(),son[x].push_back(i);S=0,T=1;for (int i=1,x; i<=N; i++) x=read(),Insert(root[i],1,N,x);DFS(1);for (int i=1; i<=M; i++) {int L=read(),R=read(),D=read(),Ti=read();InsertEdge(S,++sz,Ti); Query(root[D],1,N,L,R,sz);}printf("%d\n",Dinic());return 0;
}
转载于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/6621194.html
【BZOJ-3681】Arietta 网络流 + 线段树合并相关推荐
- UOJ #395 BZOJ 5417 Luogu P4770 [NOI2018]你的名字 (后缀自动机、线段树合并)
NOI2019考前做NOI2018题.. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=5417 (luogu) http ...
- BZOJ 3277 串 BZOJ 3473 字符串 (广义后缀自动机、时间复杂度分析、启发式合并、线段树合并、主席树)...
标签那么长是因为做法太多了... 题目链接: (bzoj 3277) https://www.lydsy.com/JudgeOnline/problem.php?id=3277 (bzoj 3473) ...
- BZOJ 4719: [Noip2016]天天爱跑步 线段树合并
title BZOJ 4719 LUOGU 1600 简化题意: 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每 ...
- BZOJ.2212.[POI2011]Tree Rotations(线段树合并)
题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...
- BZOJ.4552.[HEOI2016/TJOI2016]排序(线段树合并/二分 线段树)
题目链接 对于序列上每一段连续区间的数我们都可以动态开点建一棵值域线段树.初始时就是\(n\)棵. 对于每次操作,我们可以将\([l,r]\)的数分别从之前它所属的若干段区间中分离出来,合并. 对于升 ...
- BZOJ 3910 并查集+线段树合并
思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...
- 【BZOJ5469】[FJOI2018]领导集团问题(动态规划,线段树合并)
[BZOJ5469][FJOI2018]领导集团问题(动态规划,线段树合并) 题面 BZOJ 洛谷 题解 题目就是让你在树上找一个最大的点集,使得两个点如果存在祖先关系,那么就要满足祖先的权值要小于等 ...
- 线段树合并与分裂维护树上最长上升子序列 + 点分治删点 ---- 2021 牛客多校第一场 C - Cut the tree(详解)
题目大意: 给你一个树,树上每个点都有一个权值valnodeval_{node}valnode,路径(u,v)(u,v)(u,v) 上所有点按顺序有序序列,令f(u,v)f(u,v)f(u,v)是这 ...
- 线段树分裂与合并 ---- 树上差分 P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
题目链接 解题思路: 首先题目是对u,vu,vu,v这两条路径上面添加一个zzz,然后运用树上点的差分思想,对于分发路径u,vu,vu,v,我们在uuu上+1+1+1,在vvv上+1+1+1,在lca ...
最新文章
- 【工具软件】webstorm如何使用快捷键生成固定代码
- c++ vscode 第三方库_Windows平台配置VSCode的C/C++环境,超清晰
- Linux批量文件名大小写转换,Linux中批量把目录内文件名转换大小写用tr
- golang常见字符串操作函数
- 计蒜客/51Nod题目
- Error:Unable to resolve target android-19
- tab s6 linux on dex,S Pen + DeX模式 三星Galaxy Tab S6让你秒变办公达人
- 计算机科学在航空航天仿真模拟,2016年南京航空航天大学计算机科学与技术学院541计算机综合基础之数据结构复试笔试仿真模拟题...
- 中职读计算机什么专业好,读职校选择什么专业好一些
- 真香!谷歌终与美国国防部合作,签署百万美金云服务合同
- 问题六十九:阴影(Shadow)——原理和C++实现
- 系统学习深度学习(二) --自编码器,DA算法,SDA,稀疏自编码器
- 虚拟机下安装BackTrack5 (BT5)教程及BT5汉化
- 通俗易懂的讲解贝叶斯原理(保证简单)
- wifi分析仪android 9,Wifi分析仪(无线信号检测)
- 有关计算机知识的外文翻译,计算机专业外文翻译+原文-DBMS和MIS
- tcp图片13包java怎么接收_13. TCP协议中的动态数据传输:应对小数据包
- 小米路由器4刷padavan固件
- 安霸平台gpio扩展芯片aw9523b调试
- POJ1845(约数之和)
热门文章
- oracle 11g 企业版 标准版,Oracle 数据库11g 第 2 版 标准版、企业版 下载
- html情侣计时器,情侣计时间的app,有没有什么计算情侣在一起 或
- 转载 mysql 数据库优化配置实例
- 【Linux入门到精通系列讲解】一些基础问题
- C语言中链表的英文名字,数据结构C语言版 循环链表表示和实现(国外英文).doc
- 计算机编程免费ppt,计算机编程与C概述课件.ppt
- win10定时关机c语言,Win10系统怎么定时关机?Windows10设置定时关机的两种方法
- ipconfig不是内部或外部_OSPF外部路由详解-LSA4-LSA5
- python中else什么意思_python中的else语句
- java打字母小游戏总结与收获,java:打字母小游戏demo