Submission #1256358

#TimeUsernameProblemLanguageResultExecution timeMemory
1256358pastaFancy Fence (CEOI20_fancyfence)C++20
0 / 100
1 ms328 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 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.empty() && 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 x = ps[i] - ps[L[i]] + mod;
		x %= mod;
		
		dp[i] = dp[L[i]] + 1ll * C(h[i] + 1) * x % mod;
		ans = ans + 1ll * x % mod * dp[L[i]] % mod;
		ans %= mod;
		ans = ans + 1ll * C(h[i] + 1) * C(x + 1) % mod;
		ans %= mod;
		dp[i] %= mod;
		// cout << dp[i] << ' ';
	}
	// 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...