Codeforces Round 936 (Div. 2)
A. Median of an Array
题目大意:
- 你只能对任何一个数进行
+1
操作 - 问最少需要多少次操作,可以把中位数
a[i]
变成另一个数
思路:
- 直接倒着枚举即可,因为中位数的位置不会改变,所以只要把当前这个位置后面与它相等的数的个数输出即可
时间复杂度:\(O(n)\)
1 | void solve() { |
B. Maximum Sum
思路:
- 只要找到一个最大子段和,然后一直向那个子段左右添加这个和即可,这样一定会使得结果最大
时间复杂度:\(O(n + k)\)
1 | constexpr int P = 1E9 + 7; |
C. Tree Cutting
思路:
- 首先关注数据范围,\(K,N \le 10^5\) 那么本题一定需要一个 \(O(n)\) 或者 \(O(nlogn)\) 的算法,那么我们要求最大值 \(x\),可以发现要求最大的点集,我们可以二分,这个类似于求连通分量,可以用 \(dfs\) 来求出每一个点所属集合的点集大小,然后来二分 \(x\) 即可
时间复杂度:\(O(nlogn)\)
1 | void solve() { |