Submission #372791

#TimeUsernameProblemLanguageResultExecution timeMemory
372791two_sides케이크 (JOI13_cake)C++17
100 / 100
135 ms56428 KiB
#include <bits/stdc++.h> using namespace std; const int N = 300005; const int LG = 19; int a[N], b[N], rmq[LG][N], lg[N], ID[N]; long long ans[N], sum[2][N]; int getMin(int l, int r) { int k = lg[r - l + 1]; return a[rmq[k][l]] < a[rmq[k][r + 1 - (1 << k)]] ? rmq[k][l] : rmq[k][r + 1 - (1 << k)]; } long long getSum(int prt, int l, int r) { return sum[prt][r] - sum[prt][l - 1]; } void solve(int lef, int rig, long long cur) { int mid = getMin(lef, rig); ans[ID[mid]] += cur + a[mid]; for (int l = lef, r = rig; l < mid || r > mid; ) { int minP = 0; if (l < mid) { int p = getMin(l, mid - 1); if (a[minP] > a[p]) minP = p; } if (r > mid) { int p = getMin(mid + 1, r); if (a[minP] > a[p]) minP = p; } if (minP < mid) { ans[ID[mid]] += getSum ((minP ^ (r - minP)) & 1, l, minP); l = minP + 1; } else { ans[ID[mid]] += getSum ((minP ^ (minP - l)) & 1, minP, r); r = minP - 1; } } if (lef < mid) solve(lef, mid - 1, cur + getSum((mid ^ (mid - lef)) & 1, mid, rig)); if (mid < rig) solve(mid + 1, rig, cur + getSum((mid ^ (rig - mid)) & 1, lef, mid)); } int main() { cin.tie(0)->sync_with_stdio(0); int n, minP = 1; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; if (a[i] < a[minP]) minP = i; } /// remove minimum { int m = 0; for (int i = minP % n + 1; i != minP; i = i % n + 1) { b[++m] = a[i]; ID[m] = i; } ans[minP] = a[minP]; if (n & 1) for (int i = 1; i <= n; i++) if (i != minP) ans[i] = a[minP]; n = m; swap(a, b); int l = 1, r = n; for (int i = 0; i < n; i++) { if (a[l] > a[r]) { if (i & 1) ans[minP] += a[l]; l++; } else { if (i & 1) ans[minP] += a[r]; r--; } } } // prepare { rmq[0][1] = 1; a[0] = INT_MAX; for (int i = 2; i <= n; i++) { rmq[0][i] = i; lg[i] = lg[i / 2] + 1; } for (int k = 1; k < LG; k++) for (int i = 1; i + (1 << k) <= n + 1; i++) rmq[k][i] = a[rmq[k - 1][i]] < a[rmq[k - 1][i + (1 << k - 1)]] ? rmq[k - 1][i] : rmq[k - 1][i + (1 << k - 1)]; for (int i = 1; i <= n; i++) { sum[0][i] = sum[0][i - 1]; sum[1][i] = sum[1][i - 1]; sum[i & 1][i] += a[i]; } } solve(1, n, 0); for (int i = 1; i <= n + 1; i++) cout << ans[i] << '\n'; }

Compilation message (stderr)

cake.cpp: In function 'int main()':
cake.cpp:93:42: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   93 |                 a[rmq[k - 1][i + (1 << k - 1)]] ?
      |                                        ~~^~~
cake.cpp:94:56: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   94 |                 rmq[k - 1][i] : rmq[k - 1][i + (1 << k - 1)];
      |                                                      ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...