image

#define ll long long
using namespace std;
int a[600005];
int main() {
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i+n]=a[i];
	}
	int i=1;
	int j=i+1;
	int pos;
	while(i<=n&&j<=n){
		int k;
		for(k=0;a[i+k]==a[j+k];k++);
		if(a[i+k]>a[j+k]){
			i=i+k+1;
		}
		else{
			j=j+k+1;
		}
		if(i==j){
			j++;
		}
	}
	pos=min(i,j);
	for(int i=pos;i<=pos+n-1;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	return 0;
}

每次跳都是k+1,时间复杂度O(n),可以这么跳的原因是试着去模拟手跑一下样例,然后就能发现如果一个一个的移,在过程中就能发现这都是原来判断过的所以没必要