QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#822650#2271. High-Tech DetectiveKITKAT (Ryuma Noma, Shinryu Tachibana, Souma Takao)#WA 0ms3792kbC++202.8kb2024-12-20 15:15:442024-12-20 15:15:49

Judging History

This is the latest submission verdict.

  • [2024-12-20 15:15:49]
  • Judged
  • Verdict: WA
  • Time: 0ms
  • Memory: 3792kb
  • [2024-12-20 15:15:44]
  • Submitted

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'