P9599 [JOI Open 2018] 木琴
别写二分加神秘优化了。
定义
第二种询问能得到的是
枚举
询问次数
const int N=5005;
int a[N],b[N],c[N];
void solve(int n)
{
rep(i,1,n-1) a[i]=query(i,i+1);
c[2]=1;
rep(i,1,n-2)
{
int w=query(i,i+2);
if (w==a[i]+a[i+1]) b[i]=0;
else b[i]=1;
}
rep(i,2,n-1)
{
if (b[i-1]==1) c[i+1]=-c[i];
else c[i+1]=c[i];
}
rep(i,2,n) c[i]*=a[i-1];
rep(i,2,n) c[i]+=c[i-1];
int mnpos=1,mxpos=1;
rep(i,2,n) if (c[i]<c[mnpos]) mnpos=i;
rep(i,2,n) if (c[i]>c[mxpos]) mxpos=i;
if (mxpos<mnpos)
{
rep(i,1,n) c[i]*=-1;
swap(mxpos,mnpos);
}
rep(i,1,n) if (i!=mnpos) c[i]-=c[mnpos];
c[mnpos]=0;
rep(i,1,n) answer(i,c[i]+1);
}