Submission #651176

#TimeUsernameProblemLanguageResultExecution timeMemory
651176WunkaStove (JOI18_stove)C++17
100 / 100
60 ms4560 KiB
#include<bits/stdc++.h>
using namespace std;

#define ll long long 
#define fi first 
#define se second 

const int INF = 1e9; 

class DSU {
public:
    vector<int> sz; 
    vector<int> id; 
    int components = 0; 
    
    void init(int n) {
        sz.assign(n, 1); 
        id.assign(n, 0); 
        for(int i = 0; i < n; i++) {
            id[i] = i; 
        }
        components = n; 
    }

    int find(int x) {
        if(x == id[x]) return x; 
        return (id[x] = find(id[x])); 
    }

    void unite(int x, int y) {
        x = find(x); 
        y = find(y); 
        if(x == y) return; 

        if(sz[x] < sz[y]) 
            swap(x, y); 
        id[y] = x; 
        sz[x] += sz[y]; 
        components--;  
    }

    int getComponents() { return components; }  
}; 

struct edge {
    int x, y, w; 
};

bool cmp(const edge& a, const edge& b) {
    return (a.w <= b.w); 
}


int main() {
    int n, k; 
    cin >> n >> k; 

    vector<ll> t(n); 
    for(int i = 0; i < n; i++) cin >> t[i]; 
    sort(t.begin(), t.end()); 
    if(n == k) {
        cout << n << '\n'; 
        return 0;  
    }

    // get our edges 
    vector<edge> e;
    for(int i = 0; i < n - 1; i++) {
        edge a; 
        a.x = i; 
        a.y = i + 1; 
        a.w = (t[i + 1] - t[i]); 
        e.push_back(a); 
    }


    // sort them 
    sort(e.begin(), e.end(), cmp); 
    /*
    cout << "my edges: " << '\n'; 
    for(int i = 0; i < n - 1; i++) {
        cout << e[i].x << ' ' << e[i].y << ' ' << e[i].w << '\n'; 
    }
    */

    // unify them into components 
    DSU uf;
    uf.init(n); 
    
   for(int i = 0; i < (n - 1) - (k - 1); i++) {
        //cout << "trying to unite " << e[i].x << ' ' << e[i].y << '\n';  
        uf.unite(e[i].x, e[i].y);
        //cout << "PASSED THIS CASE!" << '\n'; 
    }
   

    // for future 
    int m = uf.getComponents(); // number of components; 
    vector<pair<ll, ll>> intervals(n); 
    for(int i = 0; i < n; i++) {
        intervals[i].fi = INF;  
        intervals[i].se = -INF;  
    }

    for(int i = 0; i < n; i++) {
        int root = uf.find(i); 
        intervals[root].fi = min(intervals[root].fi, t[i]);  
        intervals[root].se = max(intervals[root].se, t[i] + 1);  
    }

    // calculate the answer
    ll ans = 0;
    /*
    for(int i = 0; i < n; i++) {
        cout << intervals[i].fi << ' ' << intervals[i].se << '\n'; 
    } 
    */ 
    for(int i = 0; i < n; i++) {
        if(intervals[i].fi != INF) {
            ans += intervals[i].se - intervals[i].fi; 
        }
    }

    cout << ans << '\n'; 
}

Compilation message (stderr)

stove.cpp: In function 'int main()':
stove.cpp:98:9: warning: unused variable 'm' [-Wunused-variable]
   98 |     int m = uf.getComponents(); // number of components;
      |         ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...