Submission #1256362

#TimeUsernameProblemLanguageResultExecution timeMemory
1256362pastaFancy Fence (CEOI20_fancyfence)C++20
100 / 100
49 ms2632 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

#define pb push_back


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

int n, L[maxn], dp[maxn], h[maxn], w[maxn], ps[maxn];

int mul(int a, int b) {
	return (1ll * a * b) % mod;
}

int C(int a) {
	return 1ll * a * (a + 1) / 2 % mod;
}
signed main() {
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> h[i];
	for (int i = 1; i <= n; i++)
		cin >> w[i];

	stack<int> st;
	for (int i = 1; i <= n; i++) {
		while (st.size() && h[st.top()] >= h[i])
			st.pop();
		L[i] = 0;
		if (!st.empty())
			L[i] = st.top();
		st.push(i);
	}

	for (int i = 1; i <= n; i++) {
		ps[i] = ps[i - 1] + w[i];
		ps[i] %= mod;
	}

	ll ans = 0;
	dp[0] = 0;
	// cout << L[1] << '\n';
	for (int i = 1; i <= n; i++) {
		ll ln = (ps[i] - ps[L[i]] + mod) % mod;
		ll l1 = (ln - w[i] + mod) % mod;

		
		dp[i] = dp[L[i]] + mul(ln, C(h[i]));
		dp[i] %= mod;


		ll a = 0;

		a += mul(w[i], mul(C(h[i]), l1));
		a %= mod;
		a += mul(C(w[i]), C(h[i]));
		a %= mod;

		ll b = mul(dp[L[i]], w[i]); 

		ans = ans + a + b;
		ans %= mod;
	}
	// cout << '\n';
	cout << ans << '\n';
}
#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...