CF1793B Fedya and Array 题解
下文中我将称 local maximum 为邻域最大数, local minimum 为邻域最小数,很显然邻域最大数大于他两侧的数,邻域最小数小于他两侧的;称
我们来考虑这个数列的结构,不难发现:数列中邻域最大数和邻域最小数交替出现。
证明如下:对于一个邻域最大数
另一种理解方式是将数列图像化,它就是一条波动的折线,波峰和波谷是交替出现的。
根据我们上面的证明,发现,一个领域最大数和领域最小数之间的数是不断上升或者下降的,假设其中某两个相邻的邻域最大数和最小数分别为
由于数列中邻域最大数和邻域最小数交替出现,可以进行一一对应,如果,也就意味着,所有领域最大数的和减去所有领域最小数的和,也就是
由于序列是环状的,所以上升次数和下降次数应该是相等的才能符合要求。
于是假设序列长度为
#include <bits/stdc++.h>
using namespace std;
int Qread()
{
int x=0;bool f=false;char ch=getchar();
while(ch<'0'||ch>'9') f|=('-'==ch),ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=getchar();
return f?-x:x;
}
long long x,y;
long long dis;
long long ans;
void solve()
{
x=Qread(),y=Qread();
dis=x-y;
printf("%lld\n",dis*2);
for(int i=0;i<dis;i++) printf("%lld ",x-i);
for(int i=0;i<dis;i++) printf("%lld ",y+i);
printf("\n");
return;
}
int T;
int main()
{
T=Qread();
while(T--) solve();
return 0;
}