zoukankan      html  css  js  c++  java
  • Codeforces 1291B

    题目大意:

    一个数列是尖锐的

    当且仅当存在一个位置k使得 a[1]<a[2]<a[3]<...<a[k] 且 a[k]>a[k+1]>a[k+2]>...>a[n]

    现在你可以任意让某些严格为正整数的元素执行操作使它们的值 -1 

    问能不能通过这么一系列操作去锐化这个数组(也可以不操作)

    注意,严格递增或者严格递减的数组也是尖锐的(k可以为1或者n)

    解题思路:

    要锐化一个数组

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

    因为任意元素都能执行任意次-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之间这一段无法进行锐化

    #include<bits/stdc++.h>
    using namespace std;
    int ar[300050];
    void solve(){
        int N,i,tmp,pl,pr;
        bool flag=true;
        cin>>N;
        if(N==1)
            cin>>ar[1];
        else if(N==2){
            cin>>ar[1]>>ar[2];
            if(ar[1]+ar[2]==0)
                flag=false;
        }
        else if(N>=3){
            for(i=0;i<N;i++)
                cin>>ar[i];
            for(i=0;i<N;i++)
                if(ar[i]<i){
                    pl=i-1;
                    break;
                }
            if(i==N)
                pl=N-1;
            for(i=N-1;i>=0;i--)
                if(ar[i]<N-i-1){
                    pr=i+1;
                    break;
                }
            if(i==-1)
                pr=0;
            if(pl<pr)
                flag=false;
        }
        cout<<(flag?"Yes
    ":"No
    ");
    }
    int main(){
        ios::sync_with_stdio(0);
        cin.tie(0);cout.tie(0);
        int T;cin>>T;while(T--)
            solve();
        
        return 0;
    }
  • 相关阅读:
    bzoj1625 / P2871 [USACO07DEC]手链Charm Bracelet
    bzoj1623 / P2909 [USACO08OPEN]牛的车Cow Cars
    bzoj1622 / P2908 [USACO08OPEN]文字的力量Word Power
    bzoj1621 / P2907 [USACO08OPEN]农场周围的道路Roads Around The Farm
    bzoj1620 / P2920 [USACO08NOV]时间管理Time Management
    [3.10校内训练赛]
    [bzoj1084][SCOI2005]最大子矩阵
    [bzoj1500][NOI2005]维修数列
    bzoj省选十连测推广赛
    多项式插值学习记录
  • 原文地址:https://www.cnblogs.com/stelayuri/p/12254447.html
Copyright © 2011-2022 走看看