Submission #34134

#TimeUsernameProblemLanguageResultExecution timeMemory
34134DoanPhuDucBeads and wires (APIO14_beads)C++98
100 / 100
289 ms21324 KiB
#include <bits/stdc++.h> #define FOR(x, a, b) for (int x = a; x <= b; ++x) #define FOD(x, a, b) for (int x = a; x >= b; --x) #define REP(x, a, b) for (int x = a; x < b; ++x) #define DEBUG(X) { cout << #X << " = " << X << endl; } #define PR(A, n) { cout << #A << " = "; FOR(_, 1, n) cout << A[_] << " "; cout << endl; } #define PR0(A, n) { cout << #A << " = "; REP(_, 0, n) cout << A[_] << " "; cout << endl; } #define BitCount(x) __builtin_popcount(x) using namespace std; typedef long long LL; typedef pair <int, int> II; const int N = 2e5 + 10; const int INF = 0x3f3f3f3f; int n; int f[N], p[N], a[N]; int dp[N][5]; vector <II> adj[N]; void DFS(int u, int par = -1) { f[u] = -INF; REP(k, 0, adj[u].size()) { int v = adj[u][k].first, w = adj[u][k].second; if (v == par) continue; f[u] = max(f[u], w); p[v] = u; a[v] = w; DFS(v, u); } } void DP(int u) { REP(k, 0, adj[u].size()) { int v = adj[u][k].first, w = adj[u][k].second; if (v == p[u]) continue; DP(v); } FOR(i, 0, 4) dp[u][i] = 0; // dp[u][0] int S = 0; REP(k, 0, adj[u].size()) { int v = adj[u][k].first, w = adj[u][k].second; if (v == p[u]) continue; S += max(dp[v][1], dp[v][3]); } II best1 = II(-INF, -1), best2 = II(-INF, -1); REP(k, 0, adj[u].size()) { int v = adj[u][k].first, w = adj[u][k].second; if (v == p[u]) continue; int value = -max(dp[v][1], dp[v][3]) + w + dp[v][3]; if (best1 == II(-INF, -1)) best1 = II(value, v); else if (best2 == II(-INF, -1)) { if (best1.first < value) { best2 = best1; best1 = II(value, v); } else best2 = II(value, v); } else { if (value > best1.first) { best2 = best1; best1 = II(value, v); } else if (value > best2.first) best2 = II(value, v); // best2 = II(value, v); // if (best1.first < best2.first) swap(best1, best2); } } REP(k1, 0, adj[u].size()) { int v1 = adj[u][k1].first, w1 = adj[u][k1].second; if (v1 == p[u]) continue; /*REP(k2, 0, adj[u].size()) if (k1 != k2) { int v2 = adj[u][k2].first, w2 = adj[u][k2].second; if (v2 == p[u]) continue; int newS = S - max(dp[v1][1], dp[v1][3]) - max(dp[v2][1], dp[v2][3]); dp[u][0] = max(dp[u][0], newS + w1 + w2 + dp[v2][3] + max(dp[v1][0], dp[v1][4])); }*/ dp[u][0] = max(dp[u][0], S - max(dp[v1][1], dp[v1][3]) + w1 + max(dp[v1][0], dp[v1][4]) + (best1.second == v1 ? best2.first : best1.first)); } //dp[u][1] REP(k, 0, adj[u].size()) { int v = adj[u][k].first, w = adj[u][k].second; if (v == p[u]) continue; int newS = S - max(dp[v][1], dp[v][3]); dp[u][1] = max(dp[u][1], newS + dp[v][3] + w + a[u]); } // dp[u][2] REP(k, 0, adj[u].size()) { int v = adj[u][k].first, w = adj[u][k].second; if (v == p[u]) continue; int newS = S - max(dp[v][1], dp[v][3]); dp[u][2] = max(dp[u][2], newS + max(dp[v][0], dp[v][4]) + w + a[u]); } // dp[u][3] dp[u][3] = S; // dp[u][4] REP(k, 0, adj[u].size()) { int v = adj[u][k].first, w = adj[u][k].second; if (v == p[u]) continue; int newS = S - max(dp[v][1], dp[v][3]); int val = 0; FOR(i, 0, 4) val = max(val, dp[v][i]); dp[u][4] = max(dp[u][4], val + newS); } } int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif // LOCAL scanf("%d", &n); FOR(i, 1, n - 1) { int u, v, w; scanf("%d%d%d", &u, &v, &w); adj[u].push_back(II(v, w)); adj[v].push_back(II(u, w)); } DFS(1); DP(1); printf("%d", max(dp[1][0], max(dp[1][3], dp[1][4]))); return 0; }

Compilation message (stderr)

beads.cpp: In function 'void DFS(int, int)':
beads.cpp:5:40: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define REP(x, a, b) for (int x = a; x < b; ++x)
beads.cpp:27:9:
     REP(k, 0, adj[u].size()) {
         ~~~~~~~~~~~~~~~~~~~             
beads.cpp:27:5: note: in expansion of macro 'REP'
     REP(k, 0, adj[u].size()) {
     ^~~
beads.cpp: In function 'void DP(int)':
beads.cpp:5:40: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define REP(x, a, b) for (int x = a; x < b; ++x)
beads.cpp:37:9:
     REP(k, 0, adj[u].size()) {
         ~~~~~~~~~~~~~~~~~~~             
beads.cpp:37:5: note: in expansion of macro 'REP'
     REP(k, 0, adj[u].size()) {
     ^~~
beads.cpp:38:34: warning: unused variable 'w' [-Wunused-variable]
         int v = adj[u][k].first, w = adj[u][k].second;
                                  ^
beads.cpp:5:40: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define REP(x, a, b) for (int x = a; x < b; ++x)
beads.cpp:45:9:
     REP(k, 0, adj[u].size()) {
         ~~~~~~~~~~~~~~~~~~~             
beads.cpp:45:5: note: in expansion of macro 'REP'
     REP(k, 0, adj[u].size()) {
     ^~~
beads.cpp:46:34: warning: unused variable 'w' [-Wunused-variable]
         int v = adj[u][k].first, w = adj[u][k].second;
                                  ^
beads.cpp:5:40: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define REP(x, a, b) for (int x = a; x < b; ++x)
beads.cpp:51:9:
     REP(k, 0, adj[u].size()) {
         ~~~~~~~~~~~~~~~~~~~             
beads.cpp:51:5: note: in expansion of macro 'REP'
     REP(k, 0, adj[u].size()) {
     ^~~
beads.cpp:5:40: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define REP(x, a, b) for (int x = a; x < b; ++x)
beads.cpp:70:9:
     REP(k1, 0, adj[u].size()) {
         ~~~~~~~~~~~~~~~~~~~~            
beads.cpp:70:5: note: in expansion of macro 'REP'
     REP(k1, 0, adj[u].size()) {
     ^~~
beads.cpp:5:40: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define REP(x, a, b) for (int x = a; x < b; ++x)
beads.cpp:86:9:
     REP(k, 0, adj[u].size()) {
         ~~~~~~~~~~~~~~~~~~~             
beads.cpp:86:5: note: in expansion of macro 'REP'
     REP(k, 0, adj[u].size()) {
     ^~~
beads.cpp:5:40: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define REP(x, a, b) for (int x = a; x < b; ++x)
beads.cpp:94:9:
     REP(k, 0, adj[u].size()) {
         ~~~~~~~~~~~~~~~~~~~             
beads.cpp:94:5: note: in expansion of macro 'REP'
     REP(k, 0, adj[u].size()) {
     ^~~
beads.cpp:5:40: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define REP(x, a, b) for (int x = a; x < b; ++x)
beads.cpp:105:9:
     REP(k, 0, adj[u].size()) {
         ~~~~~~~~~~~~~~~~~~~             
beads.cpp:105:5: note: in expansion of macro 'REP'
     REP(k, 0, adj[u].size()) {
     ^~~
beads.cpp:106:34: warning: unused variable 'w' [-Wunused-variable]
         int v = adj[u][k].first, w = adj[u][k].second;
                                  ^
beads.cpp: In function 'int main()':
beads.cpp:120:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &n);
     ~~~~~^~~~~~~~~~
beads.cpp:122:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         int u, v, w; scanf("%d%d%d", &u, &v, &w);
                      ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...