제출 #1178109

#제출 시각아이디문제언어결과실행 시간메모리
1178109InvMOD구슬과 끈 (APIO14_beads)C++20
100 / 100
139 ms41400 KiB
#include <bits/stdc++.h> using namespace std; #define sz(v) (int)(v).size() #define all(v) (v).begin(), (v).end() void solve() { int n; cin >> n; vector<vector<pair<int,int>>> adj(n + 1); for(int i = 0; i < n - 1; i++){ int u,v,c; cin >> u >> v >> c; adj[u].emplace_back(v, c); adj[v].emplace_back(u, c); } vector<vector<int>> dp(n + 1, vector<int>(2, 0)), sdp(n + 1, vector<int>()); const int inf = 2e9; function<void(int,int)> calc_dp = [&](int x, int p) -> void{ for(int i = 0; i < 2; i++) sdp[x].push_back(-inf); for(auto [v, w] : adj[x])if(v != p){ calc_dp(v, x); dp[x][0] = dp[x][0] + max(dp[v][1] + w, dp[v][0]); sdp[x].push_back(-max(dp[v][1] + w, dp[v][0]) + (dp[v][0] + w)); } sort(all(sdp[x]), greater<int>()); dp[x][1] = dp[x][0] + sdp[x][0]; }; calc_dp(1, -1); int answer = 0; function<void(int,int)> reroot = [&](int x, int p) -> void{ answer = max(answer, dp[x][0]); for(auto [v, w] : adj[x])if(v != p){ int ndp0 = dp[x][0] - max(dp[v][1] + w, dp[v][0]); int ndp1 = ndp0; int sdpv = -max(dp[v][1] + w, dp[v][0]) + (dp[v][0] + w); if(sdp[x][0] != sdpv){ ndp1 = ndp0 + sdp[x][0]; } else ndp1 = ndp0 + sdp[x][1]; dp[v][0] = dp[v][0] + max(ndp1 + w, ndp0); sdp[v].push_back(-max(ndp1 + w, ndp0) + (ndp0 + w)); sort(all(sdp[v]), greater<int>()); dp[v][1] = dp[v][0] + sdp[v][0]; reroot(v, x); } }; reroot(1, -1); cout << answer << "\n"; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define name "InvMOD" if(fopen(name".INP", "r")){ freopen(name".INP","r",stdin); freopen(name".OUT","w",stdout); } int t = 1; //cin >> t; while(t--) solve(); return 0; }

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

beads.cpp: In function 'int main()':
beads.cpp:72:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   72 |         freopen(name".INP","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
beads.cpp:73:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   73 |         freopen(name".OUT","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...