这套题比较简单,以为自己能够独立A掉D和E,或许就能自己A掉F,看来还真是想多了
题意:给一个$n$的全排列,每次操作把$max(a[1],a[2],...,a[i]) = a[i]$的记为$high$,其他记为$low$,然后把$high$的放到最后
问要进行多少次操作可以得到$1,2,...,n$
$n \leq 2*10^5$
反正这种题我永远做不起,即使我推再久也找不到规律
我就不翻译题解了,给一个别人翻译的题解的链接:https://blog.csdn.net/wxh010910/article/details/71305939
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
#define ll long long
#define db double
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
const int maxn=2e5+7;
int n,a[maxn],p[maxn],T[maxn],f[maxn];
char cc;ll ff;
template<typename T>void read(T& aa) {
aa=0;ff=1; cc=getchar();
while(cc!='-'&&(cc<'0'||cc>'9')) cc=getchar();
if(cc=='-') ff=-1,cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
aa*=ff;
}
bool is_cyclic(int a,int b,int c) {
return (a<b&&b<c)||(b<c&&c<a)||(c<a&&a<b);
}
int main() {
read(n);
For(i,1,n) read(a[i]);
For(i,1,n) p[a[i]]=i;
Rep(i,n-1,1) {
if(T[i+1]==0) {
if(p[i]>p[i+1]) T[i]=1,f[i]=i+1;
}
else {
if(is_cyclic(p[f[i+1]],p[i],p[i+1])) T[i]=T[i+1],f[i]=f[i+1];
else T[i]=T[i+1]+1,f[i]=i+1;
}
}
printf("%d\n",T[1]);
return 0;
}