Submission #1369901

#TimeUsernameProblemLanguageResultExecution timeMemory
1369901moha1111Nile (IOI24_nile)C++20
0 / 100
31 ms8104 KiB
//#include "nile.h"
#include "bits/stdc++.h"
using namespace std;

// size of comp    parent     minimum(a[i] - b[i]) for the parent   sum(b[i]) for the parent
int sz[100005] , par[100005] , mn[100005] ,                         sumb[100005];
int sum;

int P(int node)
{
    if(node == par[node])
        return par[node];

    return par[node] = P(par[node]);
}

void mrg(int a , int b)
{
    int u = P(a) , v = P(b);
    if(sz[u] < sz[v])
        swap(u , v);

    if(sz[u] % 2)
        sum -= sumb[u] + mn[u];

    else
        sum -= sumb[u];

    if(sz[v] % 2)
        sum -= sumb[v] + mn[v];

    else
        sum -= sumb[v];

    sumb[u] += sumb[v];
    mn[u] = min(mn[u] , mn[v]);
    sz[u] += sz[v];
    par[v] = u;
    sum += sumb[u];
    if(sz[u] % 2)
        sum += mn[u];
}

std::vector<long long> calculate_costs(std::vector<int> w, std::vector<int> A , std::vector<int> B, std::vector<int> E) {
  
    long long n = A.size() , q = E.size();
    sum = accumulate(A.begin() , A.end() , 0LL);
    vector<int> dif(n + 5) , a(n) , b(n);
    vector<pair<int , int>> W;
    for(int i = 0 ; i < n ; i++)
        W.push_back({w[i] , i});

    sort(W.begin() , W.end());
    sort(w.begin() , w.end());
    for(int i = 1 ; i < n ; i++)
        a[i] = A[W[i].second] , b[i] = B[W[i].second];
    
    vector<array<int , 3>> ed;
    for(int i = 1 ; i < n ; i++)
        ed.push_back({w[i + 1] - w[i] , i , i + 1});
    
    sort(ed.begin() , ed.end());
    vector<long long> ans(q);
    vector<pair<int , int>> e;
    for(int i = 0 ; i < q ; i++)
        e.push_back({E[i] , i});

    for(int i = 1 ; i <= n ; i++)
    {
        par[i] = i;
        sz[i] = 1;
        mn[i] = a[i] - b[i];
        sumb[i] = b[i];
    }
    sort(e.begin() , e.end());
    int i = 0;
    while(q--)
    {
        long long d = e.back().first , ine = e.back().second;
        e.pop_back();
        while(i < n - 1 && ed[i][0] <= d)
            mrg(ed[i][1] , ed[i][2]) , i++;
        
        ans[ine] = sum;
    }
    return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...