Submission #837980

#TimeUsernameProblemLanguageResultExecution timeMemory
837980gun_ganAdvertisement 2 (JOI23_ho_t2)C++17
100 / 100
346 ms29968 KiB
#include <bits/stdc++.h>
using namespace std;

const int MX = 5e5 + 5;

int X[MX], E[MX];
int N;

int getId(int x) {
      auto it = lower_bound(X + 1, X + 1 + N, x) - X;
      return it;
}

struct stMin {
      int t[4 * MX];

      void update(int v, int l, int r, int pos, int val) {
            if(pos > r || pos < l) return;
            if(l == r) {
                  t[v] = min(t[v], val);
                  return;
            }
            int mid = (l + r) >> 1;
            update(v * 2 + 0, l, mid + 0, pos, val);
            update(v * 2 + 1, mid + 1, r, pos, val);
            t[v] = min(t[v * 2 + 0], t[v * 2 + 1]);
      }

      int query(int v, int l, int r, int ql, int qr) {
            if(qr < l || ql > r) return 2e9;
            if(ql <= l && qr >= r) return t[v];
            int mid = (l + r) >> 1;
            return min(query(v * 2 + 0, l, mid + 0, ql, qr), 
                  query(v * 2 + 1, mid + 1, r, ql, qr));
      }
} st;

struct stMax {
      int t[4 * MX];

      void update(int v, int l, int r, int pos, int val) {
            if(pos > r || pos < l) return;
            if(l == r) {
                  t[v] = max(t[v], val);
                  return;
            }
            int mid = (l + r) >> 1;
            update(v * 2 + 0, l, mid + 0, pos, val);
            update(v * 2 + 1, mid + 1, r, pos, val);
            t[v] = max(t[v * 2 + 0], t[v * 2 + 1]);
      }

      int query(int v, int l, int r, int ql, int qr) {
            if(qr < l || ql > r) return 0;
            if(ql <= l && qr >= r) return t[v];
            int mid = (l + r) >> 1;
            return max(query(v * 2 + 0, l, mid + 0, ql, qr), 
                  query(v * 2 + 1, mid + 1, r, ql, qr));
      }
} tt;

int main() {
      cin.tie(0); ios_base::sync_with_stdio(0);

      for(int i = 0; i < 4 * MX; i++) st.t[i] = 2e9;

      cin >> N;
      vector<pair<int,int>> v;
      for(int i = 1; i <= N; i++) {
            cin >> X[i] >> E[i];
            v.push_back({E[i], X[i]});
      }

      sort(X + 1, X + 1 + N);

      sort(v.rbegin(), v.rend());

      int ans = 0;

      for(auto [e, x] : v) {
            if(st.query(1, 1, N, getId(x), N) <= x - e) continue;
            if(tt.query(1, 1, N, 1, getId(x)) >= x + e) continue;
            st.update(1, 1, N, getId(x), x - e);
            tt.update(1, 1, N, getId(x), x + e);
            ans++;
      }

      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...