제출 #747083

#제출 시각아이디문제언어결과실행 시간메모리
747083MilosMilutinovicVinjete (COI22_vinjete)C++14
100 / 100
697 ms152852 KiB
/**
 *    author:  wxhtzdy
 *    created: 20.12.2022 14:09:07
**/
#include <bits/stdc++.h>

using namespace std;

const int M = 8e6;

int root, tsz, ls[M], rs[M], mn[M], cnt[M], add[M];

int make_node(int l, int r) {
  int node = ++tsz;
  cnt[node] = max(0, r - l + 1);
  if (l > r) {
    mn[node] = 1e6;
  }
  return node;
}

void push(int x, int l, int r) {
  if (add[x] == 0) {
    return;
  }
  int mid = l + r >> 1;
  if (!ls[x]) {
    ls[x] = make_node(l, mid);
  }
  if (!rs[x]) {
    rs[x] = make_node(mid + 1, r);
  }
  mn[ls[x]] += add[x];
  mn[rs[x]] += add[x];
  add[ls[x]] += add[x];
  add[rs[x]] += add[x];
  add[x] = 0;
}

void pull(int x) {
  mn[x] = min(mn[ls[x]], mn[rs[x]]);
  cnt[x] = (mn[ls[x]] == mn[x] ? cnt[ls[x]] : 0) + (mn[rs[x]] == mn[x] ? cnt[rs[x]] : 0);
}

void modify(int x, int l, int r, int ll, int rr, int v) {
  assert(x > 0);
  if (l > r || l > rr || r < ll) {
    return;
  }
  if (ll <= l && r <= rr) {
    mn[x] += v;
    add[x] += v;
    push(x, l, r);
    return;
  }
  push(x, l, r);
  int mid = l + r >> 1;
  if (!ls[x]) {
    ls[x] = make_node(l, mid);
  }
  modify(ls[x], l, mid, ll, rr, v);
  if (!rs[x]) {
    rs[x] = make_node(mid + 1, r);
  }
  modify(rs[x], mid + 1, r, ll, rr, v);
  pull(x);
}


int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);  
  int n, m;
  cin >> n >> m;
  vector<vector<array<int, 3>>> g(n);
  for (int i = 1; i < n; i++) {
    int x, y, l, r;
    cin >> x >> y >> l >> r;
    --x; --y;
    g[x].push_back({y, l, r});
    g[y].push_back({x, l, r});
  }
  root = make_node(1, m);
  vector<int> ans(n);
  function<void(int, int)> Dfs = [&](int v, int pv) {
    ans[v] = (mn[root] == 0 ? m - cnt[root] : m);
    for (auto p : g[v]) {
      int u = p[0];
      int l = p[1];
      int r = p[2];
      if (u == pv) {
        continue;
      }
      modify(root, 1, m, l, r, +1);
      Dfs(u, v);
      modify(root, 1, m, l, r, -1);
    }
  };
  Dfs(0, 0);
  for (int i = 1; i < n; i++) {
    cout << ans[i] << '\n';
  }                                                               
  return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'void push(int, int, int)':
Main.cpp:26:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   26 |   int mid = l + r >> 1;
      |             ~~^~~
Main.cpp: In function 'void modify(int, int, int, int, int, int)':
Main.cpp:57:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   57 |   int mid = l + r >> 1;
      |             ~~^~~
#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...