CF 31E 分塊,狀態壓縮

2021-07-05 05:07:17 字數 941 閱讀 2487

題意:輸入乙個n,給你2n個數字,有2個人,每個人從前往後分別從中選出n個數字,使得每個人的獲得的數字的和最大(可能有字首0,在得到的數字中字首0捨去)。

思路:將2n個數字從中間分成前後各n個數字這樣的兩段,分別對兩段狀態壓縮求出每個狀態的和,其中前面這段可以根據每個人拿且必拿n個數字直接算出總和,算出後面段出現cnt0個0和cnt1個1的最大和(還要記錄下狀態。。。),最後直接列舉前面段的狀態,對於每個狀態加上滿足條件的後面的狀態後更新答案,記錄從狀態即可。ps:這種分段的想法很實用,應該牢記

**:

#include 

#define mem(a,b) memset(a,b,sizeof(a))

typedef long long ll;

using namespace std;

const int maxn = 20;

string s;

ll w[20];

ll dp[20][20];

ll ret[2][2][1 << 20];

int cnt0[1 << maxn],cnt1[1 << maxn];

int sumsta;

int n;

ll ans;

ll mark[20][20];

void getit(int now,int st)

ret[now][0][i] = sum[0];

ret[now][1][i] = sum[1];

if(now == 0)

}}void pre()

}int main()

} ll jilu;

for(int i = 0;i < sumsta;i++)

}for(int i = 2 * n - 1;i >= 0;i--)

printf("\n");

}}

CF600E 輕重鏈剖分

傳送門 對於每乙個點x,可以分別進行o n 的搜尋,但這會超時。可以採用樹鏈剖分 輕重鏈剖分 進行優化,對於每個x,長久記錄它的重兒子,每次只搜尋輕兒子,就可以將演算法的複雜度優化到 o nlogn include using namespace std typedef long long ll l...

CF547E 二分 sa 主席樹

這提供乙個sa 主席樹的做法,這個用做法就你順勢可以在敲掉基本一樣的洛谷p4084 題意詢問的是k串在 l,r 的串裡面出現了多少次,不同位置算多次。對於乙個串在sa裡的位置以及和他最像的位置必然是連續的 字典序的原因 然後對於每乙個串就都可以二分出乙個區間,這個區間內的串都有和當前串相同的字首。那...

CF刷題總結 CF706E鍊錶

這題目應該要秒做出來的。首先看到二維,又沒什麼思路就直接降維 考慮一維的情況,就是一段連續的和另一端連續的交換,最快的當然是鍊錶模擬了。所以考慮到二維中也不應該用陣列儲存,而是鍊錶表示。但是由於二維的話,不可能是簡單的鍊錶。所以考慮每乙個矩形和旁邊的關係。肯定就是四周的,但是只考慮單向,那就是2個方...