結果
問題 | No.2327 Inversion Sum |
ユーザー | hiikunZ |
提出日時 | 2023-05-28 14:09:36 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 118 ms / 2,000 ms |
コード長 | 3,111 bytes |
コンパイル時間 | 3,252 ms |
コンパイル使用メモリ | 227,748 KB |
実行使用メモリ | 32,320 KB |
最終ジャッジ日時 | 2024-06-08 04:48:26 |
合計ジャッジ時間 | 7,608 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 94 ms
32,316 KB |
testcase_01 | AC | 116 ms
32,236 KB |
testcase_02 | AC | 112 ms
32,320 KB |
testcase_03 | AC | 93 ms
31,628 KB |
testcase_04 | AC | 118 ms
31,744 KB |
testcase_05 | AC | 89 ms
29,928 KB |
testcase_06 | AC | 111 ms
32,172 KB |
testcase_07 | AC | 100 ms
29,440 KB |
testcase_08 | AC | 93 ms
28,756 KB |
testcase_09 | AC | 114 ms
31,752 KB |
testcase_10 | AC | 97 ms
29,184 KB |
testcase_11 | AC | 95 ms
30,472 KB |
testcase_12 | AC | 95 ms
29,732 KB |
testcase_13 | AC | 90 ms
28,628 KB |
testcase_14 | AC | 105 ms
30,292 KB |
testcase_15 | AC | 117 ms
31,472 KB |
testcase_16 | AC | 101 ms
31,696 KB |
testcase_17 | AC | 92 ms
30,972 KB |
testcase_18 | AC | 92 ms
28,768 KB |
testcase_19 | AC | 96 ms
31,500 KB |
testcase_20 | AC | 93 ms
28,288 KB |
testcase_21 | AC | 90 ms
28,260 KB |
testcase_22 | AC | 86 ms
28,148 KB |
testcase_23 | AC | 94 ms
28,264 KB |
testcase_24 | AC | 88 ms
28,216 KB |
testcase_25 | AC | 89 ms
28,288 KB |
testcase_26 | AC | 87 ms
28,080 KB |
testcase_27 | AC | 89 ms
28,288 KB |
testcase_28 | AC | 89 ms
28,288 KB |
testcase_29 | AC | 88 ms
28,144 KB |
testcase_30 | AC | 90 ms
28,220 KB |
testcase_31 | AC | 88 ms
28,232 KB |
testcase_32 | AC | 91 ms
28,188 KB |
ソースコード
#pragma GCC target("avx2") #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #include<bits/stdc++.h> using namespace std; using ll = long long int; using ull = unsigned long long int; using ld = long double; ll MOD = 998244353; ll modpow(ll A,ll B,ll M){ ll r = 1,p = A; while(B > 0){ if(B % 2 == 1) r = (r * p) % M; p = (p * p) % M; B /= 2; } return r; } vector<ll> fac,finv,inv; void COMinit(ll n = 1000000){ fac.resize(n); finv.resize(n); inv.resize(n); inv[1] = 1; fac[0] = fac[1] = 1; finv[0] = finv[1] = 1; ll i; for(i = 2;i < n;i++){ fac[i] = (fac[i - 1] * i) % MOD; inv[i] = MOD - ((inv[MOD % i] * (MOD / i)) % MOD); finv[i] = (finv[i - 1] * inv[i]) % MOD; } } ll COM(ll n,ll m){ //nCm if(n < m) return 0; if(n < 0 || m < 0) return 0; return (fac[n] * (finv[m] * finv[n - m] % MOD)) % MOD; } ll f(ll a,ll b){ return COM(a + b,a); } struct BIT{ ll n; vector<ll> A; BIT(ll N):A(N + 1,0){ n = N; } void add(ll i,ll x){ i++; for(;i <= n;i += i & -i) A[i] += x; } ll query(ll x){ x++; ll r = 0; for(;x > 0;x -= x & -x) r += A[x]; return r; } ll query(ll l,ll r){ return query(r - 1) - query(l - 1); } }; int main(){ COMinit(); ios::sync_with_stdio(false); cin.tie(nullptr); ll N,M; cin >> N >> M; ll L = N - M; ll kari = ((L) * (L - 1)) % MOD; kari *= inv[4]; kari %= MOD; kari *= fac[L]; kari %= MOD; vector<ll> A(N,1),B(N),C(N,1),D(N),g; vector<tuple<ll,ll>> F; for(ll i = 0;i < M;i++){ ll p,k; cin >> p >> k; p--; k--; A[k] = 0; D[k] = p; C[p] = 0; } B[N - 1] = 0; for(ll i = N - 2;i >= 0;i--){ B[i] = B[i + 1] + A[i + 1]; } for(ll i = 0;i < N;i++){ if(C[i] == 1) g.emplace_back(i); } for(ll i = 0;i < N;i++){ if(A[i] == 0){ // calc { ll ans = lower_bound(g.begin(),g.end(),D[i]) - g.begin(); ans *= inv[(ll)g.size()]; ans %= MOD; ans *= B[i]; ans %= MOD; ans *= fac[L]; ans %= MOD; kari += ans; } { ll ans = (ll)g.size() - (lower_bound(g.begin(),g.end(),D[i]) - g.begin()); ans *= inv[(ll)g.size()]; ans %= MOD; ans *= (L - B[i]); ans %= MOD; ans *= fac[L]; ans %= MOD; kari += ans; } } } vector<ll> T; for(ll i = 0;i < N;i++){ if(A[i] == 0) T.emplace_back(D[i]); } ll kari2 = 0; BIT tree(200000); for(ll i = 0;i < (ll)T.size();i++){ ll p = T[i]; ll k = tree.query(p + 1,200000); kari2 += k; kari2 %= MOD; tree.add(p,1); } kari2 *= fac[L]; kari2 %= MOD; cout << (kari + kari2) % MOD << endl; }