A. Reverse
题意:给你一个排列和一次反转区间的操作,问操作后的最小字典序排列
做法:枚举找到第一个和编号不符的位置,然后再找到这个编号的位置,然后反转这个区间即可
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) cin >> a[i];
if (is_sorted(a.begin(), a.end()))
for (int i = 1; i <= n; i++)
cout << i << " ";
else {
int l, r;
for (int i = 0; i < n; i++)
if (a[i] != i + 1)
{
l = i;
break;
}
for (int i = l; i < n; i++)
if (a[i] == l + 1)
{
r = i;
break;
}
reverse(a.begin() + l, a.begin() + r + 1);
for (int i = 0; i < n; i++)
cout << a[i] << " ";
}
cout << endl ;
}
return 0;
}
B. Odd Swap Sort
题意:给你一组数,如果当前数和下一个数相加为奇数,就可以交换位置,问无数次操作后能不能排好序
做法:判断这一组数中的奇数和偶数是否都升序即可,因为奇数和奇数、偶数和偶数之间不能改变相对位置
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
vector<int> odd, even;
for (int i = 0; i< n; i++)
{
int x;
cin >> x;
if (x & 1) odd.push_back(x);
else even.push_back(x);
}
if (is_sorted(odd.begin(), odd.end()) && is_sorted(even.begin(), even.end())) puts("YES");
else puts("NO");
}
return 0;
}
C. Inversion Graph
题意:存在前面的数比后面的数大,则他们之间连通,问最后的连通块个数
做法:如果当前数比前面数最大值还要大,且前面最大值为位置编号减一,则有一个连通块
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
int m = 0, ans = 0;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
if (x > m)
{
if (m == i - 1) ans++;
m = x;
}
}
cout << ans << endl ;
}
return 0;
}