linkkkk
题意:
给出
n
n
n,要求将
1
n
1~n
1 n的数放到
n
n
n个位置,问给出的
p
p
p数组能否按照如下规则放置得到。
规则是:
r
r
r数组满足
r
i
>
=
i
r_i>=i
ri>=i并且
r
i
r_i
ri没有被占用,
c
i
c_i
ci表示
r
r
r数组里值为
i
i
i的数的个数。每次选择
c
c
c数组的最大值放置对应的位置放置,如果有多个位置的话,任意选择一个放置。
思路:
模拟一下样例后发现,如果一个元素放在了第
k
k
k个位置,那么下一个元素会放在第
k
+
1
k+1
k+1个位置,因为这时候
c
k
+
1
=
=
2
c_{k+1}==2
ck+1==2。但是如果
k
k
k是数组里最后一个位置呢,那么下一个位置就可以从前面的位置任意选择不受限制了。
用
f
l
a
g
flag
flag表示放置是否受到限制,如果
k
k
k不是最后一个位置,那么下一个位置必须是
k
+
1
k+1
k+1
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10,inf=0x3f3f3f3f;
int n,p[maxn],st[maxn];
int main(){
int _;cin>>_;
while(_--){
cin>>n;
for(int i=1;i<=n;i++) cin>>p[i],st[i]=0;
int las=n,flag=1,flag1=1;
if(p[1]==las){
flag=0;las--;
}
st[p[1]]=1;
for(int i=2;i<=n;i++){
st[p[i]]=1;
if(flag){
if(p[i]!=p[i-1]+1){
flag1=0;break;
}
}
if(p[i]==las){
flag=0;
while(st[las]) las--;
}
else flag=1;
}
if(!flag1) puts("No");
else puts("Yes");
}
return 0;
}