linkkkk
题意:
给出n,要求将1 n 的数放到n个位置,问给出的p数组能否按照如下规则放置得到。
规则是:r数组满足r i > = i并且r i没有被占用,c i表示r数组里值为i的数的个数。每次选择c数组的最大值放置对应的位置放置,如果有多个位置的话,任意选择一个放置。
思路:
模拟一下样例后发现,如果一个元素放在了第k个位置,那么下一个元素会放在第k + 1个位置,因为这时候c k + 1 = = 2。但是如果k kk是数组里最后一个位置呢,那么下一个位置就可以从前面的位置任意选择不受限制了。
用f l a g表示放置是否受到限制,如果k不是最后一个位置,那么下一个位置必须是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; }