Submission #138354

#TimeUsernameProblemLanguageResultExecution timeMemory
138354MrBrionixRace (IOI11_race)C++14
100 / 100
728 ms106356 KiB
#include "race.h" #include <stdio.h> #include <stdlib.h> #include<bits/stdc++.h> using namespace std; #define MAX_N 500000 vector<int> grafo[200005],peso[200005]; long long k,n,siz[200005],ans; long long lazy[200005],lazyval[200005]; map<long long,long long> sol[200005]; /*4 3 0 1 1 1 2 2 1 3 4 ----- 11 19 0 1 3 0 2 4 2 3 5 3 4 4 4 5 6 0 6 3 6 7 2 6 8 5 8 9 6 8 10 7 */ void dfs(int nodo,int last){ //cout<<nodo<<" arrivo da "<<last<<endl; siz[nodo]=1; int best=0,num; long long val=0; for(int i=0;i<grafo[nodo].size();i++){ if(grafo[nodo][i]!=last){ //cout<<"chiamo "<<grafo[nodo][i]<<" "<<nodo<<" "<<last<<endl; dfs(grafo[nodo][i],nodo); siz[nodo]+=siz[grafo[nodo][i]]; if(siz[grafo[nodo][i]]>best){ swap(sol[nodo],sol[grafo[nodo][i]]); lazy[nodo]--; lazy[grafo[nodo][i]]++; swap(lazy[nodo],lazy[grafo[nodo][i]]); lazyval[nodo]-=peso[nodo][i]; lazyval[grafo[nodo][i]]+=peso[nodo][i]; swap(lazyval[nodo],lazyval[grafo[nodo][i]]); best=siz[grafo[nodo][i]]; } } } sol[nodo][0-lazyval[nodo]]=0-lazy[nodo]; for(int i=0;i<grafo[nodo].size();i++){ if(grafo[nodo][i]!=last){ for(auto j : sol[grafo[nodo][i]]){ num=j.second+lazy[grafo[nodo][i]]+1; val=j.first+lazyval[grafo[nodo][i]]+peso[nodo][i]; if(sol[nodo].find(k-val-lazyval[nodo])!=sol[nodo].end()) ans=min(ans,num+sol[nodo][k-val-lazyval[nodo]]+lazy[nodo]); } for(auto j : sol[grafo[nodo][i]]){ num=j.second+lazy[grafo[nodo][i]]+1; val=j.first+lazyval[grafo[nodo][i]]+peso[nodo][i]; //cout<<"dal figlio "<<grafo[nodo][i]<<" prendo "<<j.second+lazy[grafo[nodo][i]]<<"e "<<j.first+lazyval[grafo[nodo][i]]<<endl; if(sol[nodo].find(val-lazyval[nodo])!=sol[nodo].end()) sol[nodo][val-lazyval[nodo]]=min(sol[nodo][val-lazyval[nodo]],num-lazy[nodo]); else sol[nodo][val-lazyval[nodo]]=num-lazy[nodo]; } } } if(sol[nodo].find(k-lazyval[nodo])!=sol[nodo].end())ans=min(ans,sol[nodo][k-lazyval[nodo]]+lazy[nodo]); /*cout<<"info nodo "<<nodo<<":"<<endl; for(auto i : sol[nodo]){ cout<<i.first+lazyval[nodo]<<" "<<i.second+lazy[nodo]<<endl; } cout<<"fine -----------"<<endl;*/ } int best_path(int N, int K, int H[][2], int L[]){ n=N; k=K; ans=10000000ll; for(int i=0;i<n-1;i++){ grafo[H[i][0]].push_back(H[i][1]); grafo[H[i][1]].push_back(H[i][0]); peso[H[i][0]].push_back(L[i]); peso[H[i][1]].push_back(L[i]); } dfs(0,-1); if(ans==10000000ll)return -1; return ans; } /* static int N, K; static int H[MAX_N][2]; static int L[MAX_N]; static int solution; inline void my_assert(int e) {if (!e) abort();} void read_input() { int i; my_assert(2==scanf("%d %d",&N,&K)); for(i=0; i<N-1; i++) my_assert(3==scanf("%d %d %d",&H[i][0],&H[i][1],&L[i])); //my_assert(1==scanf("%d",&solution)); } int main() { int ans; read_input(); ans = best_path(N,K,H,L); cout<<ans<<endl; if(ans==solution) printf("Correct.\n"); else printf("Incorrect. Returned %d, Expected %d.\n",ans,solution); return 0; }*/

Compilation message (stderr)

race.cpp: In function 'void dfs(int, int)':
race.cpp:41:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<grafo[nodo].size();i++){
                 ~^~~~~~~~~~~~~~~~~~~
race.cpp:65:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<grafo[nodo].size();i++){
                 ~^~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...