제출 #1034862

#제출 시각아이디문제언어결과실행 시간메모리
1034862_8_8_도로 폐쇄 (APIO21_roads)C++17
31 / 100
2098 ms70652 KiB
#include "roads.h"

#include <vector>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = (int)1e5 +12;
vector<pair<int,int>> g[maxn];
ll dp[maxn][2];
int k;
int pos[maxn],id[maxn];
int dep[maxn];
vector<ll> pref[maxn],pref1[maxn];
int n;
int t[maxn * 4];
vector<int> P;
void build(int v = 1,int tl = 0,int tr = n - 1){
    if(tl == tr) {
        t[v] = (int)g[P[tl]].size();
    }else {
        int tm = (tl + tr) >> 1;
        build(v + v,tl,tm);
        build(v + v + 1,tm + 1,tr);
        t[v] = max(t[v + v],t[v + v + 1]);
    }
}
void upd(int pos,int val,int v = 1,int tl = 0,int tr = n - 1){
    if(tl == tr) {
        t[v] = val;
    }else {
        int tm = (tl + tr) >> 1;
        if(pos <= tm) upd(pos,val,v+v,tl,tm);
        else upd(pos,val,v+v+1,tm+1,tr);
        t[v] = max(t[v + v],t[v + v + 1]);
    }
}
int get(int v = 1,int tl = 0,int tr = n - 1){
    if(t[v] <= k) return -1;
    if(tl == tr){
        return P[tl];
    }else{
        int tm = (tl + tr) >> 1;
        if(t[v + v] > k) return get(v+v,tl,tm);
        return get(v+v+1,tm+1,tr);
    }
}
int temp[maxn],it[maxn],_j[maxn],ww[maxn];
vector<int> ii[maxn];
int vis[maxn],timer = 0,ff[maxn];
vector<pair<int,int>> bf,ch[maxn];
bool is_pr[maxn];
struct segtree{
    int n;
    vector<ll> c,t;
    void init(int _n){
        n = _n;
        c.assign(_n * 4,0);
        t.assign(_n * 4,0);
    }
    void acti(int pos,ll val,int v,int tl,int tr){
        if(tl == tr){
            c[v] = 1;
            t[v] = val;
        }else{
            int tm = (tl + tr) >> 1;
            if(pos <= tm) acti(pos,val,v+v,tl,tm);
            else acti(pos,val,v+v+1,tm+1,tr);
            c[v] = c[v + v] + c[v + v + 1];
            t[v] = t[v + v] + t[v + v + 1];
        }
    }
    ll getk(int k,int v,int tl,int tr){
        if(k <= 0) return 0;
        if(tl == tr) return t[v];
        int tm = (tl + tr) >> 1;
        if(c[v + v] >= k) return getk(k,v+v,tl,tm);
        return t[v + v] + getk(k - c[v + v],v + v + 1,tm + 1,tr);
    }
}tt[maxn];
void prec(int v,int pr = -1,int _w = 0) {
    vector<pair<int,int>> aa;
    ww[v] = _w;
    tt[v].init((int)g[v].size());
    for(auto [to,w]:g[v]) {
        aa.push_back({w,to});
        if(to == pr) continue;
        ch[v].push_back({to,w});
        dep[to] = dep[v] + 1;
        prec(to,v,w);
    }
    sort(aa.rbegin(),aa.rend());
    for(int j = 0;j < (int)aa.size();j++){
        temp[aa[j].second] = j;
    }
    for(int j = 0;j < (int)ch[v].size();j++){
        ii[v].push_back(temp[ch[v][j].first]);
    }
    if(pr != -1){
        _j[v] = temp[pr];
    }
    it[v] = (int)ch[v].size() - 1;
}
void dfs(int v,int pr = -1){
        vis[v] = timer;
        // cout << id[v] << "A\n";
        upd(id[v],0);
        bf.push_back({id[v],(int)g[v].size()});
        ll S = 0;
        vector<ll> can;
        for(auto [to,w]:g[v]) {
            if(to == pr) continue;
            if((int)g[to].size() > k) {
                dfs(to,v);
            }else {
                dp[to][0] = dp[to][1] = 0;
            }
            S += dp[to][0] + w;
            can.push_back(dp[to][1] - (dp[to][0] + w));
        }
        sort(can.begin(),can.end());
        dp[v][0] = dp[v][1] = S;
        for(int i = 0;i < (int)can.size() && can[i] < 0;i++){
            if(i < k){
                dp[v][0] += can[i];
            }
            if(i < k - 1)
            {
                dp[v][1] += can[i];
            }
        }
    // vis[v] = timer;
    // upd(id[v],0);
    // bf.push_back({id[v],(int)g[v].size()});
    // ll S = 0;
    // vector<ll> can;
    // if(pr == -1 && _j[v] != -1){
    //     S += ww[v];
    //     // tt[v].acti(_j[v],ww[v],1,0,tt[v].n-1);
    //     can.push_back(-ww[v]);
    // }
    // for(int i = 0;i < (int)ch[v].size();i++){
    //     int to = ch[v][i].first,w = ch[v][i].second;
    //     // cerr <<  to << "x\n";
    //     int sz = (int)g[ch[v][i].first].size();
    //     if(1 || sz > k){
    //         dfs(ch[v][i].first,v);
    //         S += w + dp[to][0];
    //         can.push_back(dp[to][1] - (dp[to][0] + w));
    //     }else{
    //         while(it[v] >= i){
    //             tt[v].acti(ii[v][it[v]],ch[v][it[v]].second,1,0,tt[v].n-1);
    //             it[v]--;
    //         }
    //         break;
    //     }
    // }
    // S += tt[v].t[1];
    // sort(can.begin(),can.end());
    // {
    //     dp[v][0] = dp[v][1] = S;
    //     for(int i = 0;i < (int)can.size() && can[i] < 0;i++){
    //         if(i < k){
    //             dp[v][0] += can[i];
    //         }
    //         if(i < k - 1)
    //         {
    //             dp[v][1] += can[i];
    //         }
    //     }
    // }
    // ll mx0 = tt[v].getk(k,1,0,tt[v].n-1),mx1 = tt[v].getk(k-1,1,0,tt[v].n-1);
    // ll pre = 0;
    // for(int i = 0;i <(int)can.size();i++){
    //     pre -= can[i];
    //     if(i + 1 <= k){
    //         mx0 = max(mx0,pre + tt[v].getk(k-i-1,1,0,tt[v].n-1));
    //     }
    //     if(i + 1 <= k - 1){
    //         mx1 = max(mx1,pre + tt[v].getk(k-i-2,1,0,tt[v].n-1));
    //     }
    // }
    // dp[v][0] = dp[v][1] = S;
    // dp[v][0] -= mx0;
    // dp[v][1] -= mx1;
}
vector<long long> minimum_closure_costs(int N,vector<int> U,vector<int> V,vector<int> W) {
    n = N;
    P.resize(n);
    for(int i = 0;i < N - 1;i++){
        g[U[i]].emplace_back(V[i],W[i]);
        g[V[i]].emplace_back(U[i],W[i]);
    }
    for(int i = 0;i < N;i++) {
        sort(g[i].begin(),g[i].end(),[&](pair<int,int> x,pair<int,int> y) {
            return ((int)g[x.first].size()) > (int)g[y.first].size();
        });
    }
    vector<ll> res;
    prec(0);
    memset(_j,-1,sizeof(_j));
    iota(P.begin(),P.end(),0);
    sort(P.begin(),P.end(),[&](int x,int y){
        return dep[x] < dep[y];
    });
    build();
    for(int i = 0;i < N;i++) {
        id[P[i]] = i;
    }
    for(int i = 0;i < N;i++) {
        ll ss = 0;
        ++timer;
        k = i;
        bf.clear();
        while(true){
            int v = get();
            if(v!=-1){
                dfs(v);
                ss += dp[v][0];
            }else break;
        }
        for(auto [x,y]:bf){
            upd(x,y);
        }
        res.push_back(ss);
        // cout << ss << "x\n";
    }
    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...