제출 #1243447

#제출 시각아이디문제언어결과실행 시간메모리
1243447aykhn나일강 (IOI24_nile)C++20
38 / 100
55 ms8892 KiB
#include "nile.h"
#include <vector>
#include <algorithm>
#include <limits>
#include <bits/stdc++.h>

using ll = long long;
using namespace std;
static const ll NEG_INF = std::numeric_limits<ll>::min() / 4;

// 2x2 max-plus matrix
struct Mat {
    ll a[2][2];
};

// Max-plus multiplication: C = B * A
static Mat mmul(const Mat &B, const Mat &A) {
    Mat C;
    for(int i = 0; i < 2; i++) {
        for(int j = 0; j < 2; j++) {
            ll v = NEG_INF;
            for(int k = 0; k < 2; k++) {
                v = std::max(v, B.a[i][k] + A.a[k][j]);
            }
            C.a[i][j] = v;
        }
    }
    return C;
}

std::vector<long long> calculate_costs(
    std::vector<int> W, std::vector<int> A,
    std::vector<int> B, std::vector<int> E) {
    int N = W.size(), Q = E.size();
    
    // base sum
    long long sumA = 0;
    for(int i = 0; i < N; i++) sumA += A[i];
    if(N == 1) return std::vector<ll>(Q, sumA);

    // sort items by weight
    struct It{int w, idx;};
    std::vector<It> it(N);
    for(int i=0;i<N;i++) it[i]={W[i],i};
    std::sort(it.begin(), it.end(),[](auto &x,auto &y){return x.w<y.w;});
    
    // compute gaps
    std::vector<pair<int,int>> gaps;
    for(int k=1;k<N;k++) gaps.emplace_back(it[k].w - it[k-1].w, k);
    std::sort(gaps.begin(), gaps.end());

    // queries sorted
    vector<pair<int,int>> qs(Q);
    for(int i=0;i<Q;i++) qs[i]={E[i],i};
    sort(qs.begin(), qs.end());
    
    // DSU
    vector<int> p(N), sz(N,1);
    vector<long long> sumd(N), mind(N);
    for(int i=0;i<N;i++){
        p[i]=i;
        sumd[i] = (long long)A[it[i].idx] - B[it[i].idx];
        mind[i] = sumd[i];
    }
    function<int(int)> find=[&](int x){return p[x]==x?x:p[x]=find(p[x]);};
    auto comp_val=[&](int r)->long long{
        // matched sum in component: if size even sumd, else sumd - mind
        if(sz[r]%2==0) return sumd[r];
        else return sumd[r] - mind[r];
    };
    long long matched=0;
    // initially no matches
    
    vector<long long> ans(Q);
    int ptr=0;
    for(auto &qr:qs){
        int D=qr.first, qi=qr.second;
        while(ptr<(int)gaps.size() && gaps[ptr].first<=D){
            int k=gaps[ptr].second;
            int u = find(k-1), v = find(k);
            if(u!=v){
                // remove old contributions
                matched -= comp_val(u);
                matched -= comp_val(v);
                // unify
                p[v]=u;
                sz[u]+=sz[v];
                sumd[u]+=sumd[v];
                mind[u]=min(mind[u], mind[v]);
                // add new
                matched += comp_val(u);
            }
            ptr++;
        }
        ans[qi] = sumA - matched;
    }
    return ans;
}
#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...