原题链接.
题意:
假设有三个数组:
a
a
a:n的排列(1-n每个数在数组里出现一次)。
b
b
b:
b
[
i
]
b[i]
b[i]为数组
a
[
1
]
a[1]
a[1] —
a
[
i
]
a[i]
a[i]中最大的那个数。
c
c
c:
c
[
i
]
c[i]
c[i] 为将数组
a
a
a右移
(
i
−
1
)
(i-1)
(i−1)(
a
[
n
]
a[n]
a[n]变成
a
[
1
]
a[1]
a[1])后得到的数组求数组
b
b
b,再计数数组
b
b
b中有几个不同的数。
一个例子:
a
a
a :
4
4
4
3
3
3
2
2
2
1
1
1
5
5
5
6
6
6
b
b
b :
4
4
4
4
4
4
4
4
4
4
4
4
5
5
5
6
6
6
c
c
c :
3
3
3
1
1
1
2
2
2
3
3
3
3
3
3
3
3
3
现在给出数组
c
c
c,问是否存在这样的数组
a
a
a,存在输出
Y
E
S
YES
YES,否则输出
N
O
NO
NO
思路: n n n一定会有一次位于第一位,所以数组 c c c的最小值必须为1,并且其他数不能为1,当 c [ i ] = x c[i]=x c[i]=x时,必须有: c [ i + 1 ] < = x + 1 c[i+1]<=x+1 c[i+1]<=x+1。
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
int t;
int n;
int a[100010];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>t;
while(t--)
{
cin>>n;
int f=-1;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(f==-1||a[f]>a[i])f=i;
}
if(a[f]!=1)
{
cout<<"NO\n";
continue;
}
int p=1;f++;
int flag=1;
for(int i=2;i<=n;i++)
{
if(f>n)f=f-n;
if(a[f]==1||a[f]>p+1)
{
flag=0;
break;
}
p=a[f];
f++;
}
if(flag)cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}