题解:P16434 [APIO 2026 中国赛区] 蛋糕
Sub1 构造
Sub2 构造
Sub3 构造
Sub4 构造
为了方便,把
// Think TWICE, code ONCE
#include <bits/stdc++.h>
#include "cake.h"
#define ll long long
using namespace std;
vector<int> bake_cakes(int N, int W, int K) {
if(K == 1) return {1, 1};
else if(K == 30) {
int i; vector<int> vec;
for(i = 1; i <= W; i <<= 1) vec.emplace_back(i);
return vec;
}
else {
int i, _W = 1;
while(_W < W) _W *= 3;
vector<int> vec; W = _W;
for(i = 1; i <= W; i++) vec.emplace_back(i);
return vec;
}
}
int find_tastiness(int m, int W, int K) {
if(K == 1) return 2 - compare_tastiness({0, 1}, {2});
else if(K == 30) {
int i, j;
for(i = 29; i; i--) {
vector<int> vec;
for(j = 0; j < i; j++) vec.emplace_back(j);
int x = compare_tastiness(vec, {i});
if(x == -1) {
int res = 1 << i, t = i; i--;
for(; i >= 0; i--) {
vec.clear(), res ^= 1 << i;
for(j = 0; j <= 30; j++) if((res >> j) & 1) vec.emplace_back(j);
int y = compare_tastiness(vec, {t + 1});
if(y == 0) return res;
else if(y == 1) res ^= 1 << i;
}
return res;
}
}
return 1;
}
else {
int i, _W = 1, l, r, x, y;
while(_W < W) _W *= 3;
W = _W, l = 1, r = W;
while(l < r - 1) {
x = l + (r - l + 1) / 3, y = x + (r - l + 1) / 3 - 1;
int res = compare_tastiness({x - 1, y}, {l - 1, r});
if(res == 0) l = x, r = y;
else if(res == 1) l = y + 1;
else r = x - 1;
}
return l;
}
}
::::