Submission #938629

#TimeUsernameProblemLanguageResultExecution timeMemory
938629dubabubaFancy Fence (CEOI20_fancyfence)C++14
15 / 100
316 ms10868 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
typedef pair<int, int> pii;
#define ff first
#define ss second
#define MP make_pair

const int mxn = 1e5 + 9;
const int mod = 1e9 + 7;
int a[mxn], b[mxn], p[mxn], n;
vector<pii> q;
set<int> s;

int mult(int a, int b) {
	a %= mod;
	b %= mod;
	if(a < b) swap(a, b);
	if(b == 0) return 0;
	if(b == 1) return a;
	int t = mult(a, b / 2);
	if(b % 2 == 0) return (t + t) % mod;
	return ((t + t) % mod + a) % mod;
}

int C2(int a) {
	if(a & 1) return mult(a, (a + 1) / 2);
	return mult(a / 2, a + 1);
}

signed main() {
	cin >> n;
	for(int i = 2; i <= n + 1; i++) {
		cin >> a[i];
		q.push_back(MP(a[i], i));
	}
	for(int i = 2; i <= n + 1; i++) {
		cin >> b[i];
		p[i] = p[i - 1] + b[i];
	}

	int ans = 0;
	for(int i = 2; i <= n + 1; i++) {
		int d = mult(C2(a[i]), C2(b[i]));
		ans = (ans + d) % mod;
	}

	q.push_back(MP(0, 1));
	q.push_back(MP(0, n + 2));
	sort(q.begin(), q.end());
	int t = 0;

	for(pii p : q) {
		int H = p.ff;
		int r = p.ss;
		while(t < q.size() && q[t].ff < H) {
			s.insert(-q[t].ss);
			t++;
		}
		auto it = s.upper_bound(-r);
		if(it == s.end()) continue;
		int l = -(*it);
		int W = ::p[r - 1] - ::p[l];
		int d = mult(mult(W, b[r]), C2(H));
		// cout << l << ' ' << r << ": " << d << endl;
		ans = (ans + d) % mod;
	}

	s.clear();
	t = 0;
	for(pii p : q) {
		int H = p.ff;
		int l = p.ss;
		while(t < q.size() && q[t].ff <= H) {
			s.insert(q[t].ss);
			t++;
		}
		auto it = s.upper_bound(l);
		if(it == s.end()) continue;
		int r = (*it);
		int W = ::p[r - 1] - ::p[l];
		// cout << l << ' ' << r << endl;
		int d = mult(mult(W, b[l]), C2(H));
		ans = (ans + d) % mod;
	}

	cout << ans << endl;
	return 0;
}

Compilation message (stderr)

fancyfence.cpp: In function 'int main()':
fancyfence.cpp:57:11: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |   while(t < q.size() && q[t].ff < H) {
      |         ~~^~~~~~~~~~
fancyfence.cpp:75:11: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |   while(t < q.size() && q[t].ff <= H) {
      |         ~~^~~~~~~~~~
#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...