제출 #1065429

#제출 시각아이디문제언어결과실행 시간메모리
1065429_rain_Jobs (BOI24_jobs)C++14
11 / 100
66 ms26960 KiB
#include<bits/stdc++.h> using namespace std; using i64 = long long; #define debug false #define int long long const int maxn = 3e5; vector<int> graph[maxn+2]; int x[maxn+2] , p[maxn+2]; bool root[maxn+2]; int n; i64 s , pre[maxn+2] , f[maxn+2] , dp[maxn+2]; i64 dfs(int u , int p , i64 sum){ sum += x[u]; if (sum < 0) return sum; for (auto& v : graph[u]){ if (v!=p){ sum = max(sum , dfs(v,u,sum)); } } if (debug){ cout << "( DEBUG )\n"; cout << u << ' ' << sum << '\n'; } return sum; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> s; bool ok = true; for (int i = 1; i <= n; ++i){ cin >> x[i] >> p[i]; if (p[i] != 0 && p[i] != i - 1) ok = false; if (p[i]==0) root[i] = true; else graph[p[i]].push_back(i); } i64 alter = s; for (int i = 1; i <= n; ++i){ if (root[i]) s = max(s , dfs(i,i,s)); } if (ok==false){ cout << s - alter; return 0; } for (int i = 1; i <= n; ++i) pre[i] = pre[i - 1] + x[i]; f[0] = s; for (int i = 1; i <= n; ++i){ int pos = i; for (int j = i; j >= 1; --j){ dp[i] = max(dp[i] , dp[j]); if (p[j]==0){ pos = j; break; } } dp[i] = max(dp[i] , f[pos - 1] + pre[i] - pre[pos - 1]); dp[i] = max(dp[i] , f[pos - 1]); f[i] = max(dp[i] , f[i - 1]); } cout << dp[n] - s; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...