제출 #792075

#제출 시각아이디문제언어결과실행 시간메모리
792075WLZAdvertisement 2 (JOI23_ho_t2)C++17
59 / 100
1568 ms1048576 KiB
#include <bits/stdc++.h>
using namespace std;

#ifdef DEBUG
#include "templates/debug.h"
#else
#define debug(...) 0
#endif

#define rep(i, begin, end) for (__typeof(end) i = (begin) - ((begin) > (end)); i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
#define eb emplace_back
#define pb push_back
#define mt make_tuple
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define SZ(x) (int) x.size()

using ll = long long;
using ull = unsigned ll;
using lll = __int128_t;
using ulll = __uint128_t;
using ld = long double;
using ii = pair<int, int>;
using vi = vector<int>;
using vll = vector<ll>;
using vii = vector<ii>;
template<typename T> using mx_pq = priority_queue<T>;
template<typename T> using mn_pq = priority_queue<T, vector<T>, greater<T>>;

template<typename T> void cmax(T &a, const T &b) { a = max(a, b); }
template<typename T> void cmin(T &a, const T &b) { a = min(a, b); }

const int INF = 0x3f3f3f3f;
const ll LINF = (ll) 1e18;
const double DINF = 1.0 / 0.0;
const double pi = acos(-1);
const double EPS = 1e-9;

void solve(int current_case);

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int t = 1;
  //cin >> t;
  for (int q = 1; q <= t; q++) solve(q);
  return 0;
}

struct node {
  int l, r, val, lazy;
  node *left ,*right;
};

node *build(int l, int r) {
  return new node{l, r, -INF, -INF, nullptr, nullptr};
}

void propagate(node *cur) {
  if (cur == nullptr || cur->lazy == -INF) return;
  cmax(cur->val, cur->lazy);
  if (cur->l != cur->r) {
    if (cur->left == nullptr) cur->left = build(cur->l, (cur->l + cur->r) / 2);
    if (cur->right == nullptr) cur->right = build((cur->l + cur->r) / 2 + 1, cur->r);
    cmax(cur->left->lazy, cur->lazy);
    cmax(cur->right->lazy, cur->lazy);
  }
  cur->lazy = -INF;
}

int query(node *cur, int l, int r) { // max
  if (cur == nullptr) return -INF;
  propagate(cur);
  if (l > cur->r || r < cur->l) return -INF;
  if (l <= cur->l && cur->r <= r) return cur->val;
  return max(query(cur->left, l, r), query(cur->right, l, r));
}

void update(node *cur, int l, int r, int val) { // add
  propagate(cur);
  if (l > cur->r || r < cur->l) return;
  if (l <= cur->l && cur->r <= r) {
    cmax(cur->lazy, val);
    propagate(cur);
    return;
  }
  if (cur->left == nullptr) cur->left = build(cur->l, (cur->l + cur->r) / 2);
  if (cur->right == nullptr) cur->right = build((cur->l + cur->r) / 2 + 1, cur->r);
  update(cur->left, l, r, val); update(cur->right, l, r, val);
  cur->val = max(cur->left->val, cur->right->val);
}

void solve(int current_case) {
  int n; cin >> n;
  vi x(n), e(n);
  vii v(n);
  rep(i, 0, n) cin >> x[i] >> e[i], v[i] = {e[i], x[i]};
  int mx = *max_element(all(x));
  sort(v.rbegin(), v.rend());
  node *root_l = build(1, mx), *root_r = build(1, mx);
  int ans = 0;
  for (auto &p : v) {
    if (query(root_l, p.second, p.second) >= p.first - p.second || query(root_r, p.second, p.second) >= p.first + p.second) continue;
    ans++;
    update(root_l, 1, p.second, p.first - p.second);
    update(root_r, p.second, mx, p.first + p.second);
  }
  cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...