Submission #598272

#TimeUsernameProblemLanguageResultExecution timeMemory
598272_Avocado_Fancy Fence (CEOI20_fancyfence)C++14
100 / 100
49 ms6656 KiB
#include <bits/stdc++.h>
#define int int64_t
using namespace std;

int mod = 1e9+7;
int ans = 0;

int sum(int n){
	n %= mod;
	return (((n*(n+1)))/2)%mod;
}

int find(int a, auto&par){
	if(a == par[a]) return a;
	return par[a] = find(par[a], par);
}

void unite(int a, int b, int h, auto&par, auto&w){
	a = find(a, par);
	b = find(b, par);
	int minus = (((sum(w[a]) * sum(h))%mod) + (sum(w[b]) * sum(h)))%mod;
	//cout<<"minus "<<minus<<endl;
	ans = (ans + ((sum(w[a] + w[b]) * sum(h))%mod - minus + mod)%mod)%mod;
	
	par[b] = a;
	w[a] = (w[a] + w[b])%mod;
	
}

signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	//ifstream cin ("input.in");
	//ofstream cout ("output.out");
	
	int n; cin>>n;
	vector<pair<int, int>>height(n);
	vector<int>w(n);
	
	for(int i = 0; i<n; ++i){
		int a; cin>>a;
		height[i] = {a, i};
	}
	for(auto&u: w) cin>>u;
	
	for(int i = 0; i<n; ++i){
		ans = (ans + (sum(height[i].first) * sum(w[i]))%mod)%mod;
	}
	//cout<<ans<<endl;
	vector<int>par(n);
	iota(par.begin(), par.end(), 0);
	vector<int>fred(n);
	
	sort(height.begin(), height.end());
	reverse(height.begin(), height.end());
	
	for(int i = 0; i<n; ++i){
		int cur = height[i].second;
		if(cur != 0 && fred[cur-1]) unite(cur, cur-1, height[i].first, par, w);
		if(cur != n-1 && fred[cur+1]) unite(cur, cur+1, height[i].first, par, w);
		fred[cur] = 1;
	}
	cout<<ans;	
	cout<<'\n';
}

Compilation message (stderr)

fancyfence.cpp:13:17: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   13 | int find(int a, auto&par){
      |                 ^~~~
fancyfence.cpp:18:33: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   18 | void unite(int a, int b, int h, auto&par, auto&w){
      |                                 ^~~~
fancyfence.cpp:18:43: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   18 | void unite(int a, int b, int h, auto&par, auto&w){
      |                                           ^~~~
#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...