题解:P9599 [JOI Open 2018] 木琴 / Xylophone
比较清新简单的函数式交互,但是题解区一堆乱搞是怎么回事。
本题解尝试展示本题的思维链。
要是我们能求出每个元素比前一个元素大了多少,就可以推出它们的相对大小,但是本题询问只能在询问区间长度为
::::info[符号的定义]
定义:当询问
观察区间极差的性质,当我们可以构造符号时一个区间极差为
问题转化成判断每个
否则,区间
由于序列是排列,因此这两个值是不相等的,我们可以直接通过大区间答案进行判断!
::::info[判断的方法]
当且仅当
接下来,钦定第一个二元组
在询问所有长度为
下面给出一段较短的代码:
int query(int s, int t);
void answer(int i, int a);
int a[5005],s[5005],p,lst,xyl;
void solve(int n){
int mini=1,maxi=1;
s[2]=lst=query(1,2),xyl=1;
if(s[mini]>s[2])mini=2;
if(s[maxi]<s[2])maxi=2;
for(int i=2;i<n;++i){
p=query(i,i+1);
if((p+lst)^query(i-1,i+1))xyl=-xyl;
s[i+1]=s[i]+xyl*p;
if(s[mini]>s[i+1])mini=i+1;
if(s[maxi]<s[i+1])maxi=i+1;
lst=p;
}
if(mini<maxi)for(int i=1;i<=n;++i)answer(i,s[i]+1-s[mini]);
else for(int i=1;i<=n;++i)answer(i,s[maxi]-s[i]+1);
}
/*
巧了,Xylophone 是经典数学中的一个角色,本人特别喜欢 Xylophone,因此很多平台的用户名是 Xylophone,后来随机跳到这题。祭。
*/