天天看點

codeforces 148 div1

A : 假設已經有了i個數了,而且沒有一段連續的區間異或值為0,那麼我們考慮加入第i+1個數有幾種方法,顯然,第 i+1個數不能等于以i結尾的所有連續區間的異或值,這樣的話第i+1 個數就有2^m-(i+1)中取值,注意,0不能選,是以依次相乘即可

B:   将一個數列劃分成兩個數列,要求一個最大的f(i,j) - 最小的f(i,j)的最小值,f(i,j)是這樣定義的:如果i j兩個數在同一個數列中,f(i,j) = i+j,否則f(i,j) = i+ j + h;

如果h = 0,顯然随便怎麼放都是一樣的,否則,我們要使最大值盡可能小,使最小值盡可能大

是以,有兩種放法:一種是全部放到一邊

另一種是 把a1 放到一邊,其他全放到另一邊,這樣就能使得a[i]+a[j]+h的值盡可能的小了(假設a數組已經排好序),想仔細點就簡單了

代碼:http://codeforces.com/contest/238/submission/2509068

C:   樹形DP,點數3000,關鍵是處理兩個點之間的路徑,因為都是從兩個端點出發,是以可以定義這樣的狀态

dp[u][0] : 從u往上走 的最小代價

dp[u][1] : 從u的父親往u走的最小代價

代價指的是u到根的代價

每次兩種決策,水水的轉移

代碼 : http://codeforces.com/contest/238/submission/2505316