題意:輸入乙個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個方...