답안 #855638

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
855638 2023-10-01T15:07:23 Z mychecksedad Magic Tree (CEOI19_magictree) C++17
컴파일 오류
0 ms 0 KB
/* 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

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;
      |               ^~