icpc:problems:703d_max_median
目录
problems | |
---|---|
名称 | Max Median |
题目编号 | 703D |
题目链接 | codeforces.com/… |
来源 | CodeForces |
算法分类 | 二分, 前缀和 |
难易程度 | 小有难度 |
Max Median
想法
怎么想也都想不出来这是一个二分答案的题目,而判断答案的可行性。是将比答案小的变成-1,比答案大或者相等的变成1.之后求最大的子串的和,看这个和是不是大于0.如果大于0,那就很显然这个x是可行的,那就把这个x变小。如果最大子段和比0小,那就得把x调大一点。
代码实现
#include<cstdio> #include<algorithm> int n, k, temp; int line[200010]; int t[200010]; int main() { scanf("%d %d", &n, &k); for(int i=1; i<=n; ++i) { scanf("%d", &line[i]); temp = std::max(temp, line[i]); } int l=0, r=temp+1, mid; while(r - l > 1) { mid = (l+r)>>1; for(int i=1; i<=n; ++i) if(line[i]>=mid) t[i] = 1; else t[i] = -1; for(int i=1; i<=n; ++i) t[i] += t[i-1]; int mx = t[k], mn = 0; for(int i=k; i<=n; ++i) { mn = std::min(mn, t[i-k]); mx = std::max(mx, t[i] - mn); } if(mx > 0) l = mid; else r = mid; } printf("%d", l); return 0; }
/app/www/public/data/pages/icpc/problems/703d_max_median.txt · 最后更改: 2023/10/01 09:53 由 温婕莺