제출 #1136269

#제출 시각아이디문제언어결과실행 시간메모리
1136269naneosmic나일강 (IOI24_nile)C++20
100 / 100
115 ms24492 KiB
#include "nile.h"
#include <bits/stdc++.h>
#define int long long
#define endl "\n"
#define mp make_pair
using namespace std;
int n;
int curr=0;
struct node{
    int ans;
    int even;
    int evenskip;
    int odd;
    int oddskip;
    int size;
    void operator+(node a){
        curr-=this->ans;
        curr-=a.ans;
        if(this->size==1){
            this->even=min(this->even,a.odd);
            this->odd=min(this->odd,a.even);
            this->evenskip=min(this->evenskip,a.oddskip);
            this->oddskip=min(this->oddskip,a.evenskip);
        }else{
            this->even=min(this->even,a.even);
            this->odd=min(this->odd,a.odd);
            this->evenskip=min(this->evenskip,a.evenskip);
            this->oddskip=min(this->oddskip,a.oddskip);
        }
        this->size+=a.size;
        this->size%=2;
        if(this->size==0)ans=0;
        else{
            ans=min(this->odd,this->evenskip);
        }
        curr+=this->ans;
        return;
    }
};
struct dsu{
    vector<int>parent;
    vector<int>vals;
    vector<node>v;
    dsu(vector<pair<int,pair<int,int>>>&artifact){
        parent.resize(n);
        vals.resize(n);
        for(int i=0;i<n;i++)parent[i]=i;
        v.resize(n);
        for(int i=0;i<n;i++){
            curr+=artifact[i].second.second;
            int val=artifact[i].second.second-artifact[i].second.first;
            vals[i]=val;
            v[i].ans=val;
            v[i].odd=val;
            v[i].size=1;
            v[i].even=LLONG_MAX;
            v[i].evenskip=LLONG_MAX;
            v[i].oddskip=LLONG_MAX;
        }
    }
    int query(int a){
        if(parent[a]==a){
            return a;
        }
        return parent[a]=query(parent[a]);
    }
    void merge(int a,int b){
        int ff=query(a),ss=query(b);
        if(ff==ss)return;
        if(ff<ss){
            parent[ss]=ff;
            v[ff]+v[ss];
        }else{
            parent[ff]=ss;
            v[ss]+v[ff];
        }
    }
    void update(int idx){
        int par=query(idx);
        curr-=v[par].ans;
        int broj=idx-par+1;
        broj%=2;
        if(broj==0){
            v[par].evenskip=min(v[par].evenskip,vals[idx]);
        }else{
            v[par].oddskip=min(v[par].oddskip,vals[idx]);
        }
        v[par].ans=min(v[par].odd,v[par].evenskip);
        if(v[par].size==0LL)v[par].ans=0LL;
        curr+=v[par].ans;
    }
};
vector<int> calculate_costs(vector<signed> W, vector<signed> A,vector<signed> B, vector<signed> E) {
    n=A.size();
    vector<pair<int,pair<int,int>>>artifact(n);
    for(int i=0;i<n;i++){
        artifact[i].first=W[i];
        artifact[i].second.first=B[i];
        artifact[i].second.second=A[i];
    }
    sort(artifact.begin(),artifact.end());
    dsu solution(artifact);
    priority_queue<pair<int,pair<int,int>>>q;
    for(int i=0;i<n-1;i++){
        q.push(mp(-(artifact[i+1].first-artifact[i].first),mp(i,i+1)));
    }
    for(int i=0;i<n-2;i++){
        q.push(mp(-(artifact[i+2].first-artifact[i].first),mp(i,i+2)));
    }
    vector<pair<int,int>>nums;
    vector<int>answers;
    nums.push_back(mp(0LL,0LL));
    answers.push_back(curr);
    while(!q.empty()){
        pair<int,pair<int,int>>p=q.top();
        q.pop();
        p.first*=(-1);
        nums.push_back(mp(p.first,nums.size()));
        if(p.second.second-p.second.first==1){
            solution.merge(p.second.first,p.second.second);
        }else{
            solution.update(p.second.first+1);
        }
        answers.push_back(curr);
    }
    signed Q = (signed)E.size();
    vector<int> R(Q);
    for(int i=0;i<Q;i++){
        int c=E[i];
        auto it=upper_bound(nums.begin(),nums.end(),mp(c+1,-1LL));
        it--;
        pair<int,int>p=*it;
        R[i]=answers[p.second];
    }
    return R;
}
#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...