题意:
给你一个长度为n的排列,i和j之间可以连边当且仅当i>j && p[i]<p[j]。问你这里有多少个连通块。
题解:
第一眼就是并查集,但是并不需要,不如说写了并查集反而比较笨。
对于任意一道题目充分理解它,利用好其中的条件,这道题它既然是排列了,也就是说如果i不在前i个位置,那么它必然能够与前面相连。
那么连到哪里呢?
设mx是前mx个位置的p的最大值,如果mx在前面没有出现过,那么就不会新增一个连通块。否则就会新增一个连通块,就比如2 3 1 5 4.
在第一个位置的时候,mx=2,那么就表示这个连通块至少可以连到2位置,到了2的时候mx为3,也就是说这个连通块至少能连到3.
到了4的时候,mx=3,也就是说需要新增一个联通块了。接下来mx=5表示能够至少连到5.
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int a[N];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
int mx=0,ans=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(mx>=i){
mx=max(mx,a[i]);
continue;
}
mx=a[i];
ans++;
}
printf("%d\n",ans);
}
return 0;
}