Codeforces Round #603 (Div. 2) F. Economic Difficulties dp
F. Economic Difficulties
An electrical grid in Berland palaces consists of 2 grids: main and reserve. Wires in palaces are made of expensive material, so selling some of them would be a good idea!
Each grid (main and reserve) has a head node (its number is 1). Every other node gets electricity from the head node. Each node can be reached from the head node by a unique path. Also, both grids have exactly n nodes, which do not spread electricity further.
In other words, every grid is a rooted directed tree on n leaves with a root in the node, which number is 1. Each tree has independent enumeration and nodes from one grid are not connected with nodes of another grid.
Also, the palace has n electrical devices. Each device is connected with one node of the main grid and with one node of the reserve grid. Devices connect only with nodes, from which electricity is not spread further (these nodes are the tree's leaves). Each grid's leaf is connected with exactly one device.
In this example the main grid contains 6 nodes (the top tree) and the reserve grid contains 4 nodes (the lower tree). There are 3 devices with numbers colored in blue.
It is guaranteed that the whole grid (two grids and n devices) can be shown in this way (like in the picture above):
main grid is a top tree, whose wires are directed 'from the top to the down',
reserve grid is a lower tree, whose wires are directed 'from the down to the top',
devices — horizontal row between two grids, which are numbered from 1 to n from the left to the right,
wires between nodes do not intersect.
Formally, for each tree exists a depth-first search from the node with number 1, that visits leaves in order of connection to devices 1,2,…,n (firstly, the node, that is connected to the device 1, then the node, that is connected to the device 2, etc.).
Businessman wants to sell (remove) maximal amount of wires so that each device will be powered from at least one grid (main or reserve). In other words, for each device should exist at least one path to the head node (in the main grid or the reserve grid), which contains only nodes from one grid.
Input
The first line contains an integer n (1≤n≤1000) — the number of devices in the palace.
The next line contains an integer a (1+n≤a≤1000+n) — the amount of nodes in the main grid.
Next line contains a−1 integers pi (1≤pi≤a). Each integer pi means that the main grid contains a wire from pi-th node to (i+1)-th.
The next line contains n integers xi (1≤xi≤a) — the number of a node in the main grid that is connected to the i-th device.
The next line contains an integer b (1+n≤b≤1000+n) — the amount of nodes in the reserve grid.
Next line contains b−1 integers qi (1≤qi≤b). Each integer qi means that the reserve grid contains a wire from qi-th node to (i+1)-th.
The next line contains n integers yi (1≤yi≤b) — the number of a node in the reserve grid that is connected to the i-th device.
It is guaranteed that each grid is a tree, which has exactly n leaves and each leaf is connected with one device. Also, it is guaranteed, that for each tree exists a depth-first search from the node 1, that visits leaves in order of connection to devices.
Output
Print a single integer — the maximal amount of wires that can be cut so that each device is powered.
Examples
input
3
6
4 1 1 4 2
6 5 3
4
1 1 1
3 4 2
output
5
input
4
6
4 4 1 1 1
3 2 6 5
6
6 6 1 1 1
5 4 3 2
output
6
input
5
14
1 1 11 2 14 14 13 7 12 2 5 6 1
9 8 3 10 4
16
1 1 9 9 2 5 10 1 14 3 7 11 6 12 2
8 16 13 4 15
output
17
Note
For the first example, the picture below shows one of the possible solutions (wires that can be removed are marked in red):
The second and the third examples can be seen below:
题意
给你两棵树,每棵树都恰好有n个叶子,每个叶子都连着一个电机。
让你删除最多的边,使得每个电机都至少能够存在一条路径到某棵树的根。
note很清楚
题解
视频题解 https://www.bilibili.com/video/av77514280/
对于每棵树,维护l[i][j]表示我删掉这个子树的所有边之后,[i,j]这个范围的电机不保证能够全部连上我的根。
用一个dp[i]表示[1,i]区间内,全都能连上根最多能删除多少条边,那么转移就是dp[i]=max(dp[i],dp[j-1]+max(l[j][i]));这样转移。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2005;
vector<int>G[2][maxn];
int dp[maxn],val[2][maxn][maxn],l[2][maxn],r[2][maxn],sz[2][maxn];
int n,a;
void dfs(int _,int x){
if(x!=1)sz[_][x]=1;
for(int i=0;i<G[_][x].size();i++){
int v = G[_][x][i];
dfs(_,v);
l[_][x]=min(l[_][x],l[_][v]);
r[_][x]=max(r[_][x],r[_][v]);
sz[_][x]+=sz[_][v];
}
val[_][l[_][x]][r[_][x]]=max(val[_][l[_][x]][r[_][x]],sz[_][x]);
}
int main(){
cin>>n;
for(int _=0;_<2;_++){
cin>>a;
for(int i=1;i<=a;i++){
l[_][i]=a+1;
r[_][i]=0;
}
for(int i=2;i<=a;i++){
int x;cin>>x;
G[_][x].push_back(i);
}
for(int i=1;i<=n;i++){
int x;cin>>x;
l[_][x]=r[_][x]=i;
}
dfs(_,1);
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
dp[j]=max(dp[j],dp[i-1]+max(val[0][i][j],val[1][i][j]));
}
}
cout<<dp[n]<<endl;
}
Codeforces Round #603 (Div. 2) F. Economic Difficulties dp的更多相关文章
- Codeforces Round #603 (Div. 2)F. Economic Difficulties
F. Economic Difficulties 题目链接: https://codeforces.com/contest/1263/problem/F 题目大意: 两棵树,都有n个叶子节点,一棵树正 ...
- Codeforces Round #471 (Div. 2) F. Heaps(dp)
题意 给定一棵以 \(1\) 号点为根的树.若满足以下条件,则认为节点 \(p\) 处有一个 \(k\) 叉高度为 \(m\) 的堆: 若 \(m = 1\) ,则 \(p\) 本身就是一个 \(k\ ...
- Codeforces Round #527 (Div. 3)F(DFS,DP)
#include<bits/stdc++.h>using namespace std;const int N=200005;int n,A[N];long long Mx,tot,S[N] ...
- Codeforces Round #479 (Div. 3) F. Consecutive Subsequence (DP)
题意:给你一个长度为\(n\)的序列,求一个最长的\({x,x+1,x+2,.....,x+k-1}\)的序列,输出它的长度以及每个数在原序列的位置. 题解:因为这题有个限定条件,最长序列是公差为\( ...
- Codeforces Round #485 (Div. 2) F. AND Graph
Codeforces Round #485 (Div. 2) F. AND Graph 题目连接: http://codeforces.com/contest/987/problem/F Descri ...
- Codeforces Round #486 (Div. 3) F. Rain and Umbrellas
Codeforces Round #486 (Div. 3) F. Rain and Umbrellas 题目连接: http://codeforces.com/group/T0ITBvoeEx/co ...
- Codeforces Round #501 (Div. 3) F. Bracket Substring
题目链接 Codeforces Round #501 (Div. 3) F. Bracket Substring 题解 官方题解 http://codeforces.com/blog/entry/60 ...
- Codeforces Round #499 (Div. 1) F. Tree
Codeforces Round #499 (Div. 1) F. Tree 题目链接 \(\rm CodeForces\):https://codeforces.com/contest/1010/p ...
- Codeforces Round #603 (Div. 2) A. Sweet Problem(水.......没做出来)+C题
Codeforces Round #603 (Div. 2) A. Sweet Problem A. Sweet Problem time limit per test 1 second memory ...
随机推荐
- js Set对象
1.将数组转换成Set对象 let arr1 = new Set([1,2,3,4]) console.log(arr1) //{1,2,3,4} 2.数组去重 let arr2 = new Set( ...
- 控制台提示“Invalid string length”的原因
控制台提示“Invalid string length”,浏览器直接卡掉,是为什么呢? 答:因为在写嵌套循环时,定义的变量重名了,内层和外层用了同一个i变量. -THE END-
- MinU: v2 Vulnhub Walkthrough
主机层面扫描: 22 和 3306 端口 3306 端口默认是MySQL端口,但是这里尝试爆破报错,最后通http访问发现非MySQL协议,而是一个http的服务 http的协议我们进行目录枚举下 枚 ...
- 着色器语言GLSL入门
着色器语言 GLSL (opengl-shader-language)入门大全 -- 转载自: https://github.com/wshxbqq/GLSL-Card
- docker下MySQL的主从复制
MySql的主从复制 sudo docker pull MySQL:5.7 拉取MySQL的镜像文件(版本号为 5.7) sudo docker run -p 3339:3306 --name mas ...
- Office2019新增哪些功能
上一篇文章我们知道了office为什么没有2017/2018版本,那个是因为微软office是时隔三年一更新的软件,这不office2019就出来了.一款软件,只有不断的完善自身功能,进行不断的更新, ...
- LeetCode--回文数(简单)
题目描述: 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解 ...
- Glide缓存流程
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/cPLkefpEb3w12-uoiqzTig作者:连凌能 Android上图片加载的解决方案有多 ...
- docker cp命令出错问题
docker cp 4e6:/etc/nginx/nginx.conf /home/nginx/conf 使用docker在复制官方nginx容器的conf文件时,发生了错误. Error respo ...
- vue路由传参和获取参数
参考链接 https://router.vuejs.org/zh/guide/essentials/passing-props.html#%E5%B8%83%E5%B0%94%E6%A8%A1%E5% ...