Submission #1091679

#TimeUsernameProblemLanguageResultExecution timeMemory
1091679ASN49KSafety (NOI18_safety)C++14
100 / 100
291 ms21076 KiB
#include <bits/stdc++.h>
using namespace std;
using i64=long long;
#define UNUSED -1
#define all(x) x.begin(),x.end()
#define pb push_back
const int mod=1e9+7,inf=1e9+1;
const int N=2e5;
mt19937 rng(69);
struct node
{
    i64 key;
    int pri,cnt;
    i64 lazy;
    node* l,* r;

    node(int key)
    {
        this->key=key;
        pri=rng();
        cnt=1;
        lazy=0;
        l=r=nullptr;
    }
    void add(int x)
    {
        key+=x;
        lazy+=x;
    }
    void push_down()
    {
        if(l!=nullptr)l->add(lazy);
        if(r!=nullptr)r->add(lazy);
        lazy=0;
    }
};
int count(node* t)
{
    if(t==nullptr)
    {
        return 0;
    }
    return t->cnt;
}
void recalc(node* t)
{
    t->cnt=count(t->l)+count(t->r)+1;
}

void split(node* t,node*& l,node*& r,int cnt)
{
    if(t==nullptr)
    {
        l=r=nullptr;
        return;
    }
    t->push_down();
    if(count(t->l)+1<=cnt)
    {
        split(t->r,t->r,r,cnt-count(t->l)-1);
        l=t;
    }
    else
    {
        split(t->l,l,t->l,cnt);
        r=t;
    }
    recalc(t);
}

void split_key(node* t,node*& l,node*& r,int key)
{
    if(t==nullptr)
    {
        l=r=nullptr;
        return;
    }
    t->push_down();
    if(t->key<=key)
    {
        split_key(t->r,t->r,r,key);
        l=t;
    }
    else
    {
        split_key(t->l,l,t->l,key);
        r=t;
    }
    recalc(t);
}


void merge(node*& t,node* l,node* r)
{
    if(l==nullptr)
    {
        t=r;
        return;
    }
    if(r==nullptr)
    {
        t=l;
        return;
    }
    l->push_down();
    r->push_down();
    if(l->pri >= r->pri)
    {
        merge(l->r,l->r,r);
        t=l;
    }
    else
    {
        merge(r->l,l,r->l);
        t=r;
    }
    recalc(t);
}

int leftest(node*& t)
{
    if(t->l==nullptr)
    {
        return t->key;
    }
    t->push_down();
    return leftest(t->l);
}
int rightest(node*& t)
{
    if(t->r==nullptr)
    {
        return t->key;
    }
    t->push_down();
    return rightest(t->r);
}
void print(node* t)
{
    if(t==nullptr)
    {
        return;
    }
    t->push_down();
    print(t->l);
    cout<<t->key<<' ';
    print(t->r);
}
int n,h;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>h;
    node* root=nullptr;
    i64 rez=0;
    int last_l=0,last_r=0;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        if(i!=1)
        {
            rez+=max(last_l-x , 0);
            rez+=max(x-last_r , 0);
        }
        node *l,*r;
        split_key(root,l,r,x);

        merge(l,l,new node(x));
        merge(l,l,new node(x));
        merge(root,l,r);
        split(root,l,r,i);
        assert(l!=nullptr);
        assert(r!=nullptr);
        l->add(-h);
        r->add(h);
        last_l=rightest(l),last_r=leftest(r);
        merge(root,l,r);

    }
    cout<<rez;
}
#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...