Submission #1309111

#TimeUsernameProblemLanguageResultExecution timeMemory
1309111dorkikannCandies (JOI18_candies)C++20
100 / 100
75 ms10668 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;

const int N = 2e5 + 5;

ll A[N];

int Point[N];
ll Value[N];
pair<int, int> Segment[N];

int Find(int u) {
    if(u == Point[u])
        return u;
    return Point[u] = Find(Point[u]);
}

void Union(int a, int b) {
    a = Find(a);
    b = Find(b);

    if(a == b)
        return;
    
    Point[a] = b;
    Segment[b].first = min(Segment[b].first, Segment[a].first);
    Segment[b].second = max(Segment[b].second, Segment[a].second);
    Value[b] += Value[a];
}

bool Correct(pair<ll, int> x)
{
    int u = Find(x.second);

    if((Segment[u].second - Segment[u].first) % 2 == 1)
        return false;

    return (Value[u] == x.first);
}

void Fix(int u, int n)
{  
    u = Find(u);
    
    int a = max(1, Segment[u].first - 1);
    int b = min(n, Segment[u].second + 1);

    Value[u] *= -1;
    Union(a, u);
    Union(u, b);
}

void Solve(int n)
{
    priority_queue<pair<ll, int>> PQ;
    
    for(int i = 1; i <= n; i++) {
        Point[i] = i;
        Segment[i] = {i, i};

        Value[i] = A[i];
        PQ.push({A[i], i});
    }

    ll sol = 0;
    for(int i = 0; i < (n+1)/2; i++) {
        pair<ll, int> add;
        do {
            add = PQ.top();
            PQ.pop();
        } while(!Correct(add));

        sol += add.first;
        Fix(add.second, n);
        PQ.push({Value[Find(add.second)], Find(add.second)});

        cout << sol << "\n";
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int n;
    cin >> n;

    for(int i = 1; i <= n; i++)
        cin >> A[i];

    Solve(n);
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...