Submission #1171434

#TimeUsernameProblemLanguageResultExecution timeMemory
1171434danglayloi1Fancy Fence (CEOI20_fancyfence)C++20
73 / 100
1095 ms3180 KiB
#include <bits/stdc++.h>
#define ii pair<int, int>
#define fi first
#define se second
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
using ll = long long;
const ll mod=1e9+7;
const int nx=1e5+5;
ll add(ll a, ll b)
{
    a+=b;
    if(a>=mod) a-=mod;
    return a;
}
ll mul(ll a, ll b)
{
    a*=b;
    if(a>=mod) a%=mod;
    return a;
}
ll del(ll a, ll b)
{
    a-=b;
    if(a<0) a+=mod;
    return a;
}
ll pw(ll a, ll n)
{
    if(!n) return 1;
    ll tmp=pw(a, n>>1);
    tmp=mul(tmp, tmp);
    if(n&1) tmp=mul(tmp, a);
    return tmp;
}
ll base;
ll get(ll l, ll r)
{
    return mul(mul(add(l, r), (r-l+1+mod)%mod), base);
}
int n, r[nx];
ll h[nx], w[nx], ans=0, pre[nx];
int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    base=pw(2, mod-2);
    cin>>n;
    for(int i = 1; i <= n; i++)
        cin>>h[i];
    for(int i = 1; i <= n; i++)
        cin>>w[i], pre[i]=add(pre[i-1], w[i]);
    for(int i = n; i >= 1; i--)
    {
        r[i]=i+1;
        while(r[i]<=n && h[r[i]]>=h[i])
            r[i]=r[r[i]];
    }
    for(int i = 1; i <= n; i++)
    {
        int pos=r[i];
        ll hei=h[i];
        while(true)
        {
            ll len=del(pre[pos-1], pre[i-1]);
            ans=add(ans, mul(get(del(len, w[i]-1), len), get(h[pos]+1, hei)));
            if(pos>n) break;
            hei=h[pos];
            pos=r[pos];
        }
    }
    cout<<ans;
}
#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...