Submission #855767

#TimeUsernameProblemLanguageResultExecution timeMemory
855767mychecksedadMagic Tree (CEOI19_magictree)C++17
Compilation error
0 ms0 KiB
/* Author : Mychecksdead */ #include<bits/stdc++.h> using namespace std; #define ll long long int #define MOD (1000000000+7) #define MOD1 (998244353) #define pb push_back #define all(x) x.begin(), x.end() #define en cout << '\n' const int N = 1e5+100, M = 1e5, K = 1e3+10; int ttt = 1; struct Node{ Node *L, *R; ll val, lazy; Node(){ L = R = nullptr; val = 0; lazy = 0; } void extend(){ if(L == nullptr) L = new Node(); if(R == nullptr) R = new Node(); } void push(){ L->val += lazy; R->val += lazy; L->lazy += lazy; R->lazy += lazy; lazy = 0; } void range_update(int l, int r, int ql, int qr, ll x){ if(ql > r || l > qr) return; if(ql <= l && r <= qr){ val += x; lazy += x; return; } extend(); push(); int m = l+r>>1; L->range_update(l, m, ql, qr, x); R->range_update(m+1, r, ql, qr, x); val = max(L->val, R->val); } ll get(int l, int r, int p){ if(r <= p) return val; extend(); push(); int m = l+r>>1; if(p <= m) return L->get(l, m, p); return max(L->val, R->get(m+1, r, p)); } void eras(int l, int r, int p){ int m = l+r>>1; extend(); push(); if(m >= p){ free(R); L->eras(l, m, p); }else{ R->erase(m+1, r, p); } } }; int n, m, k, sz[N], d[N]; vector<int> g[N], T_time[N]; ll w[N], D[N]; vector<Node*> T; void pre(int v){ sz[v] = 1; for(int &u: g[v]){ pre(u); sz[v] += sz[u]; if(sz[u] > sz[g[v][0]]) swap(u, g[v][0]); } } void dfs(int v){ int big = g[v].empty() ? -1 : g[v][0]; for(int u: g[v]){ dfs(u); } if(big != -1){ swap(T[v], T[big]); T_time[v].swap(T_time[big]); if(d[v] > 0) bigger_dv_sum += T[v]->get(1, M, M) - T[v]->get(1, M, d[v] - 1); }else{ T[v] = new Node(); } ll bigger_dv_sum = 0; for(int u: g[v]){ if(u == big) continue; sort(all(T_time[u]), greater<int>()); int last = M; if(d[v] > 0) bigger_dv_sum += T[u]->get(1, M, M) - T[u]->get(1, M, d[v] - 1); for(int tm: T_time[u]){ if(tm > last) continue; ll val = T[u]->get(1, M, tm); T[v]->range_update(1, M, tm, last, val); T_time[v].pb(tm); last = tm - 1; } } if(d[v] > 0){ if(bigger_dv_sum < w[v]){ T[v]->eras(1, M, d[v] + 1); T[v]->range_update(1, M, d[v], M, w[v]); } } } void solve(){ cin >> n >> m >> k; for(int i = 2; i <= n; ++i){ int p; cin >> p; g[p].pb(i); } for(int i = 0; i <= n; ++i) d[i] = w[i] = 0; vector<int> val; for(int i = 0; i < m; ++i){ int v, dd, e; cin >> v >> dd >> e; d[v] = dd; w[v] = e; } T.resize(n+1); pre(1); dfs(1); cout << T[1]->val; } int main(){ cin.tie(0); ios::sync_with_stdio(0); int tt = 1, aa; //freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); while(tt--){ solve(); } cerr<<"time taken : "<<(float)clock()/CLOCKS_PER_SEC<<" seconds\n"; return 0; }

Compilation message (stderr)

magictree.cpp: In member function 'void Node::range_update(int, int, int, int, long long int)':
magictree.cpp:43:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   43 |     int m = l+r>>1;
      |             ~^~
magictree.cpp: In member function 'long long int Node::get(int, int, int)':
magictree.cpp:52:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   52 |     int m = l+r>>1;
      |             ~^~
magictree.cpp: In member function 'void Node::eras(int, int, int)':
magictree.cpp:58:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   58 |     int m = l+r>>1;
      |             ~^~
magictree.cpp:65:10: error: 'struct Node' has no member named 'erase'; did you mean 'eras'?
   65 |       R->erase(m+1, r, p);
      |          ^~~~~
      |          eras
magictree.cpp: In function 'void dfs(int)':
magictree.cpp:94:7: error: 'bigger_dv_sum' was not declared in this scope
   94 |       bigger_dv_sum += T[v]->get(1, M, M) - T[v]->get(1, M, d[v] - 1);
      |       ^~~~~~~~~~~~~
magictree.cpp: In function 'int main()':
magictree.cpp:149:15: warning: unused variable 'aa' [-Wunused-variable]
  149 |   int tt = 1, aa;
      |               ^~