Cf #779 (Div. 2) - C
题目链接
题目大意
这题目题意贼绕
给一个1~n的排列p,根据p做数列b,bi表示p1~pi中的最大值。b数列中不同的数值数量就是排列p的力量。
现在给出数列c,ci表示p向左循环右移i-1位所得到的力量值。问给出的c有没有可能被一种p得到。
思路
观察可知 1 有且只有一个,不符合的可直接判错
通过几组数据模拟可发现,每移动一位 ,下一个力量值最多增加 1 以此判断是否正确
需要注意最后一位也要对第一为进行判断
代码
#include
typedef long long ll;
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
while (T--)
{
int n;
cin >> n;
int s[n+1];
int flag = 0;
for (int i = 0; i < n; i++)
{
cin >> s[i];
if (s[i] == 1)
flag++;
}
s[n]=s[0];
int k = 1;
for (int i = 0; i + 1 <= n; i++)
if (s[i + 1] - s[i] > 1)
{
k = 0;
break;
}
if (k == 1 && flag == 1)
cout << "YES\n";
else
cout << "NO\n";
}
return 0;
}