题目大意:这个题的题目大意不好理解,有n个数,然后向一个数组里填数,首先这个数组arr是空的,有一个R数组和count数组,R[j]的值是从j到n,如果arr[i]为空,i保证最小,那么R[j]=i,如果找不到这样的i,那么R[j]就让他空着。count数组,count[i]表示位置i出现的次数。从1<=t<=n为每个数挑选位置,要求位置count[i]最大,选好后arr[i]=t,注意t从1到n逐渐增大。
题解:这TM绝对是个假的题目,读题20分钟,读完就有了思路,然后就是实现不了,最后才发现真tm水....
先放1,此时的R【】={1,2,3,4,5},count[]={1,1,1,1,1,1}。再放2,如果把1放在3,此时的R【】={1,2,4,4,5},count[]={1,1,0,2,5},那么2一定要放再4这个位置,同理3一定放在5这个位置。如果刚开始我们把1放再5这个位置,R【】={1,2,3,4,x},count[]={1,1,1,1,0},然后2可以随便放。所以我们就可以发现规律了,当把a放在pos时,a+1一定放再pos+1....直到pos>n或者pos这个位置被比它小的数给占用了。
所以我们可以总结为arr[i+1]要么比arr[i]小,要么=arr[i]+1。
code:
#include<bits/stdc++.h> using namespace std; const int N=1e5+7; int arr[N]; void solve(){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>arr[i]; } for(int i=2;i<=n;i++) { if(arr[i]-arr[i-1]>=2) { cout<<"No"<<endl; return ; } } cout<<"Yes"<<endl; } int main(){ int t; cin>>t; while(t--) solve(); return 0; }