結果
問題 | No.1733 Sum of Sorted Subarrays |
ユーザー | Kenshin2438 |
提出日時 | 2022-10-02 16:35:33 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 444 ms / 3,000 ms |
コード長 | 2,734 bytes |
コンパイル時間 | 1,670 ms |
コンパイル使用メモリ | 171,216 KB |
実行使用メモリ | 22,912 KB |
最終ジャッジ日時 | 2024-06-07 09:56:33 |
合計ジャッジ時間 | 9,467 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | AC | 3 ms
5,376 KB |
testcase_04 | AC | 2 ms
5,376 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 2 ms
5,376 KB |
testcase_07 | AC | 2 ms
5,376 KB |
testcase_08 | AC | 203 ms
13,696 KB |
testcase_09 | AC | 342 ms
21,632 KB |
testcase_10 | AC | 190 ms
13,312 KB |
testcase_11 | AC | 244 ms
14,080 KB |
testcase_12 | AC | 266 ms
20,608 KB |
testcase_13 | AC | 270 ms
20,480 KB |
testcase_14 | AC | 403 ms
22,656 KB |
testcase_15 | AC | 366 ms
22,144 KB |
testcase_16 | AC | 189 ms
13,184 KB |
testcase_17 | AC | 410 ms
22,528 KB |
testcase_18 | AC | 313 ms
21,120 KB |
testcase_19 | AC | 334 ms
21,504 KB |
testcase_20 | AC | 297 ms
20,864 KB |
testcase_21 | AC | 384 ms
21,888 KB |
testcase_22 | AC | 236 ms
13,952 KB |
testcase_23 | AC | 444 ms
22,656 KB |
testcase_24 | AC | 425 ms
22,784 KB |
testcase_25 | AC | 440 ms
22,912 KB |
testcase_26 | AC | 229 ms
22,784 KB |
ソースコード
#include<bits/stdc++.h> using namespace std; #define LL long long const int maxn = 2e5 + 2; const LL mod = 998244353; int n; LL sg1[maxn << 2], sg2[maxn << 2]; int lz1[maxn << 2], lz2[maxn << 2]; LL a[maxn]; int idx[maxn]; LL fw[maxn]; inline int lowbit(int x) { return x & -x; } void add(int x) { while (x <= n) { ++fw[x]; x += lowbit(x); } } LL tot(int x) { LL ret = 0; while (x) { ret += fw[x]; x -= lowbit(x); } return ret; } bool cmp(int x, int y) { return a[x] < a[y]; } LL qpow(LL a,LL b){ LL ans=1; while(b){ if(b&1)ans=ans*a%mod; b>>=1; a=a*a%mod; } return ans%mod; } LL pow2k[maxn], inv2k[maxn]; void init() { pow2k[0] = 1; for (int k = 1; k <= n; ++k) { pow2k[k] = pow2k[k-1] * 2 % mod; } inv2k[0] = 1; inv2k[1] = qpow(2, mod - 2); for (int k = 2; k <= n; ++k) { inv2k[k] = inv2k[k-1] * inv2k[1] % mod; } } #define lc (u << 1) #define rc (lc | 1) inline void pushup(LL sg[], int u) { sg[u] = (sg[lc] + sg[rc]) % mod; } inline void down(LL sg[], int lz[], int u, int v = 1) { lz[u] += v; sg[u] = sg[u] * pow2k[v] % mod; } inline void pushdown(LL sg[], int lz[], int u) { if (lz[u] > 0) { down(sg, lz, lc, lz[u]); down(sg, lz, rc, lz[u]); lz[u] = 0; } } #define pushup() pushup(sg, u) #define pushdown() pushdown(sg, lz, u) #define down() down(sg, lz, u) void build(LL sg[], int u = 1, int l = 1, int r = n + 1) { if (l + 1 == r) { sg[u] = 1; } else { int m = (l + r) >> 1; build(sg, lc, l, m); build(sg, rc, m, r); pushup(); } } void update(LL sg[], int lz[], int ll, int rr, int u = 1, int l = 1, int r = n + 1) { if (ll <= l && r <= rr) { down(); } else { int m = (l + r) >> 1; pushdown(); if (ll < m) update(sg, lz, ll, rr, lc, l, m); if (m < rr) update(sg, lz, ll, rr, rc, m, r); pushup(); } } LL query(LL sg[], int lz[], int ll, int rr, int u = 1, int l = 1, int r = n + 1) { if (ll <= l && r <= rr) { return sg[u]; } else { int m = (l + r) >> 1; pushdown(); LL ret = 0; if (ll < m) ret += query(sg, lz, ll, rr, lc, l, m); if (m < rr) ret += query(sg, lz, ll, rr, rc, m, r); pushup(); return ret % mod; } } int main() { cin.tie(0)->sync_with_stdio(false); cin >> n; for (int i = 1; i <= n; ++i) { cin >> a[i]; } init(); build(sg1); build(sg2); for (int i = 0; i < n; ++i) { idx[i] = i + 1; } sort(idx, idx + n, cmp); LL ans = 0; for (int p = 0; p < n; ++p) { int id = idx[p]; LL ltot = tot(id); LL rtot = tot(n) - ltot; LL L = query(sg1, lz1, 1, id + 1) * inv2k[rtot] % mod; LL R = query(sg2, lz2, id, n + 1) * inv2k[ltot] % mod; ans = (ans + L * R % mod * a[id] % mod) % mod; update(sg1, lz1, 1, id + 1); update(sg2, lz2, id, n + 1); add(id); } cout << ans << "\n"; return 0; }