Codeforces 1291B - Array Sharpening
Posted stelayuri
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 1291B - Array Sharpening相关的知识,希望对你有一定的参考价值。
要锐化一个数组
只需要让他能够满足完全递增、完全递减、先递增后递减即可
因为任意元素都能执行任意次-1
所以不妨直接化成最直观的答案
即最后化成类似 0 1 2 3 ... 3 2 1 0 的样式
如果数组元素个数为奇数,如上可满足
但是如果为偶数,中间两位不能相同
根据上方的最简样式,可以得到,从前往后一直到k位置,数组是递增的
从后往前看到第k个位置,数组还是递增的
所以不妨去循环判断每一个元素是否满足条件
即从前往后,i=0~n-1,判断每一位是否满足ar[i]>=i
如果不满足,说明从前往后的递增断在了这个位置
用变量pl记录这个位置
从后往前,i=n-1~0,判断每一位是否满足ar[i]>=n-i+1
如果不满足,说明从后往前递增断在了这个位置
用变量pr记录这个位置
(注意完全递增递减的情况下对pl和pr的特殊处理)
最后,判断pl>=pr是否成立,成立则说明数组可以锐化,否则,pl到pr之间这一段无法进行锐化
1 #include<bits/stdc++.h> 2 using namespace std; 3 int ar[300050]; 4 void solve(){ 5 int N,i,tmp,pl,pr; 6 bool flag=true; 7 cin>>N; 8 if(N==1) 9 cin>>ar[1]; 10 else if(N==2){ 11 cin>>ar[1]>>ar[2]; 12 if(ar[1]+ar[2]==0) 13 flag=false; 14 } 15 else if(N>=3){ 16 for(i=0;i<N;i++) 17 cin>>ar[i]; 18 for(i=0;i<N;i++) 19 if(ar[i]<i){ 20 pl=i-1; 21 break; 22 } 23 if(i==N) 24 pl=N-1; 25 for(i=N-1;i>=0;i--) 26 if(ar[i]<N-i-1){ 27 pr=i+1; 28 break; 29 } 30 if(i==-1) 31 pr=0; 32 if(pl<pr) 33 flag=false; 34 } 35 cout<<(flag?"Yes ":"No "); 36 } 37 int main(){ 38 ios::sync_with_stdio(0); 39 cin.tie(0);cout.tie(0); 40 int T;cin>>T;while(T--) 41 solve(); 42 43 return 0; 44 }
以上是关于Codeforces 1291B - Array Sharpening的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces - 1608A Find Array水题
CodeForces 831A Unimodal Array