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
#include<cstdio> #include<cctype> #include<queue> #include<cmath> #include<cstring> #include<algorithm> #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define ren for(int i=first[x];i;i=next[i]) using namespace std; const int BufferSize=1<<16; char buffer[BufferSize],*head,*tail; inline char Getchar() {if(head==tail) {int l=fread(buffer,1,BufferSize,stdin);tail=(head=buffer)+l;}return *head++; } inline int read() {int x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0';return x*f; } const int maxn=10010; const int MAXN=200010; const int MAXM=1000010; struct Dinic {int n,m,s,t,first[MAXN],next[MAXM];struct Edge {int from,to,flow;}edges[MAXM];int q[MAXN],cur[MAXN],d[MAXN],vis[MAXN],clo;Dinic() {memset(first,-1,sizeof(first));}void AddEdge(int u,int v,int w) {edges[m]=(Edge){u,v,w};next[m]=first[u];first[u]=m++;edges[m]=(Edge){v,u,0};next[m]=first[v];first[v]=m++;}int BFS() {int l=1,r=0;q[++r]=s;vis[s]=++clo;while(l<=r) {int x=q[l++];cur[x]=first[x];for(int i=first[x];i!=-1;i=next[i]) {Edge& e=edges[i];if(e.flow&&vis[e.to]!=clo) {vis[e.to]=clo;d[e.to]=d[x]+1;q[++r]=e.to;}}}return vis[t]==clo;}int DFS(int x,int a) {if(x==t||!a) return a;int flow=0,f;for(int& i=cur[x];i!=-1;i=next[i]) {Edge& e=edges[i];if(d[e.to]==d[x]+1&&(f=DFS(e.to,min(a,e.flow)))) {e.flow-=f;edges[i^1].flow+=f;flow+=f;a-=f;if(!a) break;}}return flow;}int solve(int s,int t) {this->s=s;this->t=t;int flow=0;while(BFS()) flow+=DFS(s,1e9);return flow;} }sol; int n,m,first[maxn],next[maxn],to[maxn],e; void AddEdge(int u,int v) {to[++e]=v;next[e]=first[u];first[u]=e; } int s,t,root[MAXN],ls[MAXN],rs[MAXN],ToT; void insert(int v) {int l=1,r=n;ToT++;while(l<r) {int mid=l+r>>1;if(v<=mid) sol.AddEdge(ToT,ls[ToT]=ToT+1,1e9),r=mid;else sol.AddEdge(ToT,rs[ToT]=ToT+1,1e9),l=mid+1;ToT++;}sol.AddEdge(ToT,t,1); } int merge(int x,int y,int l,int r) {if(x*y==0) return x+y;int o=++ToT,mid=l+r>>1;if(l==r) sol.AddEdge(o,x,1e9),sol.AddEdge(o,y,1e9);else {sol.AddEdge(o,ls[o]=merge(ls[x],ls[y],l,mid),1e9);sol.AddEdge(o,rs[o]=merge(rs[x],rs[y],mid+1,r),1e9);}return o; } void dfs(int x) {ren dfs(to[i]),root[x]=merge(root[x],root[to[i]],1,n);} void query(int o,int l,int r,int ql,int qr) {if(!o) return;if(ql<=l&&r<=qr) sol.AddEdge(ToT,o,1e9);else {int mid=l+r>>1;if(ql<=mid) query(ls[o],l,mid,ql,qr);if(qr>mid) query(rs[o],mid+1,r,ql,qr);} } int main() {n=read();m=read();s=1;t=ToT=2;rep(i,2,n) AddEdge(read(),i);rep(i,1,n) root[i]=ToT+1,insert(read());dfs(1);while(m--) {int l=read(),r=read(),x=read(),k=read();sol.AddEdge(s,++ToT,k);query(root[x],1,n,l,r);}printf("%d\n",sol.solve(s,t));return 0; }
View Code
转载于:https://www.cnblogs.com/wzj-is-a-juruo/p/4998975.html
BZOJ3681: Arietta相关推荐
- php网页爬虫-简单的类
class PhpSpiders { public $useragent ; //user-agent public $title ; // 标题 public $encoding ; //编码 pu ...
- 【BZOJ-3681】Arietta 网络流 + 线段树合并
3681: Arietta Time Limit: 20 Sec Memory Limit: 64 MB Submit: 182 Solved: 70 [Submit][Status][Discu ...
- 【BZOJ3681】Arietta,主席树优化网络流
传送门 思路: 题目来源于Contest Hunter 红太阳mrazer和我说的 第一次做这种数据结构优化网络流的题目之前只是停留在口胡的地步 网上的题解不多,官方题解给出的比较标准的做法是线段树合 ...
- 今天是Mozart--my favorite musician--的忌辰
莫扎特(Wolfgang Amadeus Mozart,1756年1月27日-1791年12月5日),著名古典音乐家,维也纳古典主义的代表人物. 他出生於奥地利,父亲是萨尔兹堡的宫廷乐师,其在莫扎特六 ...
- 创作类游戏《塞尔达传说:旷野之息》风格的水着色器
<塞尔达传说:旷野之息>是任天堂游戏公司出版发行的开放世界动作冒险游戏.发售以来获得业界极高评价,2017年获金摇杆奖年度最佳游戏奖,TGA 2017年度最佳游戏. 来自德国柏林22岁的F ...
最新文章
- R语言使用ggplot2包使用geom_boxplot函数绘制基础分组缺口箱图(notch boxplot)实战
- Navicat Premium 12.0.24破解
- 支付宝支付-常用支付API详解(查询、退款、提现等)-转
- H3C 使用命令视图
- SQLServer Agent无法启动,提示错误1069
- 谈“发表(撰写)学术论文的注意事项”
- mysql字符集排序规则_Mysql 字符集及排序规则
- AcWing 1230. K倍区间
- 《20天吃透Pytorch》Pytorch自动微分机制学习
- 怎么把汇编语言变成c语言,如何把汇编语言转换成C语言
- php基础之时间格式化
- [转]Boost智能指针——scoped_ptr
- fatal: unable to access 'https://github.com:***' 或者本机ping不通github.com解决方法
- 一文学懂risc-v汇编操作
- 应用之星:H5制作教程-最好用的H5制作工具
- RTI_DDS使用参与者QoS属性编辑传输TCP
- 计算机操作系统-操作系统的定义
- 详解Linux 和 GNU 系统的关系
- 基于Java的奖学金评定系统的设计
- iOS 日记app的制作过程(Objective-C)