题解:P16434 [APIO 2026 中国赛区] 蛋糕
Sub3:
考虑构造
从后往前找到第一个比不含这个数的前缀和要小的数,这个数的位置加上
需要
Sub4:
考虑三进制,
考虑三分,动态维护此时
- 若交互库返回了
-1 ,则W 一定在[l+2len,r] 内。 - 若交互库返回了
0 ,则W 一定在[l+len,r-len] 内。 - 若交互库返回了
1 ,则W 一定在[l,r-2len] 内。
std::vector<int> bake_cakes(int N, int W, int K)
{
vector<ll>v;
if(K==30)
{
forl(i,0,29)
v.pb(pw(i));
return v;
}
ll Pw=1;
while(Pw<W)
Pw*=3;
forl(i,1,Pw)
v.pb(i);
return v;
}
#define ask compare_tastiness
ll find_tastiness(int m, int W, int K)
{
if(K==30)
{
vector<ll>v;
forl(i,0,m-2)
v.pb(i);
ll p=m-1;
while(v.size() && ask(v,{p})>=0)
p--,v.pop_back();
p++;
v.clear(),v.pb(p-1);
forr(i,p-2,0)
{
v.pb(i);
if(ask(v,{p})==1)
v.pop_back();
}
ll ans=0;
for(auto i:v)
ans|=pw(i);
return ans;
}
ll L=0,R=m;
while(L+1<R)
{
ll len=(R-L)/3;
ll opt=ask({L,R},{L+len,R-len});
if(opt==-1)
L+=len*2;
else if(opt==0)
L+=len,R-=len;
else
R-=len*2;
}
return L+1;
}