제출 #1281007

#제출 시각아이디문제언어결과실행 시간메모리
1281007lambd47Sails (IOI07_sails)C++20
100 / 100
146 ms6808 KiB
#include <bits/stdc++.h>

#define int long long
using namespace std;

#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)

std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());

const int MX=1e5+7;
int seg[4*MX];
int lz[4*MX];

void refresh(int pos, int ini, int fim){
    if(lz[pos]==0)return;
    if(ini==fim){
        seg[pos]+=lz[pos];
        lz[pos]=0;
        return;
    }
    seg[pos]+=lz[pos];
    lz[2*pos]+=lz[pos];
    lz[2*pos+1]+=lz[pos];
    lz[pos]=0;
    return;
}

int get(int pos, int ini, int fim, int id){
    refresh(pos,ini,fim);
    if(ini==fim)return seg[pos];
    int m=(ini+fim)/2;
    if(m>=id){
        return get(2*pos,ini,m,id);
    }
    else{
        return get(2*pos+1,m+1,fim,id);
    }
}

int bb(int pos, int ini, int fim, int val){//mais a esquerda <= val
    refresh(pos,ini,fim);
    if(ini==fim)return ini;
    if(seg[pos]>val)return -1;
    int e=2*pos,d=2*pos+1;
    int m=(ini+fim)/2;
    refresh(e,ini,m);
    refresh(d,m+1,fim);
    if(seg[2*pos]<=val)return bb(2*pos,ini,m,val);
    else return bb(2*pos+1,m+1,fim,val);
}
/*
int bbh(int pos, int ini, int fim, int val){//mais a direita>val
    refresh(pos,ini,fim);
    if(ini==fim)return ini;
    int e=2*pos,d=2*pos+1;
    int m=(ini+fim)/2;
    refresh(e,ini,m);
    refresh(d,m+1,fim);
    if(seg[2*pos]>=val)return bb(2*pos+1,m+1,fim,val);
    else return bb(2*pos,ini,m,val);

}
*/
void upd(int pos, int ini, int fim, int l, int r){
    refresh(pos,ini,fim);
    if(ini>r || fim<l)return;
    if(l<=ini && fim<=r){
        lz[pos]++;
        refresh(pos,ini,fim);
        return;
    }
    int m=(ini+fim)/2;

    upd(2*pos,ini,m,l,r);
    upd(2*pos+1,m+1,fim,l,r);
    seg[pos]=min(seg[2*pos],seg[2*pos+1]);
}


void solve() {
    int n;cin>>n;
    vector<int> h(n);
    vector<int> k(n);
    L(i,0,n-1){
        cin>>h[i]>>k[i];
    }
    
    vector<int> ord(n);
    iota(all(ord),0);
    sort(all(ord),[&](int i, int j){
            return h[i]<h[j];
            });

    const int N=1e5+7;

    for(auto id:ord){
        int hat=get(1,1,N,h[id]-k[id]+1);
        int ate=bb(1,1,N,hat-1);
        int d=h[id]-ate+1;
        if(ate==-1){
            d=0;
        }
        else{
            upd(1,1,N,ate,h[id]);
        }
        if(d!=k[id]){
            ate=bb(1,1,N,hat);
            upd(1,1,N,ate,ate+k[id]-d-1);
        }
        //cout<<"\n";
    }
    int resp=0;
    L(i,1,h[ord[n-1]]){
        int x=get(1,1,N,i);
    //    cout<<x<<" ";
        resp+=((x*(x-1))/2);
    }
    cout<<resp<<"\n";

}
 
int32_t main() {
    std::cin.tie(0)->sync_with_stdio(0); 
    std::cin.exceptions(std::cin.failbit);

    int T = 1;
//    std::cin >> T;
    while(T--) {
        solve();
    }

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