QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#258598 | #2271. High-Tech Detective | Fireball0424 | WA | 0ms | 3832kb | C++14 | 2.4kb | 2023-11-19 20:48:23 | 2023-11-19 20:48:24 |
Judging History
answer
#pragma GCC optimizer("Ofast")
#pragma GCC target("avx2")
#include <bits/stdc++.h>
#define int long long
#define ld long double
#define ull unsigned long long
#define fr first
#define fi first
#define sc second
#define se second
#define all(x) x.begin(), x.end()
#define pii pair<int,int>
using namespace std;
#ifndef fireball
#define tofu ios::sync_with_stdio(0); cin.tie(0);
#else
#define tofu freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
#endif
void db() {cout << '\n';}
template <typename T, typename ...U> void db(T a, U ...b) {cout << a << ' ', db(b...);}
const int mod = 1e9 + 7;
signed main(){
tofu;
int n; cin >> n;
vector<pair<char, int> > a(2 * n);
int cnt[n + 1] = {};
for(int i = 0; i < 2 * n; ++i){
cin >> a[i].fr >> a[i].sc;
cnt[a[i].sc]++;
}
vector<pair<char,int> > v;
int unknown = 0, input = 0, frac = 0, sure = 0;
for(auto i : a){
if(i.sc == 0 or cnt[i.sc] < 2) v.push_back(i);
if(i.fr == 'O' and i.sc == 0) unknown++;
}
for(int i = 1; i <= n; ++i) if(cnt[i] == 0) frac++;
n = (int)v.size() / 2;
int dp[2][n + 1], now = 0;
for(int i = 0; i <= n; ++i) dp[0][i] = dp[1][i] = 0;
dp[0][0] = 1;
for(auto i : v){
if(i.fr == 'I' and i.sc > 0){
for(int j = 0; j < unknown; ++j) dp[now ^ 1][j + 1] = dp[now][j];
input++;
sure++;
}
if(i.fr == 'I' and i.sc == 0){
for(int j = 0; j <= unknown; ++j){
dp[now ^ 1][j] = (dp[now ^ 1][j] + dp[now][j]) % mod;
if(j + 1 <= unknown) dp[now ^ 1][j + 1] = (dp[now ^ 1][j + 1] + dp[now][j]) % mod;
}
input++;
}
if(i.fr == 'O' and i.sc > 0){
for(int j = sure; j <= n; ++j){
dp[now ^ 1][j] = dp[now][j] * (input - j) % mod;
}
input--;
}
if(i.fr == 'O' and i.sc == 0){
for(int j = max(1ll, sure); j <= n; ++j){
dp[now ^ 1][j - 1] = (dp[now][j] * j) % mod;
}
unknown--;
input--;
}
for(int j = 0; j <= n; ++j){
dp[now][j] = 0;
}
now ^= 1;
//db();
}
int ans = dp[now][0];
for(int i = 1; i <= frac; ++i) ans = (ans * i) % mod;
db(ans);
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3804kb
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: 3552kb
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: 3832kb
input:
1 I 0 O 1
output:
1
result:
ok single line: '1 '
Test #4:
score: 0
Accepted
time: 0ms
memory: 3580kb
input:
2 I 0 I 1 O 1 O 0
output:
1
result:
ok single line: '1 '
Test #5:
score: 0
Accepted
time: 0ms
memory: 3488kb
input:
4 I 0 I 0 O 0 O 0 I 0 I 3 O 0 O 0
output:
24
result:
ok single line: '24 '
Test #6:
score: 0
Accepted
time: 0ms
memory: 3808kb
input:
8 I 0 I 0 I 0 I 8 I 4 I 0 O 1 I 0 O 8 O 4 I 5 O 0 O 0 O 5 O 0 O 7
output:
576
result:
ok single line: '576 '
Test #7:
score: -100
Wrong Answer
time: 0ms
memory: 3492kb
input:
16 I 5 I 4 I 2 I 1 I 10 I 6 I 14 I 3 I 11 I 7 I 16 O 0 O 7 I 15 O 1 I 8 I 12 O 4 O 11 O 0 I 13 O 14 O 12 O 13 I 0 O 5 O 0 O 0 O 0 O 0 O 0 O 3
output:
0
result:
wrong answer 1st lines differ - expected: '2400', found: '0 '