VOCARD - Trò chơi chọn bài

Tác giả: flashmt

Ngôn ngữ: C++

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 2000200;

int n, k, f, st[N], pos[N], tail, head, sum;
char card[N];

int main()
{
	cin >> n >> k;
	scanf("%s", card);
	
	pos[0] = -1;
	for (int i = 0; i < n; i++)
	{
		sum += card[i] - '0';
		while (i - pos[head] > k) head++;
		f = sum - st[head];
		while (tail >= head && f <= st[tail]) tail--;
		st[++tail] = f;
		pos[tail] = i;
	}
	
	if (f * 2 == sum) puts("NO");
	else
	{
		puts("YES");
		cout << min(f, sum - f) << endl;
	}
}

Download