Submission #809125

#TimeUsernameProblemLanguageResultExecution timeMemory
809125idiotcomputerValley (BOI19_valley)C++11
100 / 100
177 ms53596 KiB
#include <bits/stdc++.h> using namespace std; const int mxN = 1e5; const long long int mxV = 1e15; bool shop[mxN]; int depth[mxN]; int nidx[mxN]; int ssize[mxN]; long long int dp[mxN][18]; int dpidx[mxN][18]; long long int dis[mxN][18]; void setup(int node, int parent, int cnt, int d, vector<vector<pair<int,int>>> &connect){ nidx[node] = cnt; ssize[node] = 1; depth[node] = d; pair<int,int> next; long long int mini = mxV; for (int i =0; i < connect[node].size(); i++){ next = connect[node][i]; if (next.first == parent){ continue; } setup(next.first,node,cnt+ssize[node],d+1, connect); ssize[node] += ssize[next.first]; mini = min(mini, dp[next.first][0] + next.second); } if (shop[node]){ mini = 0; } dis[node][0] = 0; dpidx[node][0] = node; dp[node][0] = mini; } void gdp(int node, int parent, int last, vector<vector<pair<int,int>>> &connect){ if (parent != -1){ dis[node][1] = last; dpidx[node][1] = parent; dp[node][1] = min(dp[node][0], dp[parent][0] + last); } for (int i = 2; i < 18; i++){ if (dpidx[node][i-1] == -1){ break; } dp[node][i] = min(dp[node][i-1], dp[dpidx[node][i-1]][i-1] + dis[node][i-1]); dpidx[node][i] = dpidx[dpidx[node][i-1]][i-1]; dis[node][i] = dis[node][i-1] + dis[dpidx[node][i-1]][i-1]; } pair<int,int> next; for (int i =0; i < connect[node].size(); i++){ next = connect[node][i]; if (next.first == parent){ continue; } gdp(next.first,node,next.second,connect); } return; } long long int query(int a, int b){ if (a == b){ return dp[a][0]; } // cout << a << " " << b << " lel "; /* for (int i = 0; i < 1e8; i++){ continue; }*/ for (int i = 0; i < 18; i++){ if ((dpidx[a][i] == -1) || (depth[dpidx[a][i]] < depth[b])){ // cout << i << '\n'; return min(dp[a][i-1], query(dpidx[a][i-1],b) + dis[a][i-1]); } } cout << "UHOH STINKY\n"; return -1; } int main() { for (int i = 0; i < mxN; i++){ for (int j =0; j < 18; j++){ dp[i][j] = mxV; dpidx[i][j] = -1; dis[i][j] = mxV; } } memset(shop,0,sizeof(shop)); ios_base::sync_with_stdio(false); cin.tie(NULL); int n,s,q,e; cin >> n >> s >> q >> e; e-=1; vector<vector<pair<int,int>>> connect(n); vector<pair<pair<int,int>,int>> edges(n-1); pair<int,int> temp; for (int i = 0; i < n-1; i++){ cin >> edges[i].first.first >> edges[i].first.second >> edges[i].second; edges[i].first.first -= 1; edges[i].first.second -= 1; temp.first = edges[i].first.second; temp.second = edges[i].second; connect[edges[i].first.first].push_back(temp); temp.first = edges[i].first.first; connect[edges[i].first.second].push_back(temp); } int a; for (int i = 0; i < s; i++){ cin >> a; a -= 1; shop[a] = true; } setup(e,-1,0,0,connect); gdp(e,-1,0,connect); int I,R; int cidx; for (int i =0; i < 4*1e8; i++){ continue; } /* for (int i =0; i < n; i++){ cout << i << ": "; for (int j = 0; j < 18; j++){ cout << dp[i][j] << " "; } cout<< '\n'; } cout << '\n'; for (int i =0; i < n; i++){ cout << i << ": "; for (int j = 0; j < 18; j++){ cout << dpidx[i][j] << " "; } cout<< '\n'; } cout << '\n'; for (int i =0; i < n; i++){ cout << i << ": "; for (int j = 0; j < 18; j++){ cout << dis[i][j] << " "; } cout<< '\n'; } cout << '\n';*/ for (int i =0; i < q; i++){ cin >> I >> R; I -= 1; R -= 1; if (depth[edges[I].first.first] > depth[edges[I].first.second]){ cidx = edges[I].first.first; } else { cidx = edges[I].first.second; } // cout << nidx[cidx] << " " << ssize[cidx] << " " << nidx[R] << '\n'; if ((nidx[cidx] > nidx[R]) || (nidx[cidx] + ssize[cidx] <= nidx[R])){ cout << "escaped\n"; continue; } long long int res = query(R,cidx); if (res == mxV){ cout << "oo\n"; } else { cout << res << "\n"; } } return 0; }

Compilation message (stderr)

valley.cpp: In function 'void setup(int, int, int, int, std::vector<std::vector<std::pair<int, int> > >&)':
valley.cpp:20:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   20 |     for (int i =0; i < connect[node].size(); i++){
      |                    ~~^~~~~~~~~~~~~~~~~~~~~~
valley.cpp: In function 'void gdp(int, int, int, std::vector<std::vector<std::pair<int, int> > >&)':
valley.cpp:55:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |     for (int i =0; i < connect[node].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...