B. MEX and Array-codeforces
阿新 • • 發佈:2022-03-04
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" ; }
小結:
簡單題稍微想想。