Submission #659450

#TimeUsernameProblemLanguageResultExecution timeMemory
659450LoboFancy Fence (CEOI20_fancyfence)C++17
100 / 100
138 ms17044 KiB
#include<bits/stdc++.h>
using namespace std;
const long long inf = (long long) 1e18 + 10;
const int inf1 = (int) 1e9 + 10;
#define int long long
#define dbl long double
#define endl '\n'
#define sc second
#define fr first
#define mp make_pair
#define pb push_back
#define all(x) x.begin(), x.end()

const int maxn = 1e5+10;
const int mod = 1e9+7;

int n, h[maxn], w[maxn], ps[maxn];
map<int,vector<int>> ed;

int vz(int a, int b) {
    return a*b%mod;
}

void solve() {
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> h[i];
        ed[h[i]].pb(i);
    }
    for(int i = 1; i <= n; i++) {
        cin >> w[i];
        ps[i] = ps[i-1]+w[i]; ps[i]%= mod;
    }
    set<pair<int,int>> st;
    st.insert(mp(1,n));
    int curw = ps[n]*(ps[n]+1)/2; curw%= mod;
    int ant = 0;
    int ans = 0;
    for(auto X : ed) {
        int val = X.fr;
        // l = ant+1 r = val
        int aux = (val-ant)*(val+ant+1)/2;
        aux%= mod;
        curw%= mod;
        ans+= (curw*aux)%mod; ans%= mod;
        ant = val;
        for(auto i : X.sc) {
            auto it = st.upper_bound(mp(i,inf)); it--;
            int l = it->fr;
            int r = it->sc;
            curw-= (ps[r]-ps[l-1])*(ps[r]-ps[l-1]+1)/2; curw%= mod;
            st.erase(it);
            if(i != l) {
                st.insert(mp(l,i-1));
                curw+= (ps[i-1]-ps[l-1])*(ps[i-1]-ps[l-1]+1)/2; curw%= mod;
            }
            if(i != r) {
                st.insert(mp(i+1,r));
                curw+= (ps[r]-ps[i])*(ps[r]-ps[i]+1)/2; curw%= mod;
            }
        }
    }

    ans = (ans+mod)%mod;
    cout << ans << endl;
}

int32_t main() {
    ios::sync_with_stdio(false); cin.tie(0);

    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    int tt = 1;
    // cin >> tt;
    while(tt--) {
        solve();
    }

}
#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...