제출 #594059

#제출 시각아이디문제언어결과실행 시간메모리
594059HanksburgerValley (BOI19_valley)C++17
100 / 100
190 ms40524 KiB
#include <bits/stdc++.h> using namespace std; int par[100005][17], dep[100005], l[100005], r[100005]; vector<pair<int, long long> > adj[100005]; long long dp[100005][17], dis[100005]; pair<int, int> edge[100005]; bool shop[100005]; vector<int> vec; void dfs(int u, int p) { vec.push_back(u); if (shop[u]) dp[u][0]=dis[u]; else dp[u][0]=2e18; par[u][0]=p; for (int i=0; i<adj[u].size(); i++) { int v=adj[u][i].first; long long w=adj[u][i].second; if (v!=p) { dis[v]=dis[u]+w; dep[v]=dep[u]+1; dfs(v, u); dp[u][0]=min(dp[u][0], dp[v][0]); } } vec.push_back(u); } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, s, q, e; cin >> n >> s >> q >> e; for (int i=1; i<n; i++) { int u, v; long long w; cin >> u >> v >> w; edge[i]={u, v}; adj[u].push_back({v, w}); adj[v].push_back({u, w}); } for (int i=1; i<=s; i++) { int u; cin >> u; shop[u]=1; } dfs(e, e); for (int i=1; i<=n; i++) dp[i][0]-=dis[i]*2; for (int i=1; i<=16; i++) { for (int j=1; j<=n; j++) { dp[j][i]=min(dp[j][i-1], dp[par[j][i-1]][i-1]); par[j][i]=par[par[j][i-1]][i-1]; } } for (int i=0; i<n*2; i++) if (!l[vec[i]]) l[vec[i]]=i+1; for (int i=n*2-1; i>=0; i--) if (!r[vec[i]]) r[vec[i]]=i+1; for (int i=1; i<=q; i++) { int x, y; cin >> x >> y; if (dep[edge[x].first]>dep[edge[x].second]) x=edge[x].first; else x=edge[x].second; if (l[x]<=l[y] && r[y]<=r[x]) { int d=dep[y]-dep[x]+1, cur=y; long long mn=2e18; for (int i=0; i<=16; i++) { if (d&(1<<i)) { mn=min(mn, dp[cur][i]); cur=par[cur][i]; } } if (mn<1e18) cout << mn+dis[y] << '\n'; else cout << "oo\n"; } else cout << "escaped\n"; } return 0; }

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

valley.cpp: In function 'void dfs(int, int)':
valley.cpp:17:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 |     for (int i=0; i<adj[u].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...