Submission #1183722

#TimeUsernameProblemLanguageResultExecution timeMemory
1183722rayan_bdNile (IOI24_nile)C++20
100 / 100
93 ms23228 KiB
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define ll long long
#define pb push_back
#define all(x) x.begin(), x.end()

const int mxN = 1e5 + 1000;
const ll INF = 2e18;

ll parent[mxN], sz[mxN], bsum[mxN], c1[mxN], c2[mxN], c3[mxN], c[mxN], mn[mxN]; // c1 even
vector<vector<int>> nvec;
vector<pair<int, int>> qry;
vector<pair<ll, pair<bool, int>>> diff;

int find_par(int u)
{
    if (parent[u] == u)
        return u;
    return parent[u] = find_par(parent[u]);
}

ll get_answer(int u)
{
    int par = find_par(u);
    if (sz[par] & 1 ^ 1)
        return bsum[par];
    else
    {
        if (mn[par] & 1)
            return bsum[par] + min(c2[par], c3[par]);
        else
            return bsum[par] + min(c1[par], c3[par]);
    }
}

void unite(int u, int v)
{
    int ulp = find_par(u);
    int vlp = find_par(v);
    if (ulp == vlp)
        return;
    parent[ulp] = vlp;
    sz[vlp] += sz[ulp];
    bsum[vlp] += bsum[ulp];
    mn[vlp] = min(mn[vlp], mn[ulp]);
    c1[vlp] = min(c1[vlp], c1[ulp]);
    c2[vlp] = min(c2[vlp], c2[ulp]);
    c3[vlp] = min(c3[vlp], c3[ulp]);
}

void upd(int u, ll x)
{
    int ulp = find_par(u);
    c3[ulp] = min(c3[ulp], x);
}

std::vector<long long> calculate_costs(
    std::vector<int> W, std::vector<int> A,
    std::vector<int> B, std::vector<int> E)
{
    int N = W.size(), Q = E.size();
    int idx = 0;
    ll ans = 0;
    vector<ll> res(Q);
    for (int i = 0; i < N; ++i)
    {
        nvec.pb({W[i], A[i], B[i]});
        ans += A[i];
    }
    for (int i = 0; i < Q; ++i)
    {
        qry.pb({E[i], i});
    }

    sort(all(qry));
    sort(all(nvec));

    for (int i = 0; i < N; ++i)
    {
        parent[i] = i;
        bsum[i] = nvec[i][2];
        sz[i] = 1;
        c1[i] = c2[i] = c3[i] = INF;
        mn[i] = i;
        c[i] = nvec[i][1] - nvec[i][2];
        if (i & 1 ^ 1)
            c1[i] = c[i];
        else
            c2[i] = c[i];
    }

    for (int i = 0; i < N - 1; ++i)
    {
        diff.pb({nvec[i + 1][0] - nvec[i][0], {0, i}});
        if (i + 2 < N)
        {
            diff.pb({nvec[i + 2][0] - nvec[i][0], {1, i}});
        }
    }
    sort(all(diff), [&](pair<int, pair<bool, int>> v1, pair<int, pair<bool, int>> v2)
         {
        if(v1.fi==v2.fi){
            return (int)v1.se.fi<(int)v2.se.fi;
        } 
        return v1.fi<v2.fi; });

    for (auto it : qry)
    {
        while (idx < (int)diff.size() && diff[idx].fi <= it.fi)
        {

            ans -= get_answer(diff[idx].se.se);
            if (find_par(diff[idx].se.se) != find_par(diff[idx].se.se + 1))
            {
                ans -= get_answer(diff[idx].se.se + 1);
            }
            if (diff[idx].se.fi)
            {
                upd(diff[idx].se.se, c[diff[idx].se.se + 1]);
            }
            //  cout << ans << " ";
            unite(diff[idx].se.se, diff[idx].se.se + 1);
            ans += get_answer(diff[idx].se.se);
            // cout << ans << " " << get_answer(diff[idx].se.se) << endl;
            ++idx;
        }
        res[it.se] = ans;
    }
    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...