Submission #1090245

#TimeUsernameProblemLanguageResultExecution timeMemory
1090245pmqwertyMagic Tree (CEOI19_magictree)C++17
3 / 100
79 ms7804 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){ 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'; } } bool sub3_flag = true; namespace sub3{ bool check(){ if (!sub3_flag) return false; for (int i = 1; i <= m; i++){ if (w[i] > 1) return false; } return true; } int lis(vector<int> const& a) { int n = a.size(); const int INF = 1e9; vector<int> d(n+1, INF); d[0] = -INF; for (int i = 0; i < n; i++) { int l = upper_bound(d.begin(), d.end(), a[i]) - d.begin(); if (d[l-1] < a[i] && a[i] < d[l]) d[l] = a[i]; } int ans = 0; for (int l = 0; l <= n; l++) { if (d[l] < INF) ans = l; } return ans; } void solve(){ vector<int> temp; for (int i = 1; i <= m; i++){ temp.push_back(d[i]); } cout << lis(temp) << '\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]++; sub3_flag &= (x == i - 1); } 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(); else if (sub3::check()) sub3::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...