Submission #936686

#TimeUsernameProblemLanguageResultExecution timeMemory
936686Halym2007Fancy Fence (CEOI20_fancyfence)C++17
73 / 100
68 ms1972 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e5 + 5;
ll h[N], w[N], sum, mod = 1e9 + 7, n, jog, ans;

ll jogap (ll x, ll y) {
	ll a1 = (x * (x + 1)) / 2;
	a1 %= mod;
	ll a2 = y;
	ll a3 = y + 1;
	if (a2 % 2 == 0) a2 /= 2;
	else a3 /= 2;
	a2 %= mod;a3 %= mod;
	a2 *= a3;
	a2 %= mod;
	a1 *= a2;
	a1 %= mod;
	return a1;
}

ll md(ll x){
	return x % mod;
}

int main () {
//	freopen ("input.txt", "r", stdin);
	bool subtask4 = 0, subtask2 = 0;
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> h[i];
		if (i > 1 and h[i] != h[i - 1]) {
			subtask4 = 1;
		} 
		if (h[i] > 2) subtask2 = 1;
	}
	for (int i = 1; i <= n; ++i) {
		cin >> w[i];
		sum += w[i];
	}
	if (n <= 1000) {
		for (int i = 1; i <= n; ++i) {
			jog += jogap (h[i], w[i]);
			jog = md (jog);
			ll mn = h[i];
			for (int j = i - 1; j > 0; j--) {
				ll sum1 = w[i] + w[j];
				mn = min (mn, h[j]);
				ll ans = jogap (mn, sum1) - jogap (mn, w[j]) - jogap (mn, w[i]);
				while (ans < 0) ans += mod;
				jog += ans;
				jog = md (jog);
			}
		}
	}
	else if (!subtask2) {
		ll sum1 = 0;
		for (int i = 1; i <= n; ++i) {
			if(h[i] == 1) {
				if(sum1 > 0) {
					ans = jogap (2, sum1) - jogap(1, sum1);
					while (ans < 0) ans += mod;
					jog += ans;
					jog = md(jog);
				}
				sum1 = 0;
			}
			else {
				sum1 += w[i];
			}
		}
		if(sum1 > 0){
			ans = jogap (2, sum1) - jogap(1, sum1);
			while (ans < 0) ans += mod;
			jog += ans;
			jog = md(jog);
		}
		jog += jogap(1,sum);
		jog = md(jog);
	}
	else if (!subtask4) {
		jog = jogap (h[1], sum);
	}
	else {
		for (int i = 1; i <= n; ++i) {
			ans = jogap (h[i], sum) - jogap (h[i], sum - w[i]);
			while (ans < 0) ans += mod;
			jog += ans;
			jog %= mod;
			sum -= w[i];
		}
	}
	cout << jog;
}
#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...