Submission #296601

#TimeUsernameProblemLanguageResultExecution timeMemory
296601williamMBDKDreaming (IOI13_dreaming)C++14
18 / 100
151 ms21996 KiB
#include<bits/stdc++.h> #include "dreaming.h" #define int long long using namespace std; int N, M; vector<vector<pair<int,int>>> adj (1e5), distances (1e5); vector<int> mxdist (1e5), mxinnerdist(1e5); vector<vector<int>> getcomps(){ vector<bool> v (N); vector<vector<int>> res; for(int i = 0; i < N; i++){ if(!v[i]){ queue<int> q; q.push(i); res.push_back({}); while(!q.empty()){ int curr = q.front(); q.pop(); if(v[curr]) continue; v[curr] = 1; res[res.size() - 1].push_back(curr); for(auto e : adj[curr]) q.push(e.first); } } } return res; } int dfs1(int node, int p){ for(int i = 0; i < adj[node].size(); i++){ if(adj[node][i].first == p) continue; distances[node][i].first = dfs1(adj[node][i].first, node) + adj[node][i].second; distances[node][i].second = i; } sort(distances[node].rbegin(), distances[node].rend()); if(distances[node].size() < 2) return 0; // right? return distances[node][0].first; } void dfs2(int node, int p, int mxp){ if(p == -1){ if(adj[node].size() > 0) mxdist[node] = distances[node][0].first; else mxdist[node] = 0; if(adj[node].size() >= 2){ mxinnerdist[node] = distances[node][0].first + distances[node][1].first; }else if(adj[node].size() == 1){ mxinnerdist[node] = distances[node][0].first; } }else if(adj[node].size() == 1){ mxdist[node] = mxp; mxinnerdist[node] = mxp; }else{ mxdist[node] = max(mxp, distances[node][0].first); // right? mxinnerdist[node] = mxp + distances[node][0].first; if(adj[node].size() > 2){ mxinnerdist[node] = max(mxinnerdist[node], distances[node][0].first + distances[node][1].first); } } // cout << mxdist[node] << " " << node << endl; for(int i = 0; i < adj[node].size(); i++){ if(adj[node][i].first == p) continue; int t = mxp; if(distances[node][0].second == i){ if(distances[node].size() >= 3) t = max(t, distances[node][1].first); }else{ t = max(t, distances[node][0].first); //right? } t += adj[node][i].second; dfs2(adj[node][i].first, node, t); } } signed travelTime(signed _N, signed _M, signed L, signed A[], signed B[], signed T[]) { N = _N; M = _M; for(int i = 0; i < M; i++){ adj[A[i]].push_back({B[i],T[i]}); adj[B[i]].push_back({A[i],T[i]}); distances[A[i]].push_back({-1,-1}); distances[B[i]].push_back({-1,-1}); } vector<vector<int>> components = getcomps(); int C = components.size(); vector<int> compdists (C, INT_MAX); int res = 0; for(int i = 0; i < C; i++){ // cout << "root" << components[i][0] << endl; dfs1(components[i][0], -1); dfs2(components[i][0], -1, 0); for(int j = 0; j < components[i].size(); j++){ compdists[i] = min(compdists[i], mxdist[components[i][j]]); res = max(res, mxinnerdist[components[i][j]]); } } sort(compdists.rbegin(), compdists.rend()); if(C == 1){ return res; }else if(C == 2){ return max(L + compdists[0] + compdists[1], res); }else{ return max(res, max(L + compdists[0] + compdists[1], 2 * L + compdists[1] + compdists[2])); } }

Compilation message (stderr)

dreaming.cpp: In function 'long long int dfs1(long long int, long long int)':
dreaming.cpp:28:19: 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]
   28 |  for(int i = 0; i < adj[node].size(); i++){
      |                 ~~^~~~~~~~~~~~~~~~~~
dreaming.cpp: In function 'void dfs2(long long int, long long int, long long int)':
dreaming.cpp:57:19: 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]
   57 |  for(int i = 0; i < adj[node].size(); i++){
      |                 ~~^~~~~~~~~~~~~~~~~~
dreaming.cpp: In function 'int travelTime(int, int, int, int*, int*, int*)':
dreaming.cpp:86:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |   for(int j = 0; j < components[i].size(); j++){
      |                  ~~^~~~~~~~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...