思维题--code forces round# 551 div.2
思维题--code forces round# 551 div.2-D
题目
D. Serval and Rooted Tree
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Now Serval is a junior high school student in Japari Middle School, and he is still thrilled on math as before.
As a talented boy in mathematics, he likes to play with numbers. This time, he wants to play with numbers on a rooted tree.
A tree is a connected graph without cycles. A rooted tree has a special vertex called the root. A parent of a node vv is the last different from vv vertex on the path from the root to the vertex vv. Children of vertex vv are all nodes for which vv is the parent. A vertex is a leaf if it has no children.
The rooted tree Serval owns has nn nodes, node 11 is the root. Serval will write some numbers into all nodes of the tree. However, there are some restrictions. Each of the nodes except leaves has an operation maxmax or minmin written in it, indicating that the number in this node should be equal to the maximum or minimum of all the numbers in its sons, respectively.
Assume that there are kk leaves in the tree. Serval wants to put integers 1,2,…,k1,2,…,k to the kk leaves (each number should be used exactly once). He loves large numbers, so he wants to maximize the number in the root. As his best friend, can you help him?
Input
The first line contains an integer nn (2≤n≤3⋅1052≤n≤3⋅105), the size of the tree.
The second line contains nn integers, the ii-th of them represents the operation in the node ii. 00 represents minmin and 11represents maxmax. If the node is a leaf, there is still a number of 00 or 11, but you can ignore it.
The third line contains n−1n−1 integers f2,f3,…,fnf2,f3,…,fn (1≤fi≤i−11≤fi≤i−1), where fifi represents the parent of the node ii.
Output
Output one integer — the maximum possible number in the root of the tree.
Examples
input
Copy
6
1 0 1 1 0 1
1 2 2 2 2
output
Copy
1
input
Copy
5
1 0 1 0 1
1 1 1 1
output
Copy
4
input
Copy
8
1 0 0 1 0 1 1 0
1 1 2 2 3 3 3
output
Copy
4
input
Copy
9
1 1 0 0 1 0 1 0 1
1 1 2 2 3 3 4 4
output
Copy
5
Note
Pictures below explain the examples. The numbers written in the middle of the nodes are their indices, and the numbers written on the top are the numbers written in the nodes.
In the first example, no matter how you arrange the numbers, the answer is 11.

In the second example, no matter how you arrange the numbers, the answer is 44.

In the third example, one of the best solution to achieve 44 is to arrange 44 and 55 to nodes 44 and 55.

In the fourth example, the best solution is to arrange 55 to node 55.

题意易懂
思路
让所有叶子的值都为1
算的是必要的叶子个数,那么答案就是叶子个数 - 必要的叶子个数 + 1
如果是取max,那么该节点要取最大,那必要的叶子个数取决于该节点的所有子节点中,最小的必要叶子个数
如果是取min,那么该节点要取最大,必要的叶子个数为该节点的所有子节点中,所有的必要叶子个数的和
因为题目输入格式,可以知道父节点的输入一定在子节点前面,所以能遍历
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <sstream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <iomanip>
#include <stack>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int N = 300000+50;
const int MOD = 1e9 + 9;
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define F(i, l, r) for(int i = l;i <= (r);++i)
#define RF(i, l, r) for(int i = l;i >= (r);--i)
vector<int> v[N];
int a[N], c[N];
int n;
int main()
{
cin >> n;
F(i, 1, n) cin >> a[i];
F(i, 2, n)
{
int t;
cin >> t;
v[t].push_back(i);
}
int cnt = 0, ans = 0;
RF(i, n, 1)
{
if(v[i].size() == 0)
{
c[i] = 1;
cnt++;
}
else if(a[i])
{
c[i] = INF;
F(j, 0, v[i].size() - 1)
c[i] = min(c[i], c[v[i][j]]);
}
else
{
F(j, 0, v[i].size() - 1)
c[i] += c[v[i][j]];
}
}
cout << cnt + 1 - c[1] << endl;
return 0;
}
dfs写法
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <sstream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <iomanip>
#include <stack>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int N = 300000+50;
const int MOD = 1e9 + 9;
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define F(i, l, r) for(int i = l;i <= (r);++i)
#define RF(i, l, r) for(int i = l;i >= (r);--i)
vector<int> v[N];
int a[N], c[N];
int n, ant = 0, cnt;
void dfs(int now)
{
if(v[now].size() == 0)
{
c[now] = 1;
cnt++;
}
else if(a[now])
{
c[now] = INF;
F(j, 0, v[now].size() - 1)
{
dfs(v[now][j]);
c[now] = min(c[now], c[v[now][j]]);
}
}
else
{
F(j, 0, v[now].size() - 1)
{
dfs(v[now][j]);
c[now] += c[v[now][j]];
}
}
}
int main()
{
cin >> n;
F(i, 1, n) cin >> a[i];
F(i, 2, n)
{
int t;
cin >> t;
v[t].push_back(i);
}
dfs(1);
cout << cnt + 1 - c[1] << endl;
return 0;
}
思维题--code forces round# 551 div.2的更多相关文章
- 【Codeforces】Codeforces Round #551 (Div. 2)
Codeforces Round #551 (Div. 2) 算是放弃颓废决定好好打比赛好好刷题的开始吧 A. Serval and Bus 处理每个巴士最早到站且大于t的时间 #include &l ...
- CF Round #551 (Div. 2) D
CF Round #551 (Div. 2) D 链接 https://codeforces.com/contest/1153/problem/D 思路 不考虑赋值和贪心,考虑排名. 设\(dp_i\ ...
- 水题 Codeforces Beta Round #70 (Div. 2) A. Haiku
题目传送门 /* 水题:三个字符串判断每个是否有相应的元音字母,YES/NO 下午网速巨慢:( */ #include <cstdio> #include <cstring> ...
- Codeforces Round #551 (Div. 2) E. Serval and Snake (交互题)
人生第一次交互题ac! 其实比较水 容易发现如果查询的矩阵里面包含一个端点,得到的值是奇数:否则是偶数. 所以只要花2*n次查询每一行和每一列,找出其中查询答案为奇数的行和列,就表示这一行有一个端点. ...
- Codeforces Round #551 (Div. 2) 题解
CF1153A 直接做啊,分类讨论即可 #include<iostream> #include<string.h> #include<string> #includ ...
- C. Serval and Parenthesis Sequence 【括号匹配】 Codeforces Round #551 (Div. 2)
冲鸭,去刷题:http://codeforces.com/contest/1153/problem/C C. Serval and Parenthesis Sequence time limit pe ...
- 【做题】Codeforces Round #429 (Div. 2) E. On the Bench——组合问题+dp
题目大意是给你n个数,求相邻两数相乘不是完全平方数的排列数. 一开始看到这题的时候,本人便想给相乘为完全平方数的数对建边,然后就写萎了... 后来通过集体智慧发现这个重要性质:对于自然数a,b,c,若 ...
- Codeforces Round #551 (Div. 2) A~E题解
突然发现上一场没有写,那就补补吧 本来这场应该5题的,结果一念之差E fail了 A. Serval and Bus 基本数学不解释,假如你没有+1 -1真的不好意思见人了 #include<c ...
- 【思维题】TCO14 Round 2C InverseRMQ
全网好像就只有劼和manchery写了博客的样子……:正解可能是最大流?但是仔细特判也能过 题目描述 RMQ问题即区间最值问题是一个有趣的问题. 在这个问题中,对于一个长度为 n 的排列,query( ...
随机推荐
- K8s基于DNS的服务发现(转)
原文地址:https://www.oschina.net/question/2657833_2201246 1.Kubernetes中如何发现服务 ◆ 发现Pod提供的服务 首先使用nginx-d ...
- git 回退到某个特定提交
1.先用git log commit aba290c570d3894f4f39a1fdf52aa512c0231525 Author: huzhengbo <@qq.com> Date: ...
- 进入docker的4种方式
在使用Docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器的方法. 进入Docker容器比较常见的几种 ...
- CodeForces 518B Tanya and Postcard (题意,水题)
题意:给定两个字符串,然后从第二个中找和第一个相同的,如果大小写相同,那么就是YAY,如果大小写不同,那就是WHOOPS.YAY要尽量多,其次WHOOPS也要尽量多. 析:这个题并不难,难在读题懂题意 ...
- 在VMware中设置CentOS7的网络
为了能够使用XShell来管理我们安装好的CentOS7系统,所以我们要先设置CentOS7的网络使其能够联网. 1.选择vmware的编辑,然后点击虚拟网络编辑器 2.点击更改设置(需要有 ...
- 日志文件(关于#IRSA_MDPS_RDM软件 密码登录事项 7月26号)
1.登录:sqlplus 用户名:scott 口令:123 qweas.. //2018-7-16号更改密码 2.查看该用户(已登录)下有几个表:select table_name from user ...
- SQL Server关于存储过程的一点简单使用心得
===========================创建无参无返回值的存储过程===========================create proc pro_nameas--要执行的sql语句 ...
- PipelineDB On Kafka
PipelineDB 安装yum install https://s3-us-west-2.amazonaws.com/download.pipelinedb.com/pipelinedb-0.9.8 ...
- 大坑记录 - shell脚本删除操作
背景 jenkins执行去执行shell命令,其中引用了一些jenkins的变量,如${WORKSPACE}这种,因为每次执行jenkins比较慢,于是想复制脚本出来想本地调试一下,直接复制了脚本过来 ...
- Jquery 记一次使用fullcalendar的使用记录
最近接了一个需求,把excel做的表格开发到系统里,本来想直接做成表格的形式,后来考虑到数据库中的表结构不好设计,最后决定做成日历的形式: 先上成品图 需要引用的js,fullcalendar官网可以 ...