Submission #855625

#TimeUsernameProblemLanguageResultExecution timeMemory
855625mychecksedadMagic Tree (CEOI19_magictree)C++17
0 / 100
3 ms6492 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); } // void range_update_max(int l, int r, int ql, int qr, ll x){ // if(ql > r || l > qr) return; // if(ql <= l && r <= qr){ // extend(); // push(); // val = max(x, val); // lazy2 = max(lazy2, x); // settime = ttt++; // return; // } // extend(); // push(); // int m = l+r>>1; // L->range_update_max(l, m, ql, qr, x); // R->range_update_max(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)); } }; 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(d[u] > 0){ ll val = T[u]->get(1, M, d[u]) + w[u]; D[u] = val; T[u]->range_update(1, M, d[u], d[u], w[u]); T_time[u].pb(d[u]); // cout << d[u] << ' ' << w[u] << ' ' << u << '\n'; } } if(big != -1){ swap(T[v], T[big]); T_time[v].swap(T_time[big]); }else{ T[v] = new Node(); } for(int u: g[v]){ if(u == big) continue; sort(all(T_time[u]), greater<int>()); int last = M; for(int tm: T_time[u]){ if(tm > last) continue; // cout << v << ' ' << u << ' ' << tm << '\n'; ll val = T[u]->get(1, M, tm); if(d[u] <= tm) val = max(val, D[u]); // cout << val << '\n'; T[v]->range_update(1, M, tm, last, val); T_time[v].pb(tm); last = tm - 1; } } } 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:69:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   69 |     int m = l+r>>1;
      |             ~^~
magictree.cpp: In function 'int main()':
magictree.cpp:155:15: warning: unused variable 'aa' [-Wunused-variable]
  155 |   int tt = 1, aa;
      |               ^~
magictree.cpp:156:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  156 |   freopen("in.txt", "r", stdin);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#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...