제출 #411620

#제출 시각아이디문제언어결과실행 시간메모리
411620A_D경주 (Race) (IOI11_race)C++14
31 / 100
1324 ms209212 KiB
#include "race.h"
#include <bits/stdc++.h>
#define LL long long
#define ii pair<LL,LL>
#define F first
#define S second
using namespace std;
const int INF=1e18;
const LL NN=2e5+100;
vector<ii> g[NN];
LL dp[NN][111];
LL n,k;
LL ans=INF;
multiset<LL> st;
void dfs(LL u,LL p)
{
    dp[u][0]=0;
    for(auto x:g[u]){
        if(x.F==p)continue;
        dfs(x.F,u);
    }
    for(auto x:g[u]){
        if(x.F==p)continue;
        for(LL i=0;i<=k;i++){
            if(i-x.S>=0)dp[u][i]=min(dp[x.F][i-x.S]+1,dp[u][i]);
        }
    }
    if((g[u].size()==2&&u!=p)||g[u].size()==1)return;
    for(LL i=0;i<=k;i++){
        st.clear();
        st.insert(INF);
        for(auto x:g[u]){
            if(x.F==p)continue;
            if(i-x.S>=0){
                st.insert(dp[x.F][i-x.S]);
                while(st.size()>2){
                    st.erase(st.find(*st.rbegin()));
                }
            }
        }
        for(auto x:g[u]){
            if(x.F==p)continue;
            if(i-x.S>=0&&st.find(dp[x.F][i-x.S])!=st.end())st.erase(st.find(dp[x.F][i-x.S]));
            LL j=(k-i)-x.S;
            if(j>=0){
                LL ret=*st.begin();
                ret+=dp[x.F][j];
                ans=min(ans,ret+2);
            }
            if(i-x.S>=0){
                st.insert(dp[x.F][i-x.S]);
                while(st.size()>2){
                    st.erase(st.find(*st.rbegin()));
                }
            }
        }
    }
}
int best_path(int N, int K, int H[][2], int L[])
{
    ans=INF;
    n=N;
    k=K;
    for(LL i=0;i<n;i++){
        for(LL j=0;j<=k;j++){
            dp[i][j]=INF;
        }
    }
    for(LL i=0;i<n-1;i++){
        LL u=H[i][0];
        LL v=H[i][1];
        LL w=L[i];
        g[u].push_back({v,w});
        g[v].push_back({u,w});
    }
    dfs(0,0);
    for(LL i=0;i<n;i++){
        ans=min(ans,dp[i][k]);
    }
    if(ans==INF)ans=-1;
    int ann=ans;
    return ann;
}

컴파일 시 표준 에러 (stderr) 메시지

race.cpp:8:15: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
    8 | const int INF=1e18;
      |               ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...