QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#822650 | #2271. High-Tech Detective | KITKAT (Ryuma Noma, Shinryu Tachibana, Souma Takao)# | WA | 0ms | 3792kb | C++20 | 2.8kb | 2024-12-20 15:15:44 | 2024-12-20 15:15:49 |
Judging History
answer
#include <bits/stdc++.h>
#define dbg(x) cerr << #x << ':' << (x) << endl;
#define ALL(x) x.begin(),x.end()
using ll = long long;
using ld = long double;
using namespace std;
int main()
{
int n;
cin >> n;
vector<pair<char,int>> cx(2*n);
for (int i = 0; i < 2*n; i++) {
cin >> cx[i].first >> cx[i].second;
}
// 同じ数字が2回出てきたら削除する
vector<int> cnt(n+1);
for (int i = 0; i < 2*n; i++) {
cnt[cx[i].second]++;
}
vector<pair<char,int>> bx;
for (int i = 0; i < 2*n; i++) {
if (cx[i].second != 0 && cnt[cx[i].second] == 2) continue;
bx.emplace_back(cx[i]);
}
cx = bx;
n = bx.size()/2;
ll all_pair = 0;
for (int i = 1; i <= n; i++) {
if (cnt[i] == 0) ++all_pair;
}
vector<int> sum(2*n+1);
for (int i = 0; i < 2*n; i++) {
if (bx[i].first == 'I') sum[i+1] = sum[i]+1;
else sum[i+1] = sum[i]-1;
}
vector<int> sum_I0(2*n+1);
for (int i = 0; i < 2*n; i++) {
if (bx[i].first == 'I' && bx[i].second == 0) sum_I0[i+1] = sum_I0[i]+1;
else sum_I0[i+1] = sum_I0[i];
}
vector<int> sum_O1(2*n+1);
for (int i = 0; i < 2*n; i++) {
if (bx[i].first == 'O' && bx[i].second != 0) sum_O1[i+1] = sum_O1[i]+1;
else sum_O1[i+1] = sum_O1[i];
}
ll mod = 1e9+7;
// dp[i][j] := i番目まで見て,使った左のIかつ0の個数がjのときの数え上げ
vector<vector<ll>> dp(2*n+1, vector<ll>(n+1));
dp[0][0] = 1;
for (int i = 0; i < 2*n; i++) {
if (bx[i].first == 'I') {
for (int j = 0; j <= n; j++) {
dp[i+1][j] += dp[i][j];
dp[i+1][j] %= mod;
}
}
else {
if (bx[i].second == 0) {
for (int j = 0; j <= n; j++) {
if (sum[i]-(sum_I0[i]-j) > 0) {
dp[i+1][j] += dp[i][j]*(sum[i]-(sum_I0[i]-j)) % mod;
dp[i+1][j] %= mod;
}
if (j < sum_I0[i] && all_pair-(j-sum_O1[i]) > 0) {
dp[i+1][j+1] += (dp[i][j]*(all_pair-(j-sum_O1[i])) % mod) * (sum_I0[i]-j) % mod;
dp[i+1][j+1] %= mod;
}
}
}
else {
for (int j = 0; j < sum_I0[i]; j++) {
dp[i+1][j+1] += dp[i][j]*(sum_I0[i]-j) % mod;
dp[i+1][j+1] %= mod;
}
}
}
}
// for (int i = 0; i <= 2*n; i++) {
// for (int j = 0; j <= n; j++) {
// cerr << dp[i][j] << ' ';
// }
// cerr << endl;
// }
cout << dp[2*n][sum_I0[2*n]] << endl;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3792kb
input:
4 I 1 I 0 O 0 I 0 O 2 I 4 O 0 O 4
output:
3
result:
ok single line: '3'
Test #2:
score: 0
Accepted
time: 0ms
memory: 3596kb
input:
3 I 0 I 0 I 0 O 0 O 0 O 0
output:
36
result:
ok single line: '36'
Test #3:
score: 0
Accepted
time: 0ms
memory: 3764kb
input:
1 I 0 O 1
output:
1
result:
ok single line: '1'
Test #4:
score: -100
Wrong Answer
time: 0ms
memory: 3576kb
input:
2 I 0 I 1 O 1 O 0
output:
0
result:
wrong answer 1st lines differ - expected: '1', found: '0'