Submission #839572

#TimeUsernameProblemLanguageResultExecution timeMemory
839572model_codeTruck Driver (IOI23_deliveries)C++17
22 / 100
251 ms18908 KiB
// correct/solution-subtask3.cpp #include "deliveries.h" #include <iostream> #include <vector> #define MAXN 101000 using namespace std; long long N, centroid, allSumW, allSumTxW, flippedWT; vector<int> edge[MAXN]; long long W[MAXN]; long long sumW[MAXN]; long long T[MAXN]; long long sumT[MAXN]; long long parent[MAXN]; void dfs(int x){ sumW[x] = W[x]; for(int i : edge[x]){ sumT[i] = sumT[x] + T[i]; dfs(i); sumW[x] += sumW[i]; } } int findCentroid(int x){ for(int i:edge[x]){ if(sumW[i] >= (allSumW + 1) / 2){ flippedWT += T[i] * sumW[i]; return findCentroid(i); } } return x; } void init(int NN, std::vector<int> /*UU*/, std::vector<int> /*VV*/, std::vector<int> TT, std::vector<int> WW){ N = NN; parent[0] = -1; for(int i=0; i<N-1; i++){ edge[i/2].push_back(i+1); T[i+1] = TT[i]; parent[i+1] = i/2; } for(int i=0; i<N; i++){ W[i] = WW[i]; } W[0]++; dfs(0); for(int i=0; i<N; i++){ allSumTxW += W[i] * sumT[i]; allSumW += W[i]; } } long long max_time(int S, int X){ if(S==0) X++; long long diff = X - W[S]; allSumTxW += diff * sumT[S]; allSumW -= W[S]; W[S] = X; allSumW += W[S]; while(S!=-1){ sumW[S] += diff; S = parent[S]; } flippedWT = 0; int cent = findCentroid(0); return 2 * (allSumTxW + allSumW * sumT[cent] - 2 * flippedWT); }
#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...