1. Good Key, Bad Key
#define int long long
const int maxn = 1e5+10;
int n, k, a[maxn];
void solve(){
cin >> n >> k;
vector<int> dp(n+1, 0);
int mx = 0;
for(int i=1; i<=n; i++){
cin >> a[i];
mx = max(a[i], mx);
dp[i] = dp[i-1]+a[i];
}
int ans = 0;
for(int i=0; i<=n; i++){
int cnt = 2, sum = 0;
for(int j=i+1; j<=n; j++){
sum += a[j]/cnt;
cnt *= 2;
if(cnt > mx) break;
}
ans = max(ans, dp[i]-k*i+sum);
}
cout << ans << endl;
}
2. Three Days Ago
#define int long long
void solve(){
int max_state = 1<<10;
vector<int> dp(max_state, 0);
string s; cin >> s;
int len = s.size(), musk = 0;
dp[0]++;
for(int i=0; i<len; i++){
int now = s[i]-'0';
musk = musk ^ (1<<now);
dp[musk]++;
}
int ans = 0;
for(int i=0; i<max_state; i++){
ans += (dp[i]*(dp[i]-1))/2;
}
cout << ans << endl;
}
3.
vector<string> sta(4), tar(4);
struct Pos{
int xl, yl, xr, yr;
};
struct node{
vector<string> state;
int step;
vector<Pos> path;
node(vector<string> &s, int x){
state = s;
step = x;
}
node(vector<string> &s, int x, vector<Pos> &cpath){
state = s;
step = x;
path = cpath;
}
node(){}
};
map<vector<string>, bool> vis;
pair<int, int> dir[4] = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}};
bool check(int y, int x){
return y>=0 && x>=0 && y<4 && x<4;
}
vector<Pos> ans;
void bfs(){
queue<node> q;
q.push({sta, 0});
while(!q.empty()){
auto [now, step, path] = q.front(); q.pop();
if(now == tar){
ans = path;
break;
}
if(vis[now]) continue;
vis[now] = true;
for(int i=0; i<4; i++){
for(int k=0; k<4; k++){
if(now[i][k] != tar[i][k]){
for(int j=0; j<4; j++){
int ni = i+dir[j].first, nk = k+dir[j].second;
if(check(ni, nk)){
swap(now[i][k], now[ni][nk]);
path.push_back({i, k, ni, nk});
q.push({now, step+1, path});
swap(now[i][k], now[ni][nk]);
path.pop_back();
}
}
}
}
}
}
return;
}
void solve(){
for(int i=0; i<4; i++) cin >> sta[i];
for(int i=0; i<4; i++) cin >> tar[i];
bfs();
int len = ans.size();
cout << len << endl;
for(int i=0; i<len; i++){
cout << ans[i].xl+1 << ans[i].yl+1 << ans[i].xr+1 << ans[i].yr+1 << endl;
}
}
4.
int n, m, dp[1<<20], inf = 1e9+10;
bool tree[20][20];
void solve(){
cin >> n >> m;
for(int i=0; i<m; i++){
int u, v; cin >> u >> v;
tree[u][v] = tree[v][u] = true;
}
int mx = 1<<n;
for(int i=1; i<mx; i++) dp[i] = inf;
for(int i=1; i<mx; i++){
vector<int> ver;
int cnt = 1, x = i;
while(x){
if(x&1) ver.push_back(cnt);
x >>= 1;
cnt++;
}
int len = ver.size();
bool t = true;
for(int i=0; i<len; i++){
for(int k=i+1; k<len; k++){
if(!tree[ver[i]][ver[k]]){
t = false;
goto lable;
}
}
}
lable: ;
if(t) dp[i] = 1;
}
for(int i=1; i<mx; i++){
if(dp[i] == 1) continue;
for(int mask=i; mask; mask=(mask-1)&i){
if(dp[i] > dp[mask]+dp[i^mask]){
dp[i] = dp[mask]+dp[i^mask];
}
}
}
cout << dp[(1<<n)-1] << endl;
}