1. 程式人生 > 其它 >B. MEX and Array-codeforces

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" ;
} 
小結:

簡單題稍微想想。