Submission #1293099

#TimeUsernameProblemLanguageResultExecution timeMemory
1293099vivkostovFancy Fence (CEOI20_fancyfence)C++20
100 / 100
82 ms30196 KiB
#include<bits/stdc++.h>
using namespace std;
void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}
const int maxn=1e9+7;
struct cell
{
    long long int w,ind;
    long long int h;
    bool operator<(const cell&c)const
    {
        if(h!=c.h)return h<c.h;
        return ind<c.ind;
    }
};
long long int n,a[100005],b[100005],dist[100005];
long long int otg,di,raz,um,br;
cell c[100005],p[400005],inf;
void build(int l,int r,int h)
{
    if(l==r)
    {
        p[h]=c[l];
        return;
    }
    int mid=(l+r)/2;
    build(l,mid,h*2);
    build(mid+1,r,h*2+1);
    p[h]=min(p[h*2],p[h*2+1]);
}
void update(int l,int r,int q,int h)
{
    if(l>q||r<q)return;
    if(l==r)
    {
        p[h].h=1e9+1;
        return;
    }
    int mid=(l+r)/2;
    update(l,mid,q,h*2);
    update(mid+1,r,q,h*2+1);
    p[h]=min(p[h*2],p[h*2+1]);
}
cell query(int l,int r,int ql,int qr,int h)
{
    if(l>qr||r<ql)return inf;
    if(l>=ql&&r<=qr)return p[h];
    int mid=(l+r)/2;
    return min(query(l,mid,ql,qr,h*2),query(mid+1,r,ql,qr,h*2+1));
}
void rec(int l,int r,long long int last)
{
    if(l>r)return;
    vector<cell>v;
    v.push_back(query(1,n,l,r,1));
    update(1,n,v[0].ind,1);
    while(true)
    {
        v.push_back(query(1,n,l,r,1));
        if(v.back().h!=v[0].h)
        {
            v.pop_back();
            break;
        }
        update(1,n,v.back().ind,1);
    }
    di=(dist[r]-dist[l-1])%maxn;
    raz=v[0].h-last;
    um=(((di+1)*di)/2)%maxn;
    otg=(otg+((last*((raz*um)%maxn)%maxn)%maxn))%maxn;
    otg=(otg+((um*(((raz*(raz+1))/2)%maxn))%maxn))%maxn;
    //cout<<l<<" "<<r<<" "<<last<<" "<<otg<<endl;
    int prev=l;
    for(int i=0;i<v.size();i++)
    {
        rec(prev,v[i].ind-1,v[0].h);
        prev=v[i].ind+1;
    }
    rec(prev,r,v[0].h);
}
void read()
{
    inf.h=1e9+1;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        c[i].h=a[i];
        c[i].ind=i;
    }
    for(int i=1;i<=n;i++)
    {
        cin>>b[i];
        c[i].w=b[i];
        dist[i]=dist[i-1]+b[i];
        dist[i]%=maxn;
    }
    build(1,n,1);
    rec(1,n,0);
    cout<<otg%maxn<<endl;
}
int main()
{
    speed();
    read();
}
#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...