码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 1291B - Array Sharpening

时间:2020-02-03 10:19:08      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:false   注意   array   span   偶数   nbsp   相同   判断   turn   

要锐化一个数组

只需要让他能够满足完全递增、完全递减、先递增后递减即可

因为任意元素都能执行任意次-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\n":"No\n");
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

标签:false   注意   array   span   偶数   nbsp   相同   判断   turn   

原文地址:https://www.cnblogs.com/stelayuri/p/12254447.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!