题面如下:
思路 or 题解
我们可以发现:
只有连续相等的才可以进行互换,从而得到有解情况
所有我们只需要对连续相等的进行处理
如果该局部连续相等的数量
≥
2
\ge2
≥2 提供旋转一下就可以
旋转的含义:1 2 3 4 5 变成 2 3 4 5 1
如果该局部连续相等的数量
=
=
1
==1
==1 一定无解输出
−
1
-1
−1 结束程序
AC代码一 (个人版本):
const int N = 100009;
int n, s[N];
void solve()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> s[i];
if (n == 1)
{
cout << -1 << '\n';
return;
}
int l = -1, r;
vector<int> ans;
for (int i = 1; i <= n; i++)
{
if (l == -1)
{
l = i;
r = i;
continue;
}
if (s[l] == s[i])
r++;
else
{
if (l == r)
{
cout << -1 << '\n';
return;
}
for (int k = l; k < r; k++)
ans.push_back(k + 1);
ans.push_back(l);
l = i, r = i;
}
}
if (l == r)
{
cout << -1 << '\n';
return ;
}
if (l != n)
{
for (int k = l; k < r; k++)
ans.push_back(k + 1);
ans.push_back(l);
}
for (auto it : ans)
cout << it << ' ';
cout << '\n';
}
int main()
{
buff;
int _;
cin >> _;
while (_--)
solve();
}
/*
5
3 3 4 4 10
*/
AC代码二 (学jiangly版本)
更加简洁,下面是本人的学习版本
const int N = 100009;
int n;
void solve()
{
cin >> n;
vector<int> p(n + 1), s(n + 1);
iota(p.begin(), p.end(), 1);
for (int i = 0; i < n; i++)
cin >> s[i];
for (int i = 0; i < n; i++)
{
int r = i;
while (r < n && s[i] == s[r])
r++;
if (r - i == 1)
{
cout << -1 << '\n';
return ;
}
rotate(p.begin() + i, p.begin() + i + 1, p.begin() + r);
i = r - 1;
}
for (int i = 0; i < n; i++)
cout << p[i] << " \n"[i == n - 1];
}
int main()
{
buff;
int _;
cin >> _;
while (_--)
solve();
}