题目大意
构造一个长度为 \(n\) 的排列 \(p\),使得 \(p_{[1,{\frac{n}{2}}]}\) 中的最小值为 \(a\),使得 \(p_{[{\frac{n}{2}} + 1, n]}\) 中的最大值为 \(b\)。
如果没有合法的排列,输出 \(-1\)。
题目分析
将答案序列存到 \(ans\) 数组中,令 \(m=\dfrac{n}{2}\)。
让 \(ans[1]=a,ans[m+1]=b\),随后我们只需要在 \(2\sim m\) 和 \(m+1\sim n\) 中填入数字即可。
填的时候注意不要重复,可以采取倒序的方式填,如果当前填的数与 \(a\) 或 \(b\) 相等那么不能填,再将数减一。
最后扫一遍序列,如果 \(\min\limits_{i=1}^{m}\{ans[i]\}\neq a,\max\limits_{i=m+1}^n\{ans[i]\}\neq b\) 表示不满条件。
代码
//2022/1/9
using namespace std;
const int INF=0x3f3f3f3f;
const int ma=105;
int ans[ma];
int T,n,a,b;
inline void solve()
{
n=read(),a=read(),b=read();
int m=n/2;
mst(ans,0);
ans[1]=a,ans[m+1]=b;
int num=n+1;
for(register int i=1;i<=n;i++)
{
if(ans[i]==0)
{
num--;
while(num==a || num==b)
{
num--;
}
ans[i]=num;
}
}
int minn=INF,maxx=-INF;
for(register int i=1;i<=n;i++)
{
if(i<=m)
{
minn=min(minn,ans[i]);
}
else
{
maxx=max(maxx,ans[i]);
}
}
if(minn!=a || maxx!=b)
{
puts("-1");
}
else
{
blow(ans,1,n," ");
enter();
}
}
int main(void)
{
T=read();
while(T--)
{
solve();
}
return 0;
}