B. MEX and Array-codeforces

B. MEX and Array

题目大意:

对一个数组来说,value是将其分成不重复不遗漏的c块,求以下式子的最大值。
$$
c+\sum_{i=1}^{c}mex({b_{l_i}},{b_{l_{i+1}},...,{b_{r_i}}})
$$
现在求一个数列所有子区间的value和。

思路和代码:

这题很简单,只要发现一个一个分组就是最优就可以做了,又数据范围是100,直接n3枚举所有子区间就行。

void solve(){//n3 
	ll n ; cin >> n ;
	vct<ll> a(n + 1 , 0) ;
	
	rep(i , 1 , n) cin >> a[i] ;
	
	ll ans = 0 ;
	rep(L , 1 , n)
	rep(i , 1 , n - L + 1)
	rep(j , i , i + L - 1){
		ans += (a[j] ? 1 : 2) ;
	}
	cout << ans << "\n" ;
	
	
}//code_by_tyrii 

但是如果数据范围再大一点,n3就不行了。所以我想了一个n2的方法。

因为每一个点都是单独分组,那么只要知道每一个点在几个区间里即可。

一开始假设所有点都被L个区间覆盖,再减去左边少几个,减去右边少几个。

void solve2(){
	ll n ; cin >> n ;
	vct<ll> a(n + 1 , 0) ;
	rep(i , 1 , n) cin >> a[i] ;
	
	ll ans = 0 ;
	rep(i , 1 , n)
	rep(L , 1 , n){
		ll num = L ;
		if(i - L < 0) num -= L - i ;
		if(i + L > n) num -= i + L - 1 - n ;
		ans += num * (a[i] ? 1 : 2) ;
	}
	
	cout << ans << "\n" ;
} 
小结:

简单题稍微想想。

posted @ 2022-03-04 15:02  tyrii  阅读(74)  评论(0)    收藏  举报