제출 #1368034

#제출 시각아이디문제언어결과실행 시간메모리
1368034AlmontherNile (IOI24_nile)C++20
100 / 100
102 ms20652 KiB
#include<bits/stdc++.h>

using namespace std;

#define ll long long
const int maxn=1e5+5;
ll n,par[maxn],no[maxn],sumofB[maxn],mnO[maxn],mnE[maxn],exO[maxn],exE[maxn];
ll ans=0;
set<pair<ll,ll>>vals;
array<ll,3>arr[maxn];
ll sol(vector<array<ll,3>>arr,ll d){
    ll ans=1e18,sum=0,n=arr.size();
    for(auto i:arr) sum+=i[2];
    if(n%2==0) return sum;
    for(int i=1;i<=arr.size();i++) if(i%2||arr[i+1][0]-arr[i-1][0]<=d) ans=min(ans,sum+arr[i][1]-arr[i][2]);
    return ans;
}
ll dsu(ll x){
    if(x==par[x]) return x;
    return par[x]=dsu(par[x]);
}
void merge(ll a,ll b){
    ll x=dsu(a),y=dsu(b);
    ans-=sumofB[x];
    if(no[x]%2) ans-=min(mnO[x],exE[x]);
    ans-=sumofB[y];
    if(no[y]%2) ans-=min(mnO[y],exE[y]);
    if(no[x]%2==0){
        mnO[x]=min(mnO[x],mnO[y]); 
        mnE[x]=min(mnE[x],mnE[y]); 
        exO[x]=min(exO[x],exO[y]);
        exE[x]=min(exE[x],exE[y]);
    }
    else{
        mnO[x]=min(mnO[x],mnE[y]); 
        mnE[x]=min(mnE[x],mnO[y]); 
        exO[x]=min(exO[x],exE[y]);
        exE[x]=min(exE[x],exO[y]);
    }
    if(no[x]>1) vals.insert({arr[a+1][0]-arr[a-1][0],a});
    if(no[y]>1) vals.insert({arr[b+1][0]-arr[b-1][0],b});
    no[x]+=no[y];
    sumofB[x]+=sumofB[y];
    par[y]=x;
    ans+=sumofB[x];
    if(no[x]%2) ans+=min(mnO[x],exE[x]);
}
std::vector<long long> calculate_costs(std::vector<int> W, std::vector<int> A,std::vector<int> B, std::vector<int> E){
    n=W.size();
    vector<ll>anss(E.size());
    for(int i=0;i<n;i++) arr[i]={W[i],A[i],B[i]};
    sort(arr,arr+n);
    set<pair<ll,ll>>diff;
    for(int i=0;i<n;i++){
        if(i) diff.insert({arr[i][0]-arr[i-1][0],i});
        par[i]=i,no[i]=1,sumofB[i]+=arr[i][2],ans+=arr[i][1];
        mnO[i]=arr[i][1]-arr[i][2],mnE[i]=exO[i]=exE[i]=1e18;
    }
    vector<pair<ll,ll>>ds;
    for(int i=0;i<E.size();i++) ds.push_back({E[i],i});
    sort(ds.begin(),ds.end());
    for(auto [d,idd]:ds){
        while(diff.size()&&diff.begin()->first<=d){
            ll x=diff.begin()->second;
            diff.erase(diff.begin());
            merge(x,x-1);
        }
        while(vals.size()&&vals.begin()->first<=d){
            auto[val,x]=*vals.begin();
            vals.erase(vals.begin());
            ll pa=dsu(x);
            ans-=sumofB[pa];
            if(no[pa]%2) ans-=min(mnO[pa],exE[pa]);
            //
            if((pa-x)%2) exE[pa]=min(exE[pa],arr[x][1]-arr[x][2]);
            else exO[pa]=min(exO[pa],arr[x][1]-arr[x][2]);
            //
            ans+=sumofB[pa];
            if(no[pa]%2) ans+=min(mnO[pa],exE[pa]);
        }
        anss[idd]=ans;
        // cout<<d<<' '<<ans<<'\n';
    }
    return anss;
}
// int main(){
//     calculate_costs({15, 12, 2, 10, 21},
//                 {5, 4, 5, 6, 3},
//                 {1, 2, 2, 3, 2},
//                 {5, 9, 1});
// }
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…