QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#785239 | #9536. Athlete Welcome Ceremony | Magical_Kingdom# | WA | 377ms | 225848kb | C++17 | 4.9kb | 2024-11-26 17:17:45 | 2024-11-26 17:17:46 |
Judging History
answer
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod = 1e9 + 7;
const int maxn = 305;
int n, q;
ll dp[3][maxn][maxn][maxn];
int a[maxn];
int idx[maxn], cnt;
ll d[maxn][maxn][maxn];
ll sum[maxn][maxn][maxn];
bool check(int pos, int x) {
pos = idx[pos];
if (a[pos - 1] != x && a[pos + 1] != x) {
return true;
}
return false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> q;
string s;
cin >> s;
s = " " + s;
a[n + 1] = 9150;
for (int i = 1; i <= n; i++) {
if (s[i] == 'a')
a[i] = 0;
else if (s[i] == 'b')
a[i] = 1;
else if (s[i] == 'c')
a[i] = 2;
else {
a[i] = -8;
idx[++cnt] = i;
}
}
for (int i = 0; i <= cnt; i++) {
for (int j = 0; i + j <= cnt; j++) {
for (int k = 0; i + j + k <= cnt; k++) {
if (i == 0 && j == 0 && k == 0) {
continue;
}
int pos = i + j + k;
if (pos == 1) {
if (i == 1 && check(1, 0))
dp[0][i][j][k] = 1;
if (j == 1 && check(1, 1))
dp[1][i][j][k] = 1;
if (k == 1 && check(1, 2))
dp[2][i][j][k] = 1;
} else {
if (a[idx[pos] - 1] < 0) {
//?
if (i >= 1 && check(pos, 0)) {
dp[0][i][j][k] += (dp[1][i - 1][j][k] + dp[2][i - 1][j][k]) % mod;
dp[0][i][j][k] %= mod;
}
if (j >= 1 && check(pos, 1)) {
dp[1][i][j][k] += (dp[0][i][j - 1][k] + dp[2][i][j - 1][k]) % mod;
dp[1][i][j][k] %= mod;
}
if (k >= 1 && check(pos, 2)) {
dp[2][i][j][k] += (dp[0][i][j][k - 1] + dp[1][i][j][k - 1]) % mod;
dp[2][i][j][k] %= mod;
}
} else {
if (i >= 1 && check(pos, 0)) {
dp[0][i][j][k] += (dp[0][i - 1][j][k] + dp[1][i - 1][j][k] + dp[2][i - 1][j][k]) % mod;
dp[0][i][j][k] %= mod;
}
if (j >= 1 && check(pos, 1)) {
dp[1][i][j][k] += (dp[0][i][j - 1][k] + dp[1][i][j - 1][k] + dp[2][i][j - 1][k]) % mod;
dp[1][i][j][k] %= mod;
}
if (k >= 1 && check(pos, 2)) {
dp[2][i][j][k] += (dp[0][i][j][k - 1] + dp[1][i][j][k - 1] + dp[2][i][j][k - 1]) % mod;
dp[2][i][j][k] %= mod;
}
}
}
}
}
}
// for (int i = 1; i <= cnt; i++) {
// cerr << "i=" << i << endl;
// for (int j = 1; j <= cnt; j++) {
// for (int k = 1; k <= cnt; k++) {
// for (int p = 0; p <= 2; p++) {
// cerr << dp[p][i][j][k] << '/';
// }
// cerr << ' ';
// }
// cerr << '\n';
// }
// }
for (int i = 0; i <= cnt; i++) {
for (int j = 0; i + j <= cnt; j++) {
int k = cnt - i - j;
d[i][j][k] += (dp[0][i][j][k] + dp[1][i][j][k] + dp[2][i][j][k]) % mod;
d[i][j][k] %= mod;
}
}
for (int i = 0; i <= 300; i++) {
for (int j = 0; j <= 300; j++) {
for (int k = 0; k <= 300; k++) {
sum[i][j][k] = d[i][j][k] % mod;
if (i - 1 >= 0) {
(sum[i][j][k] += sum[i - 1][j][k]) % mod;
}
if (j - 1 >= 0) {
(sum[i][j][k] += sum[i][j - 1][k]) % mod;
}
if (k - 1 >= 0) {
(sum[i][j][k] += sum[i][j][k - 1]) % mod;
}
if (i - 1 >= 0 && j - 1 >= 0) {
sum[i][j][k] = (sum[i][j][k] - sum[i - 1][j - 1][k] + mod) % mod;
}
if (i - 1 >= 0 && k - 1 >= 0) {
sum[i][j][k] = (sum[i][j][k] - sum[i - 1][j][k - 1] + mod) % mod;
}
if (j - 1 >= 0 && k - 1 >= 0) {
sum[i][j][k] = (sum[i][j][k] - sum[i][j - 1][k - 1] + mod) % mod;
}
if (i - 1 >= 0 && j - 1 >= 0 && k - 1 >= 0) {
(sum[i][j][k] += sum[i - 1][j - 1][k - 1]) % mod;
}
}
}
}
while (q--) {
int x, y, z;
cin >> x >> y >> z;
cout << sum[x][y][z] << '\n';
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 377ms
memory: 225848kb
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: -100
Wrong Answer
time: 365ms
memory: 225732kb
input:
6 3 ?????? 2 2 2 2 3 3 3 3 3
output:
20 56 64
result:
wrong answer 1st lines differ - expected: '30', found: '20'