这套题比较简单,以为自己能够独立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 ",T[1]); return 0; }