璟雯院

珺璟如晔,雯华若锦

用户工具

站点工具


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 由 温婕莺