Codeforces Round #781(C. Tree Infection)
1 second
256 megabytes
standard input
standard output
A tree is a connected graph without cycles. A rooted tree has a special vertex called the root. The parent of a vertex vv (different from root) is the previous to vv vertex on the shortest path from the root to the vertex vv. Children of the vertex vv are all vertices for which vv is the parent.
You are given a rooted tree with nn vertices. The vertex 11 is the root. Initially, all vertices are healthy.
Each second you do two operations, the spreading operation and, after that, the injection operation:
- Spreading: for each vertex vv, if at least one child of vv is infected, you can spread the disease by infecting at most one other child of vv of your choice.
- Injection: you can choose any healthy vertex and infect it.
This process repeats each second until the whole tree is infected. You need to find the minimal number of seconds needed to infect the whole tree.
The input consists of multiple test cases. The first line contains a single integer tt (1≤t≤1e4) — the number of test cases. Description of the test cases follows.
The first line of each test case contains a single integer nn (2≤n≤2e5) — the number of the vertices in the given tree.
The second line of each test case contains n−1n−1 integers p2,p3,…,pnp2,p3,…,pn (1≤pi≤n), where pipi is the ancestor of the ii-th vertex in the tree.
It is guaranteed that the given graph is a tree.
It is guaranteed that the sum of nn over all test cases doesn't exceed 2e5.
1 # include<iostream>
2 # include<algorithm>
3 # include<queue>
4 # define int long long
5 # define endl "\n"
6 using namespace std;
7 const int N = 1000050;
8 int f[N],vis[N];
9
10 void solve(){
11 int n;
12 cin>>n;
13 for(int i = 1;i <= n;++i) f[i] = 0;
14 for(int i = 2;i <= n;++i){
15 int x;
16 cin>>x;
17 f[x]++;
18 }
19 int l = 1,r = n,res = n;
20 while(l <= r){
21 int mid = (l+r)>>1;
22 for(int i = 0;i <= n;++i) vis[i] = 0;
23 priority_queue<pair<int,int> > q;
24
25 for(int i = 1;i <= n;++i) if(f[i]) q.push({f[i],i});
26 q.push({1,0});
27 for(int i = 1;i <= mid;++i){
28 if(q.empty()) break;
29 auto now = q.top();q.pop();
30 if(!vis[now.second]) now.first -=mid - i+1,vis[now.second] = 1;
31 else now.first--;
32 if(now.first > 0) q.push(now);
33 }
34 if(q.empty()) res = mid,r = mid-1;
35 else l = mid+1;
36 }
37 cout<<res<<endl;
38 }
39
40 int tt;
41 signed main(){
42 ios::sync_with_stdio(false);
43 cin.tie(nullptr);
44 cout.tie(nullptr);
45 cin>>tt;
46 while(tt--){
47 solve();
48 }
49
50
51 return 0;
52 }
二分实在是精彩
根据题意将相同父节的个数进排序,每次对个数最多的进行操作
如果尚未被感染则选择注射,如果已经被注射过,则选择传播给相同父节点的子节点
通过priority_queue来进行排序,每次取对头进行操作,通过vis进行对节点(相同父节点)的判断是否被感染过
而二分的是操作次数(二分答案),有两种可能,如果操作次数内使得队列为空说明在当前操作次数可以满足全部感染,继续查找更小的操作次数
否则就不能满足全部感染,查找更大的操作次数
Codeforces Round #781(C. Tree Infection)的更多相关文章
- Codeforces Round #527 F - Tree with Maximum Cost /// 树形DP
题目大意: 给定一棵树 每个点都有点权 每条边的长度都为1 树上一点到另一点的距离为最短路经过的边的长度总和 树上一点到另一点的花费为距离乘另一点的点权 选定一点出发 使得其他点到该点的花费总和是最大 ...
- Educational Codeforces Round 67 E.Tree Painting (树形dp)
题目链接 题意:给你一棵无根树,每次你可以选择一个点从白点变成黑点(除第一个点外别的点都要和黑点相邻),变成黑点后可以获得一个权值(白点组成连通块的大小) 问怎么使权值最大 思路:首先,一但根确定了, ...
- Codeforces Round #499 (Div. 1) F. Tree
Codeforces Round #499 (Div. 1) F. Tree 题目链接 \(\rm CodeForces\):https://codeforces.com/contest/1010/p ...
- Codeforces Round #271 (Div. 2)题解【ABCDEF】
Codeforces Round #271 (Div. 2) A - Keyboard 题意 给你一个字符串,问你这个字符串在键盘的位置往左边挪一位,或者往右边挪一位字符,这个字符串是什么样子 题解 ...
- Codeforces Round #372 (Div. 2)
Codeforces Round #372 (Div. 2) C. Plus and Square Root 题意 一个游戏中,有一个数字\(x\),当前游戏等级为\(k\),有两种操作: '+'按钮 ...
- Codeforces Round #270 A~D
Codeforces Round #270 A. Design Tutorial: Learn from Math time limit per test 1 second memory limit ...
- Codeforces Round #277 (Div. 2) 题解
Codeforces Round #277 (Div. 2) A. Calculating Function time limit per test 1 second memory limit per ...
- CodeForces Round
CodeForces Round 199 Div2 完了,这次做扯了,做的时候有点发烧,居然只做出来一道题,差点被绿. My submissions # When Who Problem ...
- Codeforces Round #257 (Div. 1)A~C(DIV.2-C~E)题解
今天老师(orz sansirowaltz)让我们做了很久之前的一场Codeforces Round #257 (Div. 1),这里给出A~C的题解,对应DIV2的C~E. A.Jzzhu and ...
随机推荐
- P5384[Cnoi2019]雪松果树 (长链剖分)
题面 一棵以 1 1 1 为根的 N N N 个节点的有根树, Q Q Q 次询问,每次问一个点 u u u 的 k k k 级兄弟有多少个(第 k k k 代祖先的第 k k k 代孩子),如果没有 ...
- Hnoi2014世界树
题面 说明/提示 N<=300000, q<=300000,m[1]+m[2]+...+m[q]<=300000 题解 这道题一看 "m[1]+m[2]+...+m[q]& ...
- Windows批量修改文件
如图我是建立了壁纸文件夹 Windows自带的排序方式 如何不用自带的呢? 在这个文件夹里面建一个.txt文件 如下 ok第二步骤 将UTF-8格式改为ANSI格式 点击文件-另存为ANSI格式-替换 ...
- 2020/12/9 酒etf
2020/12/9 2.315建仓酒etf,之后陆续加仓,拿到年底看看 2020/12/12 2.36卖出部分,目前成本2.106,盈利百分之9.449,白酒应该是没问题,但感觉年前应该有波调整. 2 ...
- MyBatis第一个程序
创建一个maven项目,并且在pom.xml导入myBatis和jdbc的jar包 <dependencies> <dependency> <groupId>org ...
- C# 开发过程中常见错误记录及解决说明
1.异常了类型: 1.1.1.1 异常错误信息:An error occurred while updating the entries. See the inner exception for de ...
- 高颜值,类似Fliqlo的翻页时钟-BdTab新标签页插件组件
起因: 很多用户在使用BdTab插件时,反馈说希望添加一个时钟的功能, 而BdTab又是组件模块化的插件,于是在空余时间就用html+js+css写了一款高颜值的分页时钟 源码如下: 需要其他网页组件 ...
- flex常用布局
公共样式: <style> * { margin: 0; padding: 0; } .has-flex { display: flex; } </style> 垂直居中 子元 ...
- Elasticsearch-shell脚本实现定时删除指定时间以前索引
〇.前言 因为elastiflow的数据量还是挺大的,接入了两台交换机的flow数据量已经开始有点大了.所以得写个脚本专门来清理索引 一.如何使用elastic的API 1.手动查询所有索引 在ELK ...
- Python工具箱系列(五)
上一期介绍了Anaconda的安装,本期介绍Miniconda的安装,它们共同的部分是Conda,确实如此.Conda是一个开源的包管理系统,本身的志向非常宏大,要为Python. R. Ruby. ...