Submission #881498

#TimeUsernameProblemLanguageResultExecution timeMemory
881498ArshiFancy Fence (CEOI20_fancyfence)C++17
100 / 100
26 ms9084 KiB
/**********************GOD**********************/

#include <iostream>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <iterator>
#include <map>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<ll , ll> pll;

#define len                 length()
#define MP                  make_pair
#define fs                  first
#define sc                  second
#define pb                  push_back
#define all(x)              x.begin() , x.end()
#define kill(x)             cout << x , exit(0)

const ll mod = 1e9 + 7;
const int MXN = 2e5 + 4;

ll n, ans;

ll h[MXN], w[MXN], ps[MXN];
ll l[MXN], r[MXN];

ll C(ll x)
{
    ll y = x * (x - 1) / 2;
    return y % mod;
}

ll Sm(ll a, ll b)
{
    return (ps[b] - ps[a] + mod) % mod;
}

int main()
{
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    
    cin >> n;
    for(ll i = 1; i <= n; i ++)
        cin >> h[i];
    for(ll i = 1; i <= n; i ++) {
        cin >> w[i];
        ps[i] = (ps[i - 1] + w[i]) % mod;
    }
    ps[n + 1] = ps[n];

    stack<ll> cnd; cnd.push(0);
    for(ll i = 1; i <= n; i ++) {
        while(cnd.size() && h[i] < h[cnd.top()])
            cnd.pop();
        if(cnd.size())
            l[i] = cnd.top();
        cnd.push(i);
    }
    stack<ll> cdn; cdn.push(0);
    for(ll i = n; i > 0; i --) {
        while(cdn.size() && h[i] <= h[cdn.top()])
            cdn.pop();
        if(cdn.size())
            r[i] = cdn.top();
        cdn.push(i);
    }
    for(ll i = 1; i <= n; i ++)
        if(!r[i])
            r[i] = n + 1;

    for(ll i = 1; i <= n; i ++) {
        ll hs = C(h[i] + 1);
        ll x = (Sm(i, r[i] - 1) + 1) % mod;
        ll y = (Sm(l[i], i - 1) + 1) % mod;
        ll tmp = x * y % mod;
        ll z = (w[i] - 1) * x % mod;
        ll t = (w[i] - 1) * y % mod;
        ll o = C(w[i] - 1);
        tmp = (tmp + z + t + o) % mod;
        ans = (ans + tmp * hs % mod) % mod;
        //cout << i << ' ' << x << '\n';
    }

    cout << ans;

    return 0;
}

/*!
ahkh
*/
#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...