Submission #1157123

#TimeUsernameProblemLanguageResultExecution timeMemory
1157123t9unkubjRoad Closures (APIO21_roads)C++20
100 / 100
240 ms63724 KiB

#ifdef t9unkubj

#define _GLIBCXX_DEBUG
#include"debug.cpp"
//#include"template_no_debug.h"
#else 
#include "roads.h"
#define dbg(...) 199958
#endif

#pragma GCC optimize("O3")
using namespace std;
#include<bits/stdc++.h>
using ll=long long;
using ull=unsigned long long;
template<class T>using vc=vector<T>;
template<class T>using vvc=vc<vc<T>>;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define REP(i,j,n) for(ll i=(j);i<(ll)(n);i++)
#define DREP(i,n,m) for(ll i=(n);i>=(m);i--)
#define drep(i,n) for(ll i=((n)-1);i>=0;i--)
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
template<class T,class F>
bool chmin(T &x, F y){
    if(x>y){
        x=y;
        return true;
    }
    return false;
}
template<class T, class F>
bool chmax(T &x, F y){
    if(x<y){
        x=y;
        return true;
    }
    return false;
}
double pass_time=0;
struct topk{
    multiset<ll>s1,s2;
    int K;
    ll sm;
    topk():K(0),sm(0){}
    void modify(){
        while(s1.size()&&s2.size()&&*s1.rbegin()>*s2.begin()){
            int v1=*s1.rbegin();
            int v2=*s2.begin();
            sm-=v1;
            sm+=v2;
            s1.erase(s1.find(v1)),s2.erase(s2.find(v2));
            s1.insert(v2),s2.insert(v1);
        }
        while((int)s1.size()<K&&(int)s2.size()){
            sm+=*s2.begin();
            s1.insert(*s2.begin());s2.erase(s2.find(*s2.begin()));
        }
        while((int)s1.size()>max(0,K)){
            sm-=*s1.rbegin();
            s2.insert(*s1.rbegin());s1.erase(s1.find(*s1.rbegin()));
        }
    }
    void insert(int x){
        s2.insert(x);
        modify();
    }
    void erase(int x){
        if(s1.find(x)!=s1.end()){
            sm-=x;
            s1.erase(s1.find(x));
        }else{
            if(s2.find(x)!=s2.end()){
                s2.erase(s2.find(x));
            }else assert(0);
        }
        modify();
    }
    void shot(int x){
        K=x;
        modify();
    }
    ll val(){
        if((int)s1.size()>=K)return sm;
        return 2e18;
    }
};
vc<ll>solve(int n,vc<int>u,vc<int>v,vc<int>w){
    ll inf=2e18;
    vc<ll>dp0(n,inf);
    vc<ll>dp1(n,inf);
    vvc<pair<ll,ll>>G(n);
    rep(i,n-1){
        G[u[i]].push_back({v[i],w[i]});
        G[v[i]].push_back({u[i],w[i]}); 
    }

    vvc<int>able(n);
    rep(i,n){
        able[G[i].size()].push_back(i);
    }
    vvc<pair<ll,ll>>g(n);
    vc<topk>topk(n);
    vc<ll>miru;
    vc<int>mita(n);
    rep(i,n){
        for(auto&[to,W]:G[i])topk[i].insert(W),dbg(i,W);
    }
    vc<ll>ans(n);
    drep(i,n){
        for(auto&x:able[i]){
            miru.push_back(x);
            for(auto&[to,W]:G[x]){
                if(pair<int,int>{G[x].size(),x}<pair<int,int>{G[to].size(),to}){
                    g[x].push_back({to,W});
                    g[to].push_back({x,W});
                    topk[x].erase(W);
                    topk[to].erase(W);
                }
            }
        }
        for(auto&x:miru){
            if(mita[x])continue;
            
            auto dfs=[&](auto&dfs,int u,ll from)->void{
                mita[u]=1;
                __int128 offset=0;
                vc<ll>diff;
                for(auto&[to,W]:g[u]){
                    if(mita[to])continue;
                    dfs(dfs,to,W);
                    offset+=dp0[to];
                    diff.push_back({dp1[to]-dp0[to]});
                }
                sort(all(diff));
                {
                __int128 now=0;
                topk[u].shot((int)G[u].size()-i);
                for(int j=0;;j++){
                    chmin(dp0[u],now+offset+topk[u].val());
                    if(j==diff.size())break;
                    topk[u].shot((int)G[u].size()-i-j-1);
                
                    now+=diff[j];
                }
                }

                if(from>=0)
                {
                __int128 now=0;
                topk[u].shot((int)G[u].size()-i-1);
                for(int j=0;;j++){
                    chmin(dp1[u],now+offset+topk[u].val());
                    if(j==diff.size())break;
                    topk[u].shot((int)G[u].size()-i-j-2);
                    now+=diff[j];
                }
                }
                if(from!=-1)dp1[u]+=from;
            };
            dfs(dfs,x,-1);
            ans[i]+=dp0[x];
        }
        for(auto&x:miru){
            dp0[x]=dp1[x]=inf;
            mita[x]=0;
        }   
    }
    return ans;
}
std::vector<long long> minimum_closure_costs(int N, std::vector<int> U,
                                             std::vector<int> V,
                                             std::vector<int> W) {
  return solve(N,U,V,W);
}
void run(){
    #ifdef t9unkubj
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    #endif
    int n;
    cin>>n;
    vc<int>u(n-1),v(n-1),w(n-1);
    rep(i,n-1)cin>>u[i]>>v[i]>>w[i];
    auto ans=minimum_closure_costs(n,u,v,w);
    dbg(ans);
}
//int main(){run();}
#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...