제출 #288626

#제출 시각아이디문제언어결과실행 시간메모리
288626dlwocks31Magic Tree (CEOI19_magictree)C++17
100 / 100
220 ms32376 KiB
#include <bits/stdc++.h> using namespace std; #define int long long template<typename T> int SIZE(T (&t)){ return t.size(); } template<typename T, size_t N> int SIZE(T (&t)[N]){ return N; } string to_string(char t){ return "'" + string({t}) + "'"; } string to_string(bool t){ return t ? "true" : "false"; } string to_string(const string &t, int x1=0, int x2=1e9){ string ret = ""; for(int i = min(x1,SIZE(t)), _i = min(x2,SIZE(t)-1); i <= _i; ++i){ ret += t[i]; } return '"' + ret + '"'; } string to_string(const char* t){ string ret(t); return to_string(ret); } template<size_t N> string to_string(const bitset<N> &t, int x1=0, int x2=1e9){ string ret = ""; for(int i = min(x1,SIZE(t)); i <= min(x2,SIZE(t)-1); ++i){ ret += t[i] + '0'; } return to_string(ret); } template<typename T, typename... Coords> string to_string(const T (&t), int x1=0, int x2=1e9, Coords... C); template<typename T, typename S> string to_string(const pair<T, S> &t){ return "(" + to_string(t.first) + ", " + to_string(t.second) + ")"; } template<typename T, typename... Coords> string to_string(const T (&t), int x1, int x2, Coords... C){ string ret = "["; x1 = min(x1, SIZE(t)); auto e = begin(t); advance(e,x1); for(int i = x1, _i = min(x2,SIZE(t)-1); i <= _i; ++i){ ret += to_string(*e, C...) + (i != _i ? ", " : ""); e = next(e); } return ret + "]"; } template<int Index, typename... Ts> struct print_tuple{ string operator() (const tuple<Ts...>& t) { string ret = print_tuple<Index - 1, Ts...>{}(t); ret += (Index ? ", " : ""); return ret + to_string(get<Index>(t)); } }; template<typename... Ts> struct print_tuple<0, Ts...> { string operator() (const tuple<Ts...>& t) { return to_string(get<0>(t)); } }; template<typename... Ts> string to_string(const tuple<Ts...>& t) { const auto Size = tuple_size<tuple<Ts...>>::value; return print_tuple<Size - 1, Ts...>{}(t); } void dbgr(){;} template<typename Heads, typename... Tails> void dbgr(Heads H, Tails... T){ cout << to_string(H) << " | "; dbgr(T...); } void dbgs(){;} template<typename Heads, typename... Tails> void dbgs(Heads H, Tails... T){ cout << H << " "; dbgs(T...); } #define dbgv(...) cout << to_string(__VA_ARGS__) << endl; #define dbg(...) cout << "[" << #__VA_ARGS__ << "]: "; dbgv(__VA_ARGS__); const int MX = 1e5+1; vector<int> adj[MX]; pair<int, int> fruit[MX]; multiset<pair<int, int>> ms[MX]; void merge(multiset<pair<int, int>>& st, pair<int, int> pr) { auto [d, w] = pr; auto it = st.lower_bound(make_pair(d+1, -1)); while(w > 0 && it != st.end()) { if(w >= it->second) { w -= it->second; it = st.erase(it); } else { st.insert({it->first, it->second - w}); st.erase(it); w = 0; break; } } st.insert(pr); } void dfs(int i, int p) { int leaf = 1; for(int a: adj[i]) { if(a == p) continue; leaf = 0; dfs(a, i); } if(leaf) { if(fruit[i].first) ms[i] = {fruit[i]}; } else { int mx = 0; for(int a: adj[i]) { if(a == p) continue; if(ms[a].size() > ms[mx].size()) mx = a; } ms[i] = move(ms[mx]); for(int a: adj[i]) { if(a == p || a == mx) continue; for(auto pr: ms[a]) { ms[i].insert(pr); } ms[a].clear(); } if(fruit[i].first) merge(ms[i], fruit[i]); } } int32_t main() { ios::sync_with_stdio(0);cin.tie(0); int n, m, k; cin >> n >> m >> k; for(int i=2; i<=n; i++) { int p; cin >> p; adj[p].push_back(i); adj[i].push_back(p); } for(int i=0; i<m; i++) { int v, d, w; cin >> v >> d >> w; fruit[v] = {d, w}; } dfs(1, 0); int ans = 0; for(auto [d, w]: ms[1]) { ans += w; } cout << ans; }
#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...