Educational Codeforces Round 136 (Rated for Div. 2) D. Reset K Edges

这道题目我们可以考虑二分做,二分出最终的深度,然后尝试是否能使用不超过k次操作使得深度符合条件。

考虑如何和判断,我们可以从根节点开始搜索,如果当前点的深度为mid+1,就对当前点进行操作。但很可惜,这种贪心方法可以很容易的举出反例,比如深度为mid的点下面有很多个叶子,此时不应该是修改叶子,而是修改深度为mid的点更优。

考虑反过来贪心,如果我们从叶子开始搜索,如果当前的点的深度为mid1且父节点不是根,则把当前点插到根上。

注意到题目保证了pi<i,所以我们直接倒序枚举就好了。

#include<bits/stdc++.h> using namespace std; using i32 = int32_t; using i64 = long long; const int mod = 1e9 + 7; void solve() { int n, k; cin >> n >> k; vector<int> p(n + 1); for (int i = 2; i <= n; i++) cin >> p[i]; int l = 1, r = n - 1, res = -1; while (l <= r) { int mid = (l + r) / 2, cnt = 0; vector<int> dis(n + 1); for (int i = n; i > 1; i--) { if (dis[i] == mid - 1 and p[i] != 1) cnt++; else dis[p[i]] = max(dis[p[i]], dis[i] + 1); } if (cnt <= k) res = mid, r = mid - 1; else l = mid + 1; } cout << res << "\n"; } i32 main() { ios::sync_with_stdio(false), cin.tie(nullptr); int T; cin >> T; while (T--) solve(); return 0; }

__EOF__

本文作者PHarr
本文链接https://www.cnblogs.com/PHarr/p/18422546.html
关于博主:前OIer,SMUer
版权声明CC BY-NC 4.0
声援博主:如果这篇文章对您有帮助,不妨给我点个赞
posted @   PHarr  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示