题解 魔法

传送门

先来个结论:如果有 \(R+B\) 个数是符合条件的,则直接将其删掉没有后效性
于是用一个栈维护这个东西,如果栈顶的 \(R+B\) 个符合要求了就删掉
如果最后栈里还有剩的元素则无解

Code:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 100010
#define ll long long
#define pb push_back
//#define int long long

int n, m, r, b;
char s[N];

namespace force{
	int sta[N], rsta[N], bsta[N], top, cnt;
	vector<int> v[N];
	void solve() {
		for (int i=1; i<=n; ++i) {
			sta[++top]=i;
			if (s[i]=='R') rsta[top]=1, bsta[top]=0;
			else rsta[top]=0, bsta[top]=1;
			rsta[top]+=rsta[top-1]; bsta[top]+=bsta[top-1];
			if (top>=m && rsta[top]-rsta[top-m]==r && bsta[top]-bsta[top-m]==b) {
				++cnt;
				for (int j=1; j<=m; ++j) v[cnt].pb(sta[top--]);
			}
		}
		if (top) {puts("NO"); exit(0);}
		assert(0);
		puts("YES");
		printf("%d\n", cnt);
		for (int i=cnt; i; --i) {
			for (auto j:v[i]) printf("%d ", j);
			printf("\n");
		}
		exit(0);
	}
}

signed main()
{
	freopen("magic.in", "r", stdin);
	freopen("magic.out", "w", stdout);

	scanf("%d%d%d", &n, &r, &b); m=r+b;
	scanf("%s", s+1);
	force::solve();

	return 0;
}
posted @ 2021-10-25 06:22  Administrator-09  阅读(0)  评论(0编辑  收藏  举报