제출 #1177551

#제출 시각아이디문제언어결과실행 시간메모리
1177551TahirAliyev나일강 (IOI24_nile)C++20
32 / 100
120 ms43656 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;
int n;
array<int, 2> arr[MAX];
int ans = 0;
struct DSU{
    multiset<int> s[MAX];
    int par[MAX];
    void init(){
        for(int i = 0; i < n; i++){
            par[i] = -1;
            s[i] = {arr[i][1]};
            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){
        u = get(u), v = get(v);
        if(u == v) return 0;
        if(-par[u] < -par[v]) swap(u, v);
        if(s[u].size() & 1) ans -= *s[u].begin();
        if(s[v].size() & 1) ans -= *s[v].begin();
        par[u] += par[v];
        par[v] = u;
        for(int a : s[v]) s[u].insert(a);
        if(s[u].size() & 1) ans += *s[u].begin();
        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);
    vector<pii> v;
    for(int i = 0; i < n - 1; i++){
        v.push_back({arr[i + 1][0] - arr[i][0], i});
    }
    sort(all(v));
    reverse(all(v));
    vector<pii> Q;
    for(int i = 0; i < E.size(); i++) Q.push_back({E[i], i});
    dsu.init();
    sort(all(Q));
    vector<ll> res(Q.size(), 0);
    for(pii d : Q){
        while(v.size() && v.back().first <= d.first){
            dsu.unite(v.back().second, v.back().second + 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...