Submission #1241382

#TimeUsernameProblemLanguageResultExecution timeMemory
1241382tvgk케이크 (JOI13_cake)C++20
0 / 100
87 ms20804 KiB
#include<bits/stdc++.h>
using namespace std;
#define task "a"
#define se second
#define fi first
#define ll long long
#define ii pair<ll, ll>
const long mxN = 3e5 + 7;

struct node
{
    ll sum[2];
    bool cnt;
};

node tree[mxN * 8], up;
int n, a[mxN], vt[mxN], nw[mxN];
ii arr[mxN * 2], b[mxN];
ll ans[mxN];

node Merge(node a, node b)
{
    node res;
    res.cnt = a.cnt ^ b.cnt;
    res.sum[1] = a.sum[1] + b.sum[a.cnt ^ 1];
    res.sum[0] = a.sum[0] + b.sum[a.cnt];
    return res;
}

void Build(int j = 1, int l = 1, int r = 2 * n)
{
    if (l == r)
    {
        tree[j].cnt = arr[l].se;
        tree[j].sum[1] = arr[l].fi * arr[l].se;
        return;
    }

    int mid = (l + r) / 2;
    Build(j * 2, l, mid);
    Build(j * 2 + 1, mid + 1, r);
    tree[j] = Merge(tree[j * 2], tree[j * 2 + 1]);
}

void Ers(int vt, int j = 1, int l = 1, int r = 2 * n)
{
    if (l > vt || vt > r)
        return;

    if (l == r)
    {
        up = Merge(up, tree[j]);
        tree[j].cnt = tree[j].sum[0] = tree[j].sum[1] = 0;
        return;
    }

    int mid = (l + r) / 2;
    Ers(vt, j * 2, l, mid);
    Ers(vt, j * 2 + 1, mid + 1, r);
    tree[j] = Merge(tree[j * 2], tree[j * 2 + 1]);
}

void Upd(int vt, int j = 1, int l = 1, int r = 2 * n)
{
    if (l > vt || vt > r)
        return;

    if (l == r)
    {
        tree[j] = up;
        return;
    }

    int mid = (l + r) / 2;
    Upd(vt, j * 2, l, mid);
    Upd(vt, j * 2 + 1, mid + 1, r);
    tree[j] = Merge(tree[j * 2], tree[j * 2 + 1]);
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    //freopen(task".INP", "r", stdin);
    //freopen(task".OUT", "w", stdout);

    cin >> n;
    int mn = 0;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
        b[i] = {a[i], i};
        if (a[i] < a[mn])
            mn = i;
    }
    sort(b, b + n, greater<ii>());

    int ctr = 0;
    for (int i = 1; i <= n; i++)
    {
        while (ctr < n && a[(mn + i) % n] <= b[ctr].fi)
        {
            arr[i + ctr].fi = b[ctr].fi;
            nw[b[ctr].se] = i + ctr;
            ctr++;
        }
        arr[i + ctr].fi = a[(mn + i) % n];
        arr[i + ctr].se = 1;
        vt[(mn + i) % n] = i + ctr;
    }
    Build();

    Ers(vt[mn]);
    vector<int> val;
    for (int i = 1; i <= n; i++)
    {
        // Reset up
        up.cnt = 1;
        up.sum[0] = 0;
        up.sum[1] = a[mn];

        // Gop trai
        while (val.size() && val.back() <= nw[mn])
        {
            Ers(val.back());
            val.pop_back();
        }
        val.push_back(nw[mn]);

        // Cap nhat
        Upd(nw[mn]);

        mn = (mn + 1) % n;
        // Xoa vi tri hien tai
        Ers(vt[mn]);

        ans[mn] = tree[1].sum[0] + a[mn];
    }
    ans[mn] -= a[mn];

    for (int i = 0; i < n; i++)
        cout << ans[i] << '\n';
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...