Submission #943198

#TimeUsernameProblemLanguageResultExecution timeMemory
943198batsukh2006Fancy Fence (CEOI20_fancyfence)C++17
73 / 100
1034 ms4596 KiB
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<map>
#include<string>
#include<algorithm>
#include<vector>
#include<string.h>
#include<utility>
#include<set>
#include<cmath>
#include<queue>
#include<deque>
#include<functional>
#include<stack>
#include<limits.h>
#include<iomanip>
#include<unordered_map> 
 
using namespace std;
 
#define MOD 1000000007
#define int long long
#define endl '\n'
int cal(int a, int b){
    int f=(a*(a+1))%MOD*((MOD+1)/2)%MOD;
    int s=(b*(b+1))%MOD*((MOD+1)/2)%MOD;
    return (f*s)%MOD;
}
void solve(){
    int n; cin>>n;
    vector<int> h(n+1),w(n+1);
    for(int i=1; i<=n; i++) cin>>h[i];
    for(int i=1; i<=n; i++) cin>>w[i];
    if(n<=1000){
        int ans=0;
        for(int i=1; i<=n; i++){
            int cur=0,mx=h[i];
            ans=(ans+cal(h[i],w[i]))%MOD;
            for(int j=i-1; j>=1; j--){
                mx=min(mx,h[j]);
                cur=(cur+w[j])%MOD;
                ans=(ans-cal(cur,mx)+MOD)%MOD;
                ans=(ans+cal((cur+w[i])%MOD,mx))%MOD;
                ans=(ans+cal((cur-w[j])%MOD,mx))%MOD;
                ans=(ans-cal((w[i]+(cur-w[j])%MOD)%MOD,mx)+MOD)%MOD;
            }
        }
        cout<<ans;
    }else{
        bool war=0;
        for(int i=1; i<n; i++){
            if(h[i]>h[i+1]) war=1;
        }
        if(war==0){
            vector<int> dw(n+2);
            for(int i=n; i>=1; i--) dw[i]=(dw[i+1]+w[i])%MOD;
            stack<int> f;
            f.push(n+1);
            int ans=0;
            for(int i=n; i>=1; i--){
                int pos=i+1;
                while(f.size()>1&&h[f.top()]>=h[i]){
                    f.pop();
                    ans=(ans-cal(dw[pos]-dw[f.top()],h[i])+MOD)%MOD;
                    pos=f.top();
                }
                ans=(ans+cal(dw[i]-dw[f.top()],h[i]))%MOD;
                f.push(i);
            }
            cout<<ans;
        }else{
            int mx=0;
            int ans=0;
            for(int i=1; i<=n; i++) mx=max(mx,h[i]);
            for(int i=1; i<=mx; i++){
                int cur=0;
                for(int j=1; j<=n; j++){
                    if(h[j]>=i) cur=(cur+w[j])%MOD;
                    else{
                        ans=(ans+cal(cur,i))%MOD;
                        ans=(ans-cal(cur,i-1)+MOD)%MOD;
                        cur=0;
                    }
                }
                ans=(ans+cal(cur,i))%MOD;
                ans=(ans-cal(cur,i-1)+MOD)%MOD;
            }
            cout<<ans;
        }
    }
}
signed main(){
	// freopen("hps.in", "r", stdin);
	// freopen("hps.out", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	int t=1;
	// cin>>t;
	while(t--){
		solve();
		cout<<endl;
	}
	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...