結果
| 問題 |
No.2250 Split Permutation
|
| コンテスト | |
| ユーザー |
nono00
|
| 提出日時 | 2023-03-18 00:27:33 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 122 ms / 3,000 ms |
| コード長 | 1,491 bytes |
| コンパイル時間 | 957 ms |
| コンパイル使用メモリ | 77,336 KB |
| 最終ジャッジ日時 | 2025-02-11 14:38:12 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 35 |
ソースコード
#include <iostream>
#include <vector>
#include <atcoder/modint>
namespace nono {
template<typename T>
class FenwickTree {
public:
FenwickTree(const int size) : size_(size + 1), data_(size + 1) {}
FenwickTree(const std::vector<T> &vec) : size_(vec.size() + 1), data_(vec.size() + 1) {
for (int i = 0; i < size_; ++i) {
add(i, vec[i]);
}
}
void add(int i, const T delta) {
for (i++; i < size_; i += i & -i) {
data_[i] += delta;
}
}
T get_range(const int l, const int r) {
return get_sum(r) - get_sum(l);
}
T operator[](const int i) {
return get_range(i, i + 1);
}
private:
const int size_;
std::vector<T> data_;
T get_sum(int i) {
T sum = 0;
for (; i > 0; i -= i & -i) {
sum += data_[i];
}
return sum;
}
};
} // namespace nono
using mint = atcoder::modint998244353;
int main() {
int n;
std::cin >> n;
std::vector<int> p(n);
for (int i = 0; i < n; i++) std::cin >> p[i];
nono::FenwickTree<int> count(n);
nono::FenwickTree<mint> fen(n);
mint ans = 0;
mint up = 1;
mint down = mint(2).pow(n - 1);
for (int i = 0; i < n; i++) {
p[i]--;
ans += count.get_range(p[i], n) * mint(2).pow(n - 1) - fen.get_range(p[i], n) * down;
count.add(p[i], 1);
fen.add(p[i], up);
up *= 2;
down /= 2;
}
std::cout << ans.val() << '\n';
}
nono00