답안 #641425

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
641425 2022-09-16T17:13:35 Z DragonO_o Paths (RMI21_paths) C++17
36 / 100
600 ms 14132 KB
#pragma GCC optimize("Ofast")
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#pragma GCC optimize("inline,Ofast,no-stack-protector,unroll-loops,fast-math,O3")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,popcnt,avx,abm")

#include <bits/stdc++.h>

using namespace std;

//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//using namespace __gnu_pbds;
//#define ordered_set tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update>

#define sz(x) (int)(x).size()
#define int long long
#define FOR(i,l,r) for(int i=l;i<=(r);++i)
#define FORd(i,r,l) for(int i=r;i>=(l);--i)
#define pb push_back
#define x first
#define y second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(),x.end()
#define ins insert

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int,int>pii;
typedef pair<ll,ll>pll;
typedef vector<ll>vll;
typedef vector<int>vi;
typedef vector<bool>vb;
typedef vector<vi>vvi;
typedef vector<vll>vvll;
typedef vector<pii>vpii;
typedef vector<pll>vpll;

const int N=1e5+5;
const int MOD=1e9+7;
const int INF=1e18;
const char nl='\n';

int n,k;
vpii g[N];
int dist[N];
int down[N];
int up[N];

void pre_calc1(int v,int p){
    for(auto [to,w]:g[v]){
        if(to!=p){
            dist[to]=dist[v]+w;
            pre_calc1(to,v);
        }
    }
    down[v]=v;
    for(auto [to,w]:g[v]){
        if(to!=p){
            if(dist[down[to]]>=dist[down[v]]){
                down[v]=down[to];
            }
        }
    }
}

void pre_calc2(int v,int p){
    set<pii,greater<pii>>st;
    for(auto [to,w]:g[v]){
        if(to!=p){
            st.insert({dist[down[to]]-dist[v],down[to]});
        }
    }
    for(auto [to,w]:g[v]){
        if(to!=p){
            up[to]=up[v];
            st.erase({dist[down[to]]-dist[v],down[to]});
            pii best=*st.begin();
            if(!st.empty() && w+best.x>dist[to]+dist[up[to]]){
                up[to]=best.y;
            }
            st.insert({dist[down[to]]-dist[v],down[to]});
        }
    }
    for(auto [to,w]:g[v]){
        if(to!=p){
            pre_calc2(to,v);
        }
    }
}

int a[N];
int val[N];
multiset<int,greater<int>>take,rest;

void dfs(int v,int p){
    if(!a[down[v]]){
        a[down[v]]=p;
        val[down[v]]=dist[down[v]]-dist[p];
        rest.insert(val[down[v]]);
    }
    for(auto [to,w]:g[v]){
        if(to!=p){
            dfs(to,v);
        }
    }
}

void solve(){
    cin>>n>>k;
    for(int i=1;i<n;++i){
        int u,v,w;
        cin>>u>>v>>w;
        g[u].pb({v,w});
        g[v].pb({u,w});
    }
    for(int root=1;root<=n;++root){
        for(int i=1;i<=n;++i){
            dist[i]=down[i]=up[i]=a[i]=val[i]=0;
        }
        take.clear();
        rest.clear();
        pre_calc1(root,root);
        up[root]=root;
        pre_calc2(root,root);
        dfs(root,root);
        int cnt=0;
        while(cnt++<k){
            int beg=*rest.begin();
            take.insert(beg);
            rest.erase(rest.find(beg));
        }
        int ans=0;
        for(int it:take){
            ans+=it;
        }
        cout<<ans<<nl;
    }
}

/**
11 3
1 2 5
2 3 3
2 6 5
3 4 4
3 5 2
1 7 6
7 8 4
7 9 5
1 10 1
10 11 1
**/

int32_t main(){
    ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);

    int t=1;
//    cin>>t;
    while(t--){
        solve();
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2696 KB Output is correct
2 Correct 2 ms 2644 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2696 KB Output is correct
2 Correct 2 ms 2644 KB Output is correct
3 Correct 10 ms 2644 KB Output is correct
4 Correct 9 ms 2748 KB Output is correct
5 Correct 11 ms 2644 KB Output is correct
6 Correct 7 ms 2644 KB Output is correct
7 Correct 10 ms 2644 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2696 KB Output is correct
2 Correct 2 ms 2644 KB Output is correct
3 Correct 10 ms 2644 KB Output is correct
4 Correct 9 ms 2748 KB Output is correct
5 Correct 11 ms 2644 KB Output is correct
6 Correct 7 ms 2644 KB Output is correct
7 Correct 10 ms 2644 KB Output is correct
8 Correct 267 ms 3052 KB Output is correct
9 Correct 199 ms 2988 KB Output is correct
10 Correct 144 ms 2848 KB Output is correct
11 Correct 391 ms 2944 KB Output is correct
12 Correct 179 ms 2820 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2696 KB Output is correct
2 Correct 2 ms 2644 KB Output is correct
3 Correct 10 ms 2644 KB Output is correct
4 Correct 9 ms 2748 KB Output is correct
5 Correct 11 ms 2644 KB Output is correct
6 Correct 7 ms 2644 KB Output is correct
7 Correct 10 ms 2644 KB Output is correct
8 Correct 267 ms 3052 KB Output is correct
9 Correct 199 ms 2988 KB Output is correct
10 Correct 144 ms 2848 KB Output is correct
11 Correct 391 ms 2944 KB Output is correct
12 Correct 179 ms 2820 KB Output is correct
13 Execution timed out 1085 ms 2932 KB Time limit exceeded
14 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1090 ms 14132 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2696 KB Output is correct
2 Correct 2 ms 2644 KB Output is correct
3 Correct 10 ms 2644 KB Output is correct
4 Correct 9 ms 2748 KB Output is correct
5 Correct 11 ms 2644 KB Output is correct
6 Correct 7 ms 2644 KB Output is correct
7 Correct 10 ms 2644 KB Output is correct
8 Correct 267 ms 3052 KB Output is correct
9 Correct 199 ms 2988 KB Output is correct
10 Correct 144 ms 2848 KB Output is correct
11 Correct 391 ms 2944 KB Output is correct
12 Correct 179 ms 2820 KB Output is correct
13 Execution timed out 1085 ms 2932 KB Time limit exceeded
14 Halted 0 ms 0 KB -