Submission #1362369

#TimeUsernameProblemLanguageResultExecution timeMemory
1362369codexistentNile (IOI24_nile)C++20
38 / 100
56 ms15524 KiB
#include "nile.h"
#include <bits/stdc++.h>
using namespace std;
const long long N=1e5+5,M=1e5+5;

long long n,m,sz[N],p[N],dq[N],sm[N],ri;
array<long long,2>q[M],rg[N],f[N];
priority_queue<array<long long,2>,vector<array<long long,2>>,greater<array<long long,2>>>q2,q3;

long long find(long long x){return (p[x]==x)?p[x]:(p[x]=find(p[x]));}
void onion(long long a,long long b){
    a=find(a),b=find(b);
    if(a==b)return;
    if(sz[a]<sz[b])swap(a,b);

    if(rg[a][1]>rg[b][1]){
        swap(a,b);
        if(rg[a][0]<rg[a][1]&&rg[a][1]<rg[b][1])q3.push({abs(f[rg[a][1]-1][1]-f[rg[a][1]+1][1]),rg[a][1]});
        if(rg[a][0]<rg[b][0]&&rg[b][0]<rg[b][1])q3.push({abs(f[rg[b][0]-1][1]-f[rg[b][1]+1][1]),rg[b][0]});
    swap(a,b);
    }else{
        if(rg[a][0]<rg[a][1]&&rg[a][1]<rg[b][1])q3.push({abs(f[rg[a][1]-1][1]-f[rg[a][1]+1][1]),rg[a][1]});
        if(rg[a][0]<rg[b][0]&&rg[b][0]<rg[b][1])q3.push({abs(f[rg[b][0]-1][1]-f[rg[b][1]+1][1]),rg[b][0]});
    }

    ri-=sm[a]-(sz[a]%2)*max({dq[a],f[rg[a][0]][1],f[rg[a][1]][1]});
    ri-=sm[b]-(sz[b]%2)*max({dq[b],f[rg[b][0]][1],f[rg[b][1]][1]});
    sz[a]+=sz[b],dq[a]=max(dq[a],dq[b]),p[a]=p[b]=a,sm[a]+=sm[b];
    rg[a]={min(rg[a][0],rg[b][0]),max(rg[a][1],rg[b][1])};
    ri+=sm[a]-(sz[a]%2)*max({dq[a],f[rg[a][0]][1],f[rg[a][1]][1]});
}
void upd(long long x){
    long long y=find(x);
    ri-=sm[y]-(sz[y]%2)*max({dq[y],f[rg[y][0]][1],f[rg[y][1]][1]});
    dq[y]=max(dq[y],f[x][1]);
    ri+=sm[y]-(sz[y]%2)*max({dq[y],f[rg[y][0]][1],f[rg[y][1]][1]});
}

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(),m=E.size(),ri=0;
    for(long long i=0;i<n;i++)f[i]={W[i],B[i]-A[i]};
    sort(f,f+n);
    for(long long i=0;i<n;i++)sz[i]=1,p[i]=i,dq[i]=LLONG_MIN,sm[i]=f[i][1],rg[i]={i,i},ri+=A[i];
    for(long long i=0;i<m;i++)q[i]={E[i],i};
    sort(q,q+m);
    for(long long i=0;i<n-1;i++)q2.push({abs(f[i][0]-f[i+1][0]),i});

    vector<long long>r(m);
    for(long long i=0;i<m;i++){
        auto qi=q[i];
        while(q2.size()&&q2.top()[0]<=qi[0]){
            onion(q2.top()[1],q2.top()[1]+1),q2.pop();
        }
        while(q3.size()&&q3.top()[0]<=qi[0])upd(q3.top()[1]),q3.pop();
        r[qi[1]]=ri;
    }

    while(q2.size())q2.pop();
    while(q3.size())q3.pop();
    return r;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...