Submission #1090237

#TimeUsernameProblemLanguageResultExecution timeMemory
1090237pmqwertyMagic Tree (CEOI19_magictree)C++17
3 / 100
28 ms5788 KiB
#include<bits/stdc++.h> using namespace std; const int MAXN = 1e5 + 100; vector<int> a[MAXN]; int v[MAXN]; int w[MAXN]; int d[MAXN]; int n, m, k; int par[MAXN]; int outdegree[MAXN]; namespace sub1{ bool check(){ if (!(n <= 20 && k <= 20)) return 0; for (int i = 1; i <= m; i++){ if (w[i] > 1) return 0; } return 1; } int mark[21]; bool flag = true; void dfs(int u, int t){ if (mark[u]){ if (d[u] > t){ flag = false; } } for (int v: a[u]){ dfs(v, (mark[u] ? d[u]: t)); } } void solve(){ long long ans = 0; for (int mask = 0; mask < (1 << m); mask++){ memset(mark, 0, sizeof(mark)); long long cnt = 0; for (int i = 0; i < m; i++){ if (mask & (1 << i)){ mark[v[i + 1]] = true; cnt += w[i + 1]; } } flag = true; dfs(1, 1e9); if (flag){ for (int i = 0; i < m; i++){ if (mask & (1 << i)){ cout << i + 1 << " "; } } cout << '\n'; ans = max(ans, cnt); } } cout << ans << '\n'; } } namespace sub2{ bool check(){ for (int i = 1; i <= m; i++){ if (outdegree[v[i]] != 0) return 0; } return 1; } void solve(){ long long ans = 0; for (int i = 1; i <= m; i++){ ans += w[i]; } cout << ans << '\n'; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> k; for (int i = 2; i <= n; i++){ int x; cin >> x; a[x].push_back(i); outdegree[x]++; } for (int i = 1; i <= m; i++){ cin >> v[i] >> d[i] >> w[i]; } if (sub1::check()) sub1::solve(); else if (sub2::check()) sub2::solve(); }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...