有一個隨機全排列生成器,給出你一個全排列,讓判斷是否能夠經過這個生成器產生。c++
生成器工做方式:spa
第i步爲數字i尋找位置pos。code
首先pos是一個空位置,定義每一個空位置的價值爲左邊連續有數字的位置數,會爲數字i在價值最大的一個或者多個位置中選擇一個位置。blog
好比上圖,第三個位置的值是2,第4個位置的值是0,這時4就選擇了第3個位置。get
寫一下就會發現,這個生成器生成的全排列是有規律的。generator
n的全排列it
x+y+1 x+y+2.....n x+1 x+2... x+y 1 2 3 4.......x
ast
能夠知道若是當前位小於後一位,必定是小1。若是有不是小1的,就說明不能經過生成器生成class
#include<bits/stdc++.h> #define pb push_back using namespace std; typedef long long ll; const int N=2e5+10; const int mod=1e9+7; const int inf=0x3f3f3f3f; int arr[N],vis[N]; int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&arr[i]); int flag=0; for(int i=n;i>1;i--) { if(arr[i]>arr[i-1]) { if(arr[i]-arr[i-1]!=1) { flag=1; break; } } } if(flag) printf("No\n"); else printf("Yes\n"); } return 0; }