Submission #42424

#TimeUsernameProblemLanguageResultExecution timeMemory
42424choikiwon케이크 (JOI13_cake)C++14
100 / 100
469 ms160908 KiB
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

int N;
int A[300010], B[300010];
ll psum[2][300010], ans[300010];

ll calc(int t, int l, int r) {
    return psum[t][r] - (l == 0? 0 : psum[t][l - 1]);
}

struct BIT {
    vector<pii> tree;
    void init() {
        tree = vector<pii>(4*N);
        build(0, N - 1, 1);
    }
    void build(int l, int r, int n) {
        if(l == r) {
            tree[n] = pii(B[l], l);
            return;
        }
        int m = (l + r)>>1;
        build(l, m, 2*n);
        build(m + 1, r, 2*n + 1);
        tree[n] = min(tree[2*n], tree[2*n + 1]);
    }
    pii quer(int a, int b, int l, int r, int n) {
        if(b < l || r < a) return pii(1e9, 1e9);
        if(a <= l && r <= b) return tree[n];
        int m = (l + r)>>1;
        pii L = quer(a, b, l, m, 2*n);
        pii R = quer(a, b, m + 1, r, 2*n + 1);
        return min(L, R);
    }
} bit;

void solve(int l, int r, ll add) {
    if(l > r) return;

    pii t = bit.quer(l, r, 0, N - 1, 1);
    solve(l, t.second - 1, add + ((t.second - l) % 2? calc((t.second % 2) ^ 1, t.second, r) : calc(t.second % 2, t.second, r)));
    solve(t.second + 1, r, add + ((r - t.second) % 2? calc((t.second % 2) ^ 1, l, t.second) : calc(t.second % 2, l, t.second)));

    //cout << "solve : " << l << ' ' << r << ' ' << t.second << ' ' << add << endl;

    ans[t.second] = add + B[t.second];
    while(l < r) {
        //cout << l << ' ' << r << ' ' << ans[t.second] << endl;

        pii t1 = bit.quer(l, t.second - 1, 0, N - 1, 1);
        pii t2 = bit.quer(t.second + 1, r, 0, N - 1, 1);
        if(t1 < t2) {
            ans[t.second] += (r - t1.second) % 2? calc((t1.second % 2) ^ 1, l, t1.second) : calc(t1.second % 2, l, t1.second);
            l = t1.second + 1;
        }
        else {
            ans[t.second] += (t2.second - l) % 2? calc((t2.second % 2) ^ 1, t2.second, r) : calc(t2.second % 2, t2.second, r);
            r = t2.second - 1;
        }
    }
}

int main() {
    scanf("%d", &N);

    for(int i = 0; i < N; i++) {
        scanf("%d", &A[i]);
    }

    int p = 0;
    for(int i = 0; i < N; i++) {
        if(A[p] > A[i]) p = i;
    }
    for(int i = 0; i < N; i++) {
        B[i] = A[(i + p) % N];
    }
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < 2; j++) {
            psum[j][i] = i % 2 == j? B[i] : 0;
            if(i) psum[j][i] += psum[j][i - 1];
        }
    }

    int l = 1, r = N - 1, t = 0;
    ans[0] = B[0];
    while(l <= r) {
        if(B[l] >= B[r]) {
            if(t) ans[0] += B[l];
            l++;
        }
        else {
            if(t) ans[0] += B[r];
            r--;
        }
        t ^= 1;
    }

    bit.init();
    solve(1, N - 1, N % 2? B[0] : 0);

    for(int i = 0; i < N; i++) {
        printf("%lld\n", ans[ (i + N - p) % N ]);
    }
}

Compilation message (stderr)

cake.cpp: In function 'int main()':
cake.cpp:68:20: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &N);
                    ^
cake.cpp:71:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &A[i]);
                           ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...