| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1340819 | kokokai | Power Plant (JOI20_power) | C++20 | 96 ms | 26840 KiB |
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define fi first
#define se second
#define task "text"
const int N = 2e5+5;
vector<int> adj[N];
int a[N],dp[N];
int n,ans;
void dfs(int u,int p){
dp[u]=a[u];
int cnt=-a[u];
int cntp=0;
for(int v:adj[u]){
if(v==p) continue;
dfs(v,u);
cnt += max(0,dp[v]);
cntp=max(cntp,dp[v]);
}
dp[u]=max(dp[u],cnt);
if(p == 0){
dp[u]=a[u]+cntp;
}
}
void dfs1(int u,int p,int dpanc){
int mx=dpanc;
for(int v:adj[u]){
if(v==p) continue;
mx=max(mx,dp[v]);
}
//if(u == 1) cerr<<mx<<'\n';
//cerr<<u<<' '<<dpanc<<'\n';
if(a[u]){
//if(u == 1) cerr<<mx+a[u]<<'\n';
//if(mx+a[u] == 5) cerr<<u<<' '<<mx<<'\n';
ans=max(ans,mx+a[u]);
}
int dpa = a[u];
int sum=max(0,dpanc);
for(int v:adj[u]){
if(v==p) continue;
sum += max(0,dp[v]);
}
for(int v:adj[u]){
if(v==p) continue;
int dpn = max(a[u],sum - max(0,dp[v]) - a[u]);
dfs1(v,u,dpn);
}
}
int main(){
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
if(fopen(task".INP","r")){
freopen(task".INP","r",stdin);
//freopen(task".OUT","w",stdout);
}
cin>>n;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
adj[u].push_back(v);
adj[v].push_back(u);
}
string s;
cin>>s;
for(int i=1;i<=n;i++) a[i]=s[i-1]-'0';
dfs(1,0);
//cerr<<dp[1]<<'\n';
dfs1(1,0,0);
cout<<ans<<'\n';
}
컴파일 시 표준 에러 (stderr) 메시지
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
