agc014F Strange Sorting

这套题比较简单,以为自己能够独立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;
}

 

posted @ 2018-05-30 15:35  shixinyi  阅读(322)  评论(0编辑  收藏  举报