제출 #1102338

#제출 시각아이디문제언어결과실행 시간메모리
1102338ro9669나일강 (IOI24_nile)C++17
82 / 100
69 ms15632 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define all(v) v.begin() , v.end()
#define sz(v) int(v.size())
#define unq(v) sort(all(v)); v.resize(unique(all(v)) - v.begin());
//#include "nile.h"
using namespace std;

typedef long long ll;
typedef pair<int , int> ii;
typedef pair<long long , int> lli;

const int maxN = int(2e5)+7;

int n , q;
ll dp[maxN];
vector<int> w , a , b , e , id;
vector<ll> res;

namespace sub1{
    bool check(){
        return (q <= 5 && n <= 2000);
    }

    void solve(){
        for (int d : e){
            dp[0] = 0;
            for (int i = 0 ; i < n ; i++){
                ll s = 0;
                int x = INT_MAX;
                dp[i + 1] = ll(1e18);
                for (int j = i ; j >= 0 ; j--){
                    s += b[id[j]];
                    x = min(x , a[id[j]] - b[id[j]]);
                    if (w[id[i]] - w[id[j]] <= d){
                        if ((i - j)&1){
                            dp[i + 1] = min(dp[i + 1] , dp[j] + s);
                        }
                        else{
                            dp[i + 1] = min(dp[i + 1] , dp[j] + s + 1ll * x);
                        }
                    }
                    else{
                        break;
                    }
                }
            }
            res.push_back(dp[n]);
        }
    }
}

namespace sub2{
    bool check(){
        return (q <= 5);
    }

    void solve(){
        for (int d : e){
            dp[0] = 0;
            for (int i = 0 ; i < n ; i++){
                dp[i + 1] = dp[i] + 1ll * a[id[i]];
                if (i - 1 >= 0 && w[id[i]] - w[id[i - 1]] <= d){
                    dp[i + 1] = min(dp[i + 1] , dp[i - 1] + 1ll * b[id[i]] + 1ll * b[id[i - 1]]);
                }
                if (i - 2 >= 0 && w[id[i]] - w[id[i - 2]] <= d){
                    dp[i + 1] = min(dp[i + 1] , dp[i - 2] + 1ll * b[id[i]] + 1ll * a[id[i - 1]] + 1ll * b[id[i - 2]]);
                }
            }
            res.push_back(dp[n]);
        }
    }
}

namespace sub3{
    int fa[maxN];
    ll C[maxN] , S[maxN] , X[maxN] , cur_ans = 0;
    vector<pair<int , ii>> event;
    vector<ii> query;

    int root(int x){
        if (fa[x] < 0) return x; else return fa[x] = root(fa[x]);
    }

    void unite(int u , int v){
        u = root(u);
        v = root(v);
        if (u == v) return;
        if (-fa[u] < -fa[v]) swap(u , v);
        fa[u] += fa[v];
        fa[v] = u;
        S[u] += S[v];
        X[u] = min(X[u] , X[v]);
        cur_ans -= C[u] + C[v];
        if ((-fa[u])&1){
            C[u] = S[u] + X[u];
        }
        else{
            C[u] = S[u];
        }
        cur_ans += C[u];
    }

    void solve(){
        for (int i = 0 ; i < n ; i++){
            cur_ans += 1ll * a[id[i]];
            fa[i] = -1;
            C[i] = a[id[i]];
            S[i] = b[id[i]];
            X[i] = a[id[i]] - b[id[i]];
        }
        for (int i = 0 ; i < n - 1 ; i++){
            event.push_back({w[id[i + 1]] - w[id[i]] , {i , i + 1}});
        }
        res.resize(q);
        for (int i = 0 ; i < q ; i++){
            query.push_back({e[i] , i});
        }
        sort(all(query));
        sort(all(event));
        for (int i = 0 , j = -1 ; i < q ; i++){
            while (j + 1 < n - 1 && event[j + 1].fi <= query[i].fi){
                int u = event[j + 1].se.fi;
                int v = event[j + 1].se.se;
                unite(u , v);
                j++;
            }
            res[query[i].se] = cur_ans;
        }
    }
}

vector<long long> calculate_costs(vector<int> _w , vector<int> _a , vector<int> _b , vector<int> _e){
    w = _w; a = _a; b = _b; e = _e;
    n = sz(w) , q = sz(e);
    id.resize(n);
    for (int i = 0 ; i < n ; i++) id[i] = i;
    sort(all(id) , [](int x , int y){
         return w[x] < w[y];
    });
    if (sub1::check()){
        sub1::solve();
        return res;
    }
    if (sub2::check()){
        sub2::solve();
        return res;
    }
    sub3::solve();
    return res;
}
#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...