# |
제출 시각 |
아이디 |
문제 |
언어 |
결과 |
실행 시간 |
메모리 |
295212 |
2020-09-09T14:24:30 Z |
임성재(#5809) |
케이크 (JOI13_cake) |
C++17 |
|
770 ms |
54488 KB |
#include<bits/stdc++.h>
using namespace std;
#define fast ios::sync_with_stdio(false);
#define fi first
#define se second
#define em emplace
#define eb emplace_back
#define mp make_pair
#define all(v) (v).begin(), (v).end()
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int inf = 1e9;
const ll INF = 1e18;
int n;
int sft;
deque<int> dQ;
vector<int> com;
vector<pair<pll, int>> st, ST, er[300010];
pll tree[1200010];
ll tot;
ll ans[300010];
void update(int node, int s, int e, int i, pll x) {
if(s == e) {
tree[node] = x;
return;
}
int m = s + e >> 1;
if(i <= m) update(node*2, s, m, i, x);
else update(node*2+1, m+1, e, i, x);
tree[node].fi = tree[node*2].fi + tree[node*2+1].fi;
tree[node].se = tree[node*2+1].se;
if(tree[node*2+1].fi & 1) tree[node].se -= tree[node*2].se;
else tree[node].se += tree[node*2].se;
}
ll cal() {
int p1 = 0, p2 = n-2;
int c = 1;
ll cnt[2] = {};
cnt[0] = com[dQ[n-1]];
while(p1 <= p2) {
if(dQ[p1] >= dQ[p2]) cnt[c] += com[dQ[p1++]];
else cnt[c] += com[dQ[p2--]];
c = 1 - c;
}
return cnt[0];
}
int main() {
fast;
cin >> n;
for(int i=0; i<n; i++) {
int a;
cin >> a;
tot += a;
dQ.eb(a);
com.eb(a);
}
sort(all(com));
com.erase(unique(all(com)), com.end());
for(int i=0; i<n; i++) {
dQ[i] = lower_bound(all(com), dQ[i]) - com.begin();
}
while(dQ[n-1]) {
dQ.eb(dQ[0]);
dQ.pop_front();
sft++;
}
update(1, 0, com.size(), 0, mp(1, com[0]));
for(int i=n-2; i>=0; i--) {
ll sum = com[dQ[i]];
int cnt = 1;
while(st.size() && st.back().se > dQ[i]) {
if(cnt & 1) sum -= st.back().fi.se;
else sum += st.back().fi.se;
cnt += st.back().fi.fi;
er[i].eb(st.back());
update(1, 0, com.size(), st.back().se, mp(0, 0));
st.pop_back();
}
st.eb(mp(cnt, sum), dQ[i]);
update(1, 0, com.size(), dQ[i], mp(cnt, sum));
}
for(int i=0; i<n-1; i++) {
update(1, 0, com.size(), st.back().se, mp(0, 0));
st.pop_back();
reverse(all(er[i]));
for(auto j : er[i]) {
st.eb(j);
update(1, 0, com.size(), j.se, j.fi);
}
ans[i] = (tot + com[dQ[i]] - tree[1].se) / 2;
ll sum = com[dQ[i]];
int cnt = 1;
while(ST.size() && ST.back().se > dQ[i]) {
if(cnt & 1) sum -= ST.back().fi.se;
else sum += ST.back().fi.se;
cnt += ST.back().fi.fi;
update(1, 0, com.size(), ST.back().se, mp(0, 0));
ST.pop_back();
}
ST.eb(mp(cnt, sum), dQ[i]);
update(1, 0, com.size(), dQ[i], mp(cnt, sum));
}
ans[n-1] = cal();
for(int i=0; i<n; i++) {
cout << ans[(i + n - sft) % n] << " ";
}
}
Compilation message
cake.cpp: In function 'void update(int, int, int, int, pll)':
cake.cpp:33:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
33 | int m = s + e >> 1;
| ~~^~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
13 ms |
8064 KB |
Output is correct |
2 |
Correct |
12 ms |
8256 KB |
Output is correct |
3 |
Correct |
12 ms |
8064 KB |
Output is correct |
4 |
Correct |
13 ms |
8064 KB |
Output is correct |
5 |
Correct |
14 ms |
8064 KB |
Output is correct |
6 |
Correct |
14 ms |
8064 KB |
Output is correct |
7 |
Correct |
13 ms |
8320 KB |
Output is correct |
8 |
Correct |
12 ms |
8064 KB |
Output is correct |
9 |
Correct |
6 ms |
7424 KB |
Output is correct |
10 |
Correct |
5 ms |
7424 KB |
Output is correct |
11 |
Correct |
5 ms |
7552 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
212 ms |
18928 KB |
Output is correct |
2 |
Correct |
172 ms |
19164 KB |
Output is correct |
3 |
Correct |
187 ms |
19056 KB |
Output is correct |
4 |
Correct |
608 ms |
32232 KB |
Output is correct |
5 |
Correct |
469 ms |
30316 KB |
Output is correct |
6 |
Correct |
640 ms |
46060 KB |
Output is correct |
7 |
Correct |
520 ms |
49172 KB |
Output is correct |
8 |
Correct |
686 ms |
45924 KB |
Output is correct |
9 |
Correct |
770 ms |
45796 KB |
Output is correct |
10 |
Correct |
466 ms |
50520 KB |
Output is correct |
11 |
Correct |
584 ms |
46948 KB |
Output is correct |
12 |
Correct |
514 ms |
50020 KB |
Output is correct |
13 |
Correct |
508 ms |
47828 KB |
Output is correct |
14 |
Correct |
425 ms |
54488 KB |
Output is correct |
15 |
Correct |
534 ms |
47368 KB |
Output is correct |