Submission #1177573

#TimeUsernameProblemLanguageResultExecution timeMemory
1177573TahirAliyevNile (IOI24_nile)C++20
100 / 100
74 ms9912 KiB
#include "nile.h"
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int, int>
#define all(v) v.begin(), v.end()
#define ll long long

const int MAX = 1e5 + 5, oo = 1e9 + 7;
int n;
array<int, 2> arr[MAX];
ll ans = 0;
struct DSU{
    int odd[MAX], even[MAX], mn[MAX];
    int par[MAX];
    void init(){
        for(int i = 0; i < n; i++){
            par[i] = -1;
            odd[i] = arr[i][1];
            even[i] = oo;
            mn[i] = oo;
            ans += arr[i][1];
        }
    }
    int get(int a){
        if(par[a] < 0) return a;
        return par[a] = get(par[a]);
    }
    bool unite(int u, int v){
        int i = v;
        u = get(u), v = get(v);
        if(u == v){
            if((-par[u]) & 1) ans -= min(mn[u], odd[u]);
            mn[u] = min(mn[u], arr[i][1]);
            if((-par[u]) & 1) ans += min(mn[u], odd[u]);
            return 0;
        }
        if((-par[u]) & 1) ans -= min(mn[u], odd[u]);
        if((-par[v]) & 1) ans -= min(mn[v], odd[v]);
        if((-par[u]) & 1){
            odd[u] = min(odd[u], even[v]);
            even[u] = min(even[u], odd[v]);
        }
        else{
            odd[u] = min(odd[u], odd[v]);
            even[u] = min(even[u], even[v]);
        }
        par[u] += par[v];
        par[v] = u;
        mn[u] = min(mn[u], mn[v]);
        if((-par[u]) & 1) ans += min(mn[u], odd[u]);
        return 1;
    }
};

DSU dsu;

vector<ll> calculate_costs(vector<int> W, vector<int> A, vector<int> B, vector<int> E){
    n = W.size();
    for(int i = 0; i < n; i++){
        arr[i] = {W[i], A[i] - B[i]};
        ans += B[i];
    }
    sort(arr, arr + n);
    dsu.init();
    vector<array<int, 3>> v;
    for(int i = 0; i < n - 1; i++){
        v.push_back({arr[i + 1][0] - arr[i][0], i, 1});
        if(i < n - 2) v.push_back({arr[i + 2][0] - arr[i][0], i + 1, 0});   
    }
    sort(all(v));
    reverse(all(v));
    vector<pii> Q;
    for(int i = 0; i < E.size(); i++) Q.push_back({E[i], i});
    sort(all(Q));
    vector<ll> res(Q.size(), 0);
    for(pii d : Q){
        while(v.size() && v.back()[0] <= d.first){
            if(v.back()[2]){
                dsu.unite(v.back()[1], v.back()[1] + 1);
                v.pop_back();
            }
            else{
                dsu.unite(v.back()[1], v.back()[1]);
                v.pop_back();
            }
        }
        res[d.second] = 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...