Submission #135067

#TimeUsernameProblemLanguageResultExecution timeMemory
135067arthur_nascimentoBeads and wires (APIO14_beads)C++14
28 / 100
1063 ms1400 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back #define maxn 10100 #define pii pair<int,int> vector<pii> L[maxn]; int dp[2][2][maxn]; int get(int hat,int need,int vx,int p=-1){ // fprintf(stderr,"%d %d %d\n",need,vx,p); int &r = dp[hat][need][vx]; if(r+1) return r; int st=0; vector<int> vs; r = 0; int l = L[vx].size(); if(need == 0){ if(hat) { int stot= 0; vector<int> ss; for(int k=0;k<l;k++){ int to = L[vx][k].first; // fprintf(stderr,"to %d\n",to); if(to != p)stot += max(get(0,0,to,vx), get(0,1,to,vx) + L[vx][k].second), ss.pb(max(get(0,0,to,vx), get(0,1,to,vx) + L[vx][k].second)); else ss.pb(0); } for(int i=0;i<l;i++)for(int j=i+1;j<l;j++){ int A = L[vx][i].first, B = L[vx][j].first; if(A == p || B == p) continue; int s = max (L[vx][i].second + L[vx][j].second + get(0,0,A,vx) + get(1,0,B,vx), L[vx][i].second + L[vx][j].second + get(1,0,A,vx) + get(0,0,B,vx)); /* for(int k=0;k<l;k++){ int to = L[vx][k].first; // fprintf(stderr,"to %d\n",to); if(to != A && to != B && to != p) s += max(get(0,0,to,vx), get(0,1,to,vx) + L[vx][k].second); }*/ s += stot - ss[i] - ss[j]; r = max(r,s); } } st=0; vs.clear(); for(int k=0;k<l;k++){ int to = L[vx][k].first; if(to != p) st += max(get(0,0,to,vx), get(0,1,to,vx) + L[vx][k].second), vs.pb(max(get(0,0,to,vx), get(0,1,to,vx) + L[vx][k].second)); else vs.pb(0); } int no = 0; for(int spec=0;spec<l;spec++){ no=0; int to = L[vx][spec].first; if(to == p) continue; no += max(get(hat,0,to,vx), get(hat,1,to,vx) + L[vx][spec].second); /* for(int k=0;k<l;k++){ int to = L[vx][k].first; int hh = (hat && (spec==k)); if(to != p) no += max(get(hh,0,to,vx), get(hh,1,to,vx) + L[vx][k].second); }*/ no += st - vs[spec]; r = max(r,no); } r = max(r,no); // fprintf(stderr,"dp[%d][%d]=%d\n",need,vx,r); return r; } if(L[vx].size()==1){ r = -1e7; return r; } st = 0; vs.clear(); for(int j=0;j<L[vx].size();j++){ int to = L[vx][j].first; if(to == p ) vs.pb(0); else st += max(get(0,0,to,vx), get(0,1,to,vx) + L[vx][j].second), vs.pb(max(get(0,0,to,vx), get(0,1,to,vx) + L[vx][j].second)); } for(int i=0;i<L[vx].size();i++){ int s = 0; if(L[vx][i].first == p) continue; s = L[vx][i].second + get(hat,0,L[vx][i].first,vx); s += st - vs[i]; r = max(r,s); } return r; } int main() { int n; scanf("%d",&n); for(int i=0;i<n-1;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c), a--, b--; L[a].pb(pii(b,c)); L[b].pb(pii(a,c)); } memset(dp,-1,sizeof(dp)); printf("%d\n",get(1,0,0)); //printf("%d\n",get(0,0,1)); }

Compilation message (stderr)

beads.cpp: In function 'int get(int, int, int, int)':
beads.cpp:86:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int j=0;j<L[vx].size();j++){
                 ~^~~~~~~~~~~~~
beads.cpp:94:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<L[vx].size();i++){
                 ~^~~~~~~~~~~~~
beads.cpp: In function 'int main()':
beads.cpp:107:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&n);
     ~~~~~^~~~~~~~~
beads.cpp:110:38: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d%d",&a,&b,&c), a--, b--;
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...