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" ;
}
小结:
简单题稍微想想。

浙公网安备 33010602011771号