题意:
思路:
首先它是个排列,要我们维护连通分量的数量
肯定不能直接建图,复杂度太大,那怎么间接地维护连通块个数呢
我们去维护每一个连通块的代表元素即可
如果第i个位置出现x使得x和前面一些元素组成连通块,那么就需要在栈里删除前缀那些大于x的值,并用x代替
因此可以使用单调栈维护每一个连通分量的代表元素
答案就是栈的大小
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mxn=1e5+10;
stack<int> S;
int n;
int a[mxn];
void solve(){
while(!S.empty()) S.pop();
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
if(S.empty()||S.top()<a[i]) S.push(a[i]);
else{
int mx=S.top();
while(!S.empty()&&S.top()>a[i]) S.pop();
S.push(mx);
}
}
cout<<S.size()<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;cin>>__;
while(__--)solve();return 0;
}