結果
問題 | No.1300 Sum of Inversions |
ユーザー | shell_mug |
提出日時 | 2020-11-27 22:00:30 |
言語 | C++17(clang) (17.0.6 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 247 ms / 2,000 ms |
コード長 | 5,257 bytes |
コンパイル時間 | 3,506 ms |
コンパイル使用メモリ | 154,592 KB |
実行使用メモリ | 32,796 KB |
最終ジャッジ日時 | 2024-07-26 12:39:02 |
合計ジャッジ時間 | 11,423 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 34 |
ソースコード
#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cmath>#include <vector>#include <set>#include <map>#include <unordered_set>#include <unordered_map>#include <queue>#include <ctime>#include <cassert>#include <complex>#include <string>#include <cstring>#include <chrono>#include <random>#include <queue>#include <bitset>#include <stack>#include <functional>// AtCoder// #include <atcoder/all>// using namespace atcoder;#ifdef LOCAL#define eprintf(...) fprintf(stderr, __VA_ARGS__)#else#define eprintf(...)#endif#define rep_(i, a_, b_, a, b, ...) for (int i = (a), i##_len = (b); i < i##_len; ++i)#define rep(i, ...) rep_(i, __VA_ARGS__, __VA_ARGS__, 0, __VA_ARGS__)#define reprev_(i, a_, b_, a, b, ...) for (int i = (b)-1, i##_min = (a); i >= i##_min; --i)#define reprev(i, ...) reprev_(i, __VA_ARGS__, __VA_ARGS__, 0, __VA_ARGS__)#define all(x) (x).begin(), (x).end()template <class T> bool chmax(T &a, const T &b) { if (a < b) { a = b; return 1; } return 0; }template <class T> bool chmin(T &a, const T &b) { if (b < a) { a = b; return 1; } return 0; }#define fls(x) (64 - __builtin_clzll(x))#define pcnt(x) __builtin_popcountll(x)using namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair <ll,int> P;typedef long double ld;template< typename Monoid >struct SegmentTree {using F = function< Monoid(Monoid, Monoid) >;int sz;vector< Monoid > seg;const F f;const Monoid M1;SegmentTree(int n, const F f, const Monoid &M1) : f(f), M1(M1) {sz = 1;while(sz < n) sz <<= 1;seg.assign(2 * sz, M1);}void set(int k, const Monoid &x) {seg[k + sz] = x;}void build() {for(int k = sz - 1; k > 0; k--) {seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);}}void update(int k, const Monoid &x) {k += sz;seg[k] = x;while(k >>= 1) {seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);}}Monoid query(int a, int b) {Monoid L = M1, R = M1;for(a += sz, b += sz; a < b; a >>= 1, b >>= 1) {if(a & 1) L = f(L, seg[a++]);if(b & 1) R = f(seg[--b], R);}return f(L, R);}Monoid operator[](const int &k) const {return seg[k + sz];}template< typename C >int find_subtree(int a, const C &check, Monoid &M, bool type) {while(a < sz) {Monoid nxt = type ? f(seg[2 * a + type], M) : f(M, seg[2 * a + type]);if(check(nxt)) a = 2 * a + type;else M = nxt, a = 2 * a + 1 - type;}return a - sz;}template< typename C >int find_first(int a, const C &check) {Monoid L = M1;if(a <= 0) {if(check(f(L, seg[1]))) return find_subtree(1, check, L, false);return -1;}int b = sz;for(a += sz, b += sz; a < b; a >>= 1, b >>= 1) {if(a & 1) {Monoid nxt = f(L, seg[a]);if(check(nxt)) return find_subtree(a, check, L, false);L = nxt;++a;}}return -1;}template< typename C >int find_last(int b, const C &check) {Monoid R = M1;if(b >= sz) {if(check(f(seg[1], R))) return find_subtree(1, check, R, true);return -1;}int a = sz;for(b += sz; a < b; a >>= 1, b >>= 1) {if(b & 1) {Monoid nxt = f(seg[--b], R);if(check(nxt)) return find_subtree(b, check, R, true);R = nxt;}}return -1;}};int main (void){cin.tie(0);ios::sync_with_stdio(false);ll n; cin >> n;vector<ll> a(n); rep (i, n) cin >> a[i];SegmentTree<ll> segr0(n, [](ll a, ll b){return a + b;}, 0);SegmentTree<ll> segr1(n, [](ll a, ll b){return a + b;}, 0);SegmentTree<ll> segl0(n, [](ll a, ll b){return a + b;}, 0);SegmentTree<ll> segl1(n, [](ll a, ll b){return a + b;}, 0);vector<P> b(n);rep (i, n) b[i] = P{a[i], i};sort(all(b), greater<P>());vector<int> perm(n);rep (i, n) perm[i] = b[i].second;// rep (i, n) eprintf("%d%c", perm[i], " \n"[i + 1 == n]);vector<vector<ll>> m(4, vector<ll>(n));rep (i, n) {segr0.update(perm[i], 1);m[1][perm[i]] = segr0.query(0, perm[i]);segr1.update(perm[i], m[1][perm[i]]);m[2][perm[i]] = segr1.query(0, perm[i]);}reprev (i, n) {segl0.update(perm[i], 1);m[3][perm[i]] = segl0.query(perm[i] + 1, n);segl1.update(perm[i], m[3][perm[i]]);m[0][perm[i]] = segl1.query(perm[i] + 1, n);}rep (j, n) eprintf("%lld%c", m[0][j], " \n"[j + 1 == j_len]);rep (j, n) eprintf("%lld%c", m[1][j], " \n"[j + 1 == j_len]);rep (j, n) eprintf("%lld%c", m[3][j], " \n"[j + 1 == j_len]);rep (j, n) eprintf("%lld%c", m[2][j], " \n"[j + 1 == j_len]);ll ans = 0, MOD = 998244353;rep (i, n) {ans = (ans + (m[0][i] + m[1][i] * m[3][i] + m[2][i]) % MOD * a[i] % MOD) % MOD;}cout << ans << "\n";return 0;}