제출 #1128015

#제출 시각아이디문제언어결과실행 시간메모리
1128015akamizaneSails (IOI07_sails)C++20
15 / 100
132 ms5160 KiB
#include<bits/stdc++.h>
 
using namespace std;
 

#define debug(...) 40

 
using ll = long long;
using pii = pair<int, int>;
using db = long double;

#define int long long
#define el cout << '\n'
#define fi first
#define se second
#define pb push_back
#define all(x) x.begin(), x.end()
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define FOD(i, a, b) for (int i = (a); i >= (b); i--)
#define REP(i, n) for (int i = 0; i < (n); i++)
template <class T1, class T2>bool chmax(T1 &a, T2 b){return a < b ? a = b, 1 : 0;}
template <class T1, class T2>bool chmin(T1 &a, T2 b){return a > b ? a = b, 1 : 0;}

long long rng() {
  static std::mt19937 gen(
      std::chrono::steady_clock::now().time_since_epoch().count());
  return std::uniform_int_distribution<long long>(0, INT64_MAX)(gen);
}

const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;

template <class T> class BIT {
  private:
    int n;
    vector<T> bit;
    vector<T> arr;
 
  public:
    BIT(int n) : n(n), bit(n + 1), arr(n) {}
 
    void set(int k, T val) { add(k, val - arr[k]); }
 
    void add(int k, T val) {
        arr[k] += val;
        k++;
        for (; k <= n; k += k & -k) { bit[k] += val; }
    }
 
    T query(int a, int b) {
        b++;
        T s = 0;
        for (; a > 0; a -= a & -a) { s -= bit[a]; }
        for (; b > 0; b -= b & -b) { s += bit[b]; }
        return s;
    }
};
 
 
template <class T> class RURQBIT {
    private : 
        int n; 
        vector<T> a; 
        BIT<T> b, c; 
    public : 
        RURQBIT(int n) : n(n), a(n + 1), b(n + 2), c(n + 2){}
 
        void build(vector<int> &v){
            for(int i = 1; i <= v.size(); i++){
                a[i] = v[i - 1]; 
                b.set(i, a[i] - a[i - 1]); 
                c.set(i, i * (a[i] - a[i - 1])); 
            }
        }
 
        void add(int l, int r, T v){
            if(l > r) return; 
            b.add(l, v); 
            b.add(r + 1, -v); 
            c.add(l, l * v); 
            c.add(r + 1, -(r + 1) * v); 
        }
 
        T query(int l, int r){
            T rs = (r + 1) * b.query(1, r) - c.query(1, r); 
            T ls = l * b.query(1, l - 1) - c.query(1, l - 1); 
            return rs - ls; 
        }
 
        T query(int l){
            return query(l, l); 
        }
}; 


RURQBIT<int> bit(maxn);

void solve(){
  int n;
  cin >> n;
  vector<pii> a(n);
  for (int i = 0; i < n; i++){
    cin >> a[i].fi >> a[i].se;
  }
  sort(all(a));
  for (int i = 0; i < n; i++){
    auto [h, k] = a[i];
    debug(h, k);
    int val = bit.query(h - k + 1);
    int lo = 1, hi = h;
    while(lo < hi){
      int mid = lo + (hi - lo + 1) / 2;
      if (bit.query(mid) >= val) lo = mid;
      else hi = mid - 1;
    }
    int l1 = lo;
    lo = 1, hi = h;
    while(lo < hi){
      int mid = lo + (hi - lo) / 2;
      if (bit.query(mid) <= val) hi = mid;
      else lo = mid + 1;
    }
    int l2 = lo;
    bit.add(l1 + 1, h, 1);
    // h - l1
    bit.add(l2, l2 + k - 1 - (h - l1), 1);
  }
  int ans = 0;
  for (int i = 1; i <= a[i - 1].fi; i++){
    int val = bit.query(i);
    ans += val * (val - 1) / 2;
  }
  cout << ans;
}


int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int tests = 1;
  // cin >> tests;
  for (int _ = 1; _ <= tests; _++){
    cerr << "- Case #" << _ << ": \n";
    solve();
    // el;
  }
  return 0;
}

 
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...