結果
| 問題 |
No.2616 中央番目の中央値
|
| コンテスト | |
| ユーザー |
kokosei
|
| 提出日時 | 2024-01-27 16:21:05 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 94 ms / 2,000 ms |
| コード長 | 1,932 bytes |
| コンパイル時間 | 4,346 ms |
| コンパイル使用メモリ | 271,220 KB |
| 実行使用メモリ | 13,824 KB |
| 最終ジャッジ日時 | 2024-09-28 09:41:36 |
| 合計ジャッジ時間 | 7,296 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 37 |
ソースコード
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <atcoder/fenwicktree>
#include <atcoder/modint>
using namespace std;
using namespace __gnu_pbds;
template <typename T, typename F = less<T>>
using nset = tree<T, null_type, F, rb_tree_tag, tree_order_statistics_node_update>;
using ll = long long;
using mint = atcoder::modint998244353;
const int mod = 998244353;
class FPC{
private:
int size;
vector<mint> ff, fi;
public:
FPC(int _n = 0) : size(_n), ff(_n + 1), fi(_n + 1){
ff[0] = fi[0] = 1;
for(int i = 1;i < size;i++){
ff[i] = ff[i - 1] * i;
fi[i] = ff[i].inv();
}
}
mint fact(int n) const{
assert(0 <= n && n <= size);
return ff[n];
}
mint faci(int n) const{
assert(0 <= n && n <= size);
return fi[n];
}
mint parm(int n, int r) const{
assert(0 <= n && n <= size);
assert(0 <= r && r <= size);
return ff[n] * fi[r];
}
mint comb(int n, int r) const{
assert(0 <= n && n <= size);
assert(0 <= r && r <= size);
assert(n >= r);
return ff[n] * fi[r] * fi[n - r];
}
};
int N;
int P[303030];
pair<int, int> ff[303030], bb[303030];
int main(void){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> N;
for(int i = 0;i < N;i++){
cin >> P[i]; P[i]--;
}
FPC fpc(N);
atcoder::fenwick_tree<int> fbt(N), bbt(N);
for(int i = 0;i < N;i++){
int s = fbt.sum(0, P[i]);
// s d
ff[i] = {s, i - s};
bb[i] = {P[i] - s, N - 1 - i - (P[i] - s)};
fbt.add(P[i], 1);
}
mint ans = 0;
for(int i = 0;i < N;i++){
ans +=
fpc.comb(ff[i].first + bb[i].second, ff[i].first) *
fpc.comb(ff[i].second + bb[i].first, bb[i].first);
}
cout << ans.val() << endl;
return 0;
}
kokosei