제출 #1353511

#제출 시각아이디문제언어결과실행 시간메모리
1353511NewtonabcSails (IOI07_sails)C++20
100 / 100
139 ms5852 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
mt19937 mt(time(NULL));
struct node{
    int val,sz,add,pri;
    node *l,*r;
};
node *init(int key){
    node *t=new node;
    *t={key,1,0,(int)mt(),0,0};
    return t;
}
int sz(node *t){if(!t) return 0; return t->sz;}
void upd(node *t){if(!t) return; t->sz=sz(t->l)+sz(t->r)+1;}
void push(node *t){
    if(!t) return;
    if(t->add==0) return;
    if(t->l) (t->l)->add+=t->add;
    if(t->r) (t->r)->add+=t->add;
    t->val+=t->add;
    t->add=0;
}
void merge(node *&t,node *l,node *r){
    if(!l) return void(t=r);
    if(!r) return void(t=l);
    push(l),push(r);
    if(l->pri>r->pri) merge(l->r,l->r,r),t=l;
    else merge(r->l,l,r->l),t=r;
    upd(t);
}
void splitv(node *t,node *&l,node *&r,int k){
    if(!t) return void(l=r=NULL);
    push(t);
    if(t->val<=k) splitv(t->r,t->r,r,k),l=t;
    else splitv(t->l,l,t->l,k),r=t;
    upd(t);
}
void splits(node *t,node *&l,node *&r,int k){
    if(!t) return void(l=r=NULL);
    push(t);
    if(sz(t->l)+1<=k) splits(t->r,t->r,r,k-sz(t->l)-1),l=t;
    else splits(t->l,l,t->l,k),r=t;
    upd(t);
}
int fmn(node *t){
    push(t);
    if(t->l) return fmn(t->l);
    return t->val;
}
int fmx(node *t){
    push(t);
    if(t->r) return fmx(t->r);
    return t->val;
}
ll fsum(node *t){
    ll ret=0;
    if(!t) return 0;
    push(t);
    ret=(ll)(t->val)*(ll)(t->val);
    ret+=fsum(t->l)+fsum(t->r);
    return ret;
}
void deb(node *t){
    push(t);
    if(t->l) deb(t->l);
    cout<<t->val <<" ";
    if(t->r) deb(t->r);
}
int main(){
    int n; cin>>n;
    ll s=0;
    vector<pair<int,int>> v;
    for(int i=0;i<n;i++){
        int h,k; cin>>h >>k;
        v.push_back({h,k});
        s+=(ll)k;
    }
    int ti=0;
    sort(v.begin(),v.end());
    node *t=NULL;
    for(auto [h,k]:v){
        while(ti<h){
            ti++;
            node *tmp=init(0);
            merge(t,tmp,t);
        }
        node *l,*r;
        splits(t,l,r,k);
        // cout<<"hi";
        // deb(l);
        // cout<<"\n";
        // cout<<"hello";
        // deb(r);
        // cout<<"\n";
        l->add++;
        if(r==0){
            merge(t,l,r);
            continue;
        }
        int mn=fmn(r),mx=fmx(l);
        if(mx<=mn){
            merge(t,l,r);
            continue;
        }
        //cout<<"gotmn" <<mn <<"\n";
        node *tl,*tr;
        splitv(l,tl,tr,mn);
        merge(t,tl,r);
        mn=fmn(tr);
        splitv(t,l,r,mn);
        merge(t,l,tr);
        merge(t,t,r);
        // cout<<"end ";
        // deb(t);
        // cout<<"\n";
    }
    //deb(t);
    //cout<<"\n";
    ll sum=0;
    sum=fsum(t);
    cout<<(sum-s)/2LL;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…