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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2015-11-30 Uva 3767 Dynamic len(set(a[L:R])) 树套树
2015-11-30 cdoj 1246 每周一题 拆拆拆~ 分解质因数
2014-11-30 wikioi 1380 没有上司的舞会 树形dp
2014-11-30 wikioi 1434 孪生素数 水题、素数模版
2014-11-30 NOIP 2002提高组 选数 dfs/暴力
2014-11-30 Codeforces Round 486C - Palindrome Transformation 贪心