제출 #405227

#제출 시각아이디문제언어결과실행 시간메모리
405227varungoyalbitsFancy Fence (CEOI20_fancyfence)C++17
100 / 100
37 ms3472 KiB
/*
Problem Link:https://oj.uz/problem/view/CEOI20_fancyfence
Author: varungoyalbits
*/
#include <bits/stdc++.h>
using namespace std;
long long sumTillN(const long long N,const long long mod)
{
    return ((N*(N+1))/2)%mod;
}
long long subTask6()
{
    int n;
    cin>>n;
    vector<long long>h(n);
    vector<long long>w(n);
    long long mod=1e9+7;
    for(int i=0;i<n;i++)
    {
        cin>>h[i];
    }
    for(int i=0;i<n;i++)
    {
        cin>>w[i];
    }
    long long ans=0;
    for(int i=0;i<n;i++)
    {
        long long val=sumTillN(h[i],mod);
        val=(val*sumTillN(w[i],mod))%mod;
        ans=(ans+val)%mod;
        long long mn=h[i];
        for(int j=i-1;j>=0;j--)
        {
            mn=min(mn,h[j]);
            val=sumTillN(mn,mod);
            val=(val*((w[i]*w[j])%mod))%mod;
            ans=(ans+val)%mod;
        }
    }
    return ans;
}
long long sol()
{
    int n;
    cin>>n;
    vector<long long>h(n);
    vector<long long>w(n);
    vector<long long>w2(n);
    vector<int>left(n,-1);
    vector<int>right(n,n);
    long long mod=1e9+7;
    for(int i=0;i<n;i++)
    {
        cin>>h[i];
    }
    for(int i=0;i<n;i++)
    {
        cin>>w[i];
    }
    w2[0]=w[0];
    for(int i=1;i<n;i++)
    {
        w2[i]=(w2[i-1]+w[i])%mod;
    }
    for(int i=0;i<n;i++)
    {
        int ind=i-1;
        while(ind>=0&&h[ind]>=h[i])
        {
            ind=left[ind];
        }
        left[i]=ind;
    }
    for(int i=n-1;i>=0;i--)
    {
        int ind=i+1;
        while(ind<n&&h[ind]>h[i])
        {
            ind=right[ind];
        }
        right[i]=ind;
    }
    long long ans=0;
    for(int i=0;i<n;i++)
    {
        long long val=sumTillN(h[i],mod);
        val=(val*sumTillN(w[i],mod))%mod;
        ans=(ans+val)%mod;
    }
    //cout<<"ans: "<<ans<<endl;
    for(int i=0;i<n;i++)
    {
        int l=left[i];
        int r=right[i];
        //[l+1,i-1]
        //[i+1,r-1]
        //cout<<"l: "<<l+1<<" r: "<<r-1<<" i: "<<i<<endl;
        long long sumLeft=0;
        long long sumRight=0;
        if(l>=0&&i-1>=0)
        {
            sumLeft=w2[i-1]-w2[l];
        }
        else if(i-1>=0)
        {
            sumLeft=w2[i-1];
        }
        //cout<<"sumLeft: "<<sumLeft<<endl;

        if(r-1<=n-1)
        {
            sumRight=w2[r-1]-w2[i];
        }
        //cout<<"sumRight: "<<sumRight<<endl;
        sumLeft+=mod;
        sumLeft%=mod;
        sumRight+=mod;
        sumRight%=mod;
        long long totSum=(sumLeft+sumRight)%mod;
        long long val=sumTillN(h[i],mod);
        long long val2=(sumLeft*sumRight)%mod;
        long long val3=(w[i]*totSum)%mod;
        val2=(val2+val3)%mod;
        val=(val*val2)%mod;
        //cout<<"val: "<<val<<endl;
        ans=(ans+val)%mod;
        //cout<<"ans: "<<ans<<endl;
    }
    return ans;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    //cout<<subTask6()<<"\n";
    cout<<sol()<<"\n";
    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...