Submission #906432

#TimeUsernameProblemLanguageResultExecution timeMemory
906432NonozeFancy Fence (CEOI20_fancyfence)C++17
73 / 100
25 ms6096 KiB
#include <bits/stdc++.h>

#define int long long
#define sz(x) (int)(x.size())

using namespace std;

const int mod=1000000007;

int MOD(int x) {
	return (x+3*mod)%mod;
}

struct sections {
	int H=0, W=0;
};

int n, k, m;
vector<sections> a;

int section(int h, int w) {
	h%=mod, w%=mod;
	int facteur=MOD((h*(h+1))/2);
	int ans=MOD((w*(w+1))/2);
	return MOD(ans*facteur);
}


int subtask2() {
	int ans=0;
	for (int i=0; i<n; i++) ans=MOD(ans+a[i].W);
	ans=MOD((ans*(ans+1))/2);
	for (int i=0; i<n; i++) {
		if (a[i].H==1) continue;
		ans=MOD(ans+section(1, a[i].W)*2);
	}
	return ans;
}

int subtask4() {
	int L=0;
	for (int i=0; i<n; i++) L+=a[i].W;
	int ans=0;
	for (int i=0; i<n; i++) {
		int sec=section(a[i].H, L);
		if (i) sec-=section(a[i-1].H, L);
		L-=a[i].W;
		ans=MOD(ans+MOD(sec));
	}
	return ans;
}

int subtask5() {
	int ans=0;
	for (int i=0; i<n; i++) {
		int mini=a[i].H;
		int sum=a[i].W;
		ans=MOD(ans+section(a[i].W, a[i].H)); //i=j
		for (int j=i+1; j<n; j++) { //i!=j
			mini=min(mini, a[j].H);
			int res=section(mini, sum); // toute la section entre i et j
			res-=MOD(section(mini, sum-a[i].W)+section(mini, sum-a[j].W)); // j'enlève tous les points qui ne commencent pas
			res=MOD(res);                                             // par j ou par i
			res+=section(mini, sum-a[i].W-a[j].W);                    // je rajoute ce que j'ai enlevé de trop (a+b)^2
			ans=MOD(ans+MOD(res));
		}
	}
	return ans;
}

int solve() {
	cin >> n;
	a.clear();
	a.resize(n);
	bool sub2=true;
	for (auto &u: a) {
		cin >> u.H;
		if (u.H>2) sub2=false;
	}
	for (auto &u: a) {
		cin >> u.W;
	}
	vector<sections> temp;
	for (int i=0; i<n; i++) {
		if (!temp.empty() && a[i].H==temp.back().H) temp.back().W+=a[i].W;
		else temp.push_back(a[i]);
	}
	a.clear();
	a=temp;
	n=a.size();
	if (sub2) return subtask2();
	if (n<=1000) return subtask5();
	return subtask4();
}


signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout << solve() << 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...