题意:
给一个1~n的排列p,根据p做数列b,bi表示p1~pi中的最大值。b数列中不同的数值数量就是排列p的力量。
现在给出数列c,ci表示p向左循环右移i-1位所得到的力量值。问给出的c有没有可能被一种p得到。
思路:首先易知肯定有且仅有一个1,由于序列是环的,所以可以将c转化成以1开始的序列,每次变化增量最多为1.
/*keep on going and never give up*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
typedef pair<int, int> pii;
#define int long long
#define lowbit(x) x&(-x)
#define endl '\n'
#define wk is zqx ta die
int c[100005];
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
int ok = -1;
int cnt = 0;
for (int i = 0; i < n; i++) {
cin >> c[i];
cnt += (c[i] == 1);
if (c[i] == 1 && ok == -1) {
ok = i;
}
}
if (ok == -1) {
cout << "no" << endl;
continue;
}
if (cnt > 1) {
cout << "no" << endl;
continue;
}
bool pl = 0;
for (int i = 1; i < n; i++) {
if (c[(i + ok) % n] > c[(i + ok - 1) % n] + 1) {
pl = 1;
break;
}
}
if (pl == 1) {
cout << "no" << endl;
} else {
cout << "yes" << endl;
}
}
return 0;
}