제출 #1082141

#제출 시각아이디문제언어결과실행 시간메모리
1082141CELD_07Race (IOI11_race)C++17
100 / 100
238 ms41184 KiB
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#define ll long long
#define endl "\n"
#define inf LLONG_MAX
#define vll vector<ll>
#define sd second
#define ft first
#define al(x) x.begin(),x.end()
#define alr(x) x.rbegin(),x.rend()
#define pll pair<ll, ll>
#define mod 1000000007
#define _set tree<pll, null_type, less<pll>, rb_tree_tag, tree_order_statistics_node_update>
using namespace std;
using namespace __gnu_pbds;
vector<vector<pair<ll, ll>>> adj;
vector<ll> v;
vector<bool>visited;
inline ll dfs(ll n, ll p){
v[n]=1;
for(auto& [y, w]: adj[n]){
    if(y==p || visited[y]==1)continue;
    v[n]+=dfs(y, n);
}
return v[n];
}
inline ll _find(ll n, ll n1, ll p){
for(auto& [y, w]: adj[n]){
    if(y==p)continue;
    if(v[y]>n1/2 && !visited[y])return _find(y, n1, n);
}
return n;
}
map<ll, ll> m;
vector<ll> v3;
vector<pair<ll, ll>> v2;
ll cnt=0, lim, cnt1=0, cnt3=0, res=LLONG_MAX;
inline void dfs1(ll n, ll p){
   // cout<<n<<" "<<cnt3<<" "<<cnt<<endl;
    if(cnt<=lim)v2.push_back({cnt, cnt3});
    if(cnt<=lim && v3[lim-cnt]!=LLONG_MAX)res=min(res, cnt3+v3[lim-cnt]);
for(auto& [y, w]: adj[n]){
    if(y==p || visited[y])continue;
    cnt+=w;
    cnt3++;
    dfs1(y, n);
    cnt-=w;
    cnt3--;
}
}
ll cnt2=0;
inline void centroid(ll n){
dfs(n, n);
ll o=_find(n, v[n], n);
visited[o]=1;
v2.clear();
ll i=0;
//cout<<o<<endl;
for(auto& [y, w]: adj[o]){
    if(visited[y])continue;
    cnt3++;
    cnt+=w;
    dfs1(y, o);
    cnt3--;
    cnt-=w;
    for(; i<v2.size(); i++){v3[v2[i].ft]=min(v3[v2[i].ft], v2[i].sd);if(v2[i].ft==lim)res=min(res, v2[i].sd);}
}
for(auto& [y1, w]: v2)v3[y1]=LLONG_MAX;
for(auto& [y, w]: adj[o]){
    if(visited[y])continue;
    centroid(y);
}
}
int best_path(int N, int K, int H[][2], int L[]){
    ll a, b, c, d, e, f;
    a=N;
    b=K;
    lim=b;
    adj.clear();
    v.clear();
    v3.clear();
    visited.clear();
    adj.resize(a+1);
    v.resize(a+1);
    v3.assign(lim+1, LLONG_MAX);
    visited.assign(a+1, 0);
    for(int i=0; i<a-1; i++){
        c=H[i][1];
        d=H[i][0];
        e=L[i];
        adj[c].push_back({d, e});
        adj[d].push_back({c, e});
    }
    centroid(1);
    return (res==LLONG_MAX?-1:res);
}

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

race.cpp: In function 'void centroid(long long int)':
race.cpp:66:12: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |     for(; i<v2.size(); i++){v3[v2[i].ft]=min(v3[v2[i].ft], v2[i].sd);if(v2[i].ft==lim)res=min(res, v2[i].sd);}
      |           ~^~~~~~~~~~
race.cpp: In function 'int best_path(int, int, int (*)[2], int*)':
race.cpp:75:23: warning: unused variable 'f' [-Wunused-variable]
   75 |     ll a, b, c, d, e, f;
      |                       ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...