제출 #1316417

#제출 시각아이디문제언어결과실행 시간메모리
1316417krazeeStove (JOI18_stove)C++20
100 / 100
30 ms4924 KiB
#include <bits/stdc++.h>
#define int long long
#define pb push_back
#define se second
#define fi first
using namespace std;
int par[100005];

int root(int x){
    if(par[x]==x)return x;
    return par[x]=root(par[x]);
}

void merge(int a, int b){
    int x=root(a), y=root(b);
    par[x]=y;
}

signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n, k;
    cin>>n>>k;
    int t[n+5]={}, ans=n, mx=0, mn=1e9, res=0;
    priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>>pq;
    for(int i=1; i<=n; i++){
        cin>>t[i];
        par[i]=i;
        if(i!=1)pq.push({t[i]-t[i-1], {i-1, i}});
    }
    while(!pq.empty()&&ans!=k){
        int f=pq.top().fi, g=pq.top().se.fi, h=pq.top().se.se;
        pq.pop();
        merge(g, h);
        ans--;
    }
    mx=mn=t[1];
    for(int i=2; i<=n; i++){
         if(root(i)!=root(i-1)){
            res+=mx-mn+1;
            mx=mn=t[i];
        }
        mx=max(mx, t[i]);
        mn=min(mn, t[i]);
    }
    res+=mx-mn+1;
    cout<<res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...