Submission #1063456

#TimeUsernameProblemLanguageResultExecution timeMemory
1063456ThylOnePower Plant (JOI20_power)C++14
100 / 100
109 ms32824 KiB
//#################### //PowerPlant //#################### #include<bits/stdc++.h> using namespace std; const int maxiN = 2*1e5; bool isPowerPlant[maxiN]; vector<int> links[maxiN]; int dp[2][maxiN]; int ans = 0; int solve(bool ataken,int node,int dad=-1){ if(dp[ataken][node]!=-1)return dp[ataken][node]; if(ataken==0){ int sum = 0; int bestsub = 0; for(int v:links[node])if(v!=dad){ int x = solve(0,v,node); bestsub = max(bestsub,x); sum += x; ans = max(ans, isPowerPlant[node] + solve(1,v,node)); } if(bestsub<1)bestsub=isPowerPlant[node]; if(bestsub>1)bestsub-=isPowerPlant[node]; ans = max(ans,max(sum-isPowerPlant[node],bestsub)); return dp[ataken][node] = max(sum-isPowerPlant[node],bestsub); }else{ int sum = 0; int bestsub = 0; for(int v:links[node])if(v!=dad){ int x = solve(0,v,node); bestsub = max(bestsub,x); sum += x; } ans = max(ans, max(sum-isPowerPlant[node],bestsub)); return dp[ataken][node] = max(sum-isPowerPlant[node],bestsub); } } signed main(){ ios::sync_with_stdio(false); int n;cin>>n; for(int i = 1;i<n;i++){ int a,b;cin>>a>>b; a--; b--; links[a].push_back(b); links[b].push_back(a); } fill(dp[0],dp[0]+n,-1); fill(dp[1],dp[1]+n,-1); string binary;cin>>binary; for(int i= 0;i<n;i++)isPowerPlant[i] = (binary[i]=='1'); solve(0,0); cout<<ans<<endl; return 0; };
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...