QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#703044#9536. Athlete Welcome Ceremonyucup-team4975#WA 75ms21004kbC++233.8kb2024-11-02 17:02:002024-11-02 17:02:01

Judging History

This is the latest submission verdict.

  • [2024-11-02 17:02:01]
  • Judged
  • Verdict: WA
  • Time: 75ms
  • Memory: 21004kb
  • [2024-11-02 17:02:00]
  • Submitted

answer

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<queue>
#define int long long
using namespace std;
const int N = 305;
const int P = 1000000007;
int f[N][N][N]
	 [3];  // 到第i位,恰好用了j个a;用了k个b用了i-j-k个c,最后一位恰好用。。。
string s;
int n, q;

int S[N][N], S1[N][N], S2[N][N];  // i a  j  b
int a[N][N];
int numa, numb, numc;
signed main()
{
	cin >> n >> q;
	cin >> s;
	s = " " + s;
	for (int i = 1; i <= n; i++) {
		if (s[i] == 'a')
			numa++;
		if (s[i] == 'b')
			numb++;
		if (s[i] == 'c')
			numc++;
	}
	if (s[1] == 'a') {
		f[1][1][0][0] = 1;
	}
	else if (s[1] == 'b') {
		f[1][0][1][1] = 1;
	}
	else if (s[1] == 'c') {
		f[1][0][0][2] = 1;
	}
	else {
		f[1][1][0][0] = f[1][0][1][1] = f[1][0][0][2] = 1;
	}

	for (int i = 2; i <= n; i++) {
		for (int j = 0; j <= i; j++)
			for (int k = 0; k <= i - j; k++) {
				if (j >= 1)
					f[i][j][k][0] =
						(f[i - 1][j - 1][k][1] + f[i - 1][j - 1][k][2]) % P;
				if (k >= 1)
					f[i][j][k][1] =
						(f[i - 1][j][k - 1][0] + f[i - 1][j][k - 1][2]) % P;
				if (i - j - k >= 1)
					f[i][j][k][2] = (f[i - 1][j][k][0] + f[i - 1][j][k][1]) % P;
				if (s[i] == 'a') {
					f[i][j][k][1] = f[i][j][k][2] = 0;
				}
				else if (s[i] == 'b') {
					f[i][j][k][0] = f[i][j][k][2] = 0;
				}
				else if (s[i] == 'c') {
					f[i][j][k][0] = f[i][j][k][1] = 0;
				}
			}
	}
	/*for (int j = 0; j <= n; j++)
		for (int k = 0; k <= n - j; k++) {
			cout << j << " " << k << " " << n - j - k << " " << f[n][j][k][0]
				 << " " << f[n][j][k][1] << " " << f[n][j][k][2] << endl;
		}*/
	for (int i = 0; i <= 300; i++)
		for (int j = 0; j <= 300; j++)
			a[i][j] = (f[n][i][j][0] + f[n][i][j][1] + f[n][i][j][2]) % P;
	S[0][0] = 0;
	for (int i = 1; i <= 300; i++)
		S[i][0] = (S[i - 1][0] + a[i][0]) % P;
	for (int i = 1; i <= n; i++)
		S[0][i] = (S[0][i - 1] + a[0][i]) % P;
	for (int i = 1; i <= 300; i++)
		for (int j = 1; j <= 300; j++)
			S[i][j] =
				((S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1] + P + a[i][j]) % P+P)%P;
	for (int i = 0; i <= 300; i++)
		for (int j = 1; j <= 300 - i + 1; j++)
			for (int k = 0; k <= j - 1; k++)
				if (i + k == 0)
					S1[i][j] = (S1[i][j] + S[i + k][j - 1 - k] ) % P;
				else
					S1[i][j] = ((S1[i][j] + S[i + k][j - 1 - k] -
								S[i + k - 1][j - 1 - k] + P) %
							   P+P)%P;
	for (int i = 0; i <= 300; i++)
		for (int j = 1; j <= 300 - i + 1; j++)
			for (int k = 0; k <= j - 1; k++)
				if (i + k == 0)
					S2[i][j] = (S2[i][j] + S[j - 1 - k][i + k] ) % P;
				else
					S2[i][j] = ((S2[i][j] + S[j - 1 - k][i + k] -
								S[j - 1 - k][i + k - 1] + P) %
							   P+P)%P;

	while (q--) {
		int a, b, c;
		scanf("%lld%lld%lld", &a, &b, &c);
		// x<=a
		// y<=b
		// x+y>=n-c
		a += numa;
		b += numb;
		c += numc;
		if (a > n)
			a = n;
		if (b > n)
			b = n;
		if (c > n)
			c = n;
		int ans;
		if (a >= b) {
			if (n - c > a + b)
				ans = 0;
			else if (n - c > a)
				ans = S[a][b] - S1[0][n - c] + S1[a + 1][n - c - a - 1] +
					  S2[b + 1][n - c - b - 1];
			else if (n - c > b)
				ans = S[a][b] - S[n - b - c - 1][b] - S1[n - b - c][b];
			else if (n - c > 0)
				ans = S[a][b] - S1[0][n - c];
			else
				ans = S[a][b];
		}
		else if (a < b) {
			if (n - c > a + b)
				ans = 0;
			else if (n - c > b)
				ans = S[a][b] - S1[0][n - c] + S2[b + 1][n - c - b - 1] +
					  S2[a + 1][n - c - a - 1];
			else if (n - c > a)
				ans = S[a][b] - S[a][n - a - c - 1] - S2[n - a - c][a];
			else if (n - c > 0)
				ans = S[a][b] - S1[0][n - c];
			else
				ans = S[a][b];
		}
		ans = (ans % P + P) % P;
		printf("%lld\n",ans);
	}
	return 0;
}

/*
6 10
??????

2 3 0

2 3 1

2 3 2

2 3 3

2 3 4

3 2 0

3 2 1

3 2 2

3 2 3

3 2 4
*/

详细

Test #1:

score: 100
Accepted
time: 75ms
memory: 21004kb

input:

6 3
a?b??c
2 2 2
1 1 1
1 0 2

output:

3
1
1

result:

ok 3 lines

Test #2:

score: 0
Accepted
time: 75ms
memory: 20264kb

input:

6 3
??????
2 2 2
2 3 3
3 3 3

output:

30
72
96

result:

ok 3 lines

Test #3:

score: -100
Wrong Answer
time: 73ms
memory: 8812kb

input:

1 1
?
0 1 1

output:

1

result:

wrong answer 1st lines differ - expected: '2', found: '1'