P7714-solution
思路:双指针
比赛时候看到这个题脑海闪过双指针,测试了几组例子发现都没问题,交了就AC了,说一下思路:
先约定,左指针
从左往右逐个元素进行枚举,
①、如果某个元素值与下标相同,代表该元素处于正确的位置,左指针
②、不同则代表该元素处于不正确的位置,此时左指针
最终时间复杂度为
代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[1000005];
int main()
{
int T;
cin >> T;
while (T--)
{
int n, ans = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
int i = 1;
while (i <= n)
{
if (a[i] == i) // 相同
i++;
else // 不同
{
int maxv = a[i];
int j = i + 1;
maxv = max(maxv, a[j]);
while (maxv > j)
{
j++;
maxv = max(maxv, a[j]);
}
ans += j - i + 1;
i = j + 1;
}
}
cout << ans << endl;
}
return 0;
}