题目大意:

一个数列是尖锐的

当且仅当存在一个位置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[];
void solve(){
int N,i,tmp,pl,pr;
bool flag=true;
cin>>N;
if(N==)
cin>>ar[];
else if(N==){
cin>>ar[]>>ar[];
if(ar[]+ar[]==)
flag=false;
}
else if(N>=){
for(i=;i<N;i++)
cin>>ar[i];
for(i=;i<N;i++)
if(ar[i]<i){
pl=i-;
break;
}
if(i==N)
pl=N-;
for(i=N-;i>=;i--)
if(ar[i]<N-i-){
pr=i+;
break;
}
if(i==-)
pr=;
if(pl<pr)
flag=false;
}
cout<<(flag?"Yes\n":"No\n");
}
int main(){
ios::sync_with_stdio();
cin.tie();cout.tie();
int T;cin>>T;while(T--)
solve(); return ;
}

Codeforces 1291B - Array Sharpening的更多相关文章

  1. Codeforces Round #616 (Div. 2) B. Array Sharpening

    t题目链接:http://codeforces.com/contest/1291/problem/B 思路: 用极端的情况去考虑问题,会变得很简单. 无论是单调递增,单调递减,或者中间高两边低的情况都 ...

  2. Codeforces 797E - Array Queries

    E. Array Queries 题目链接:http://codeforces.com/problemset/problem/797/E time limit per test 2 seconds m ...

  3. Codeforces 1108E2 Array and Segments (Hard version) 差分, 暴力

    Codeforces 1108E2 E2. Array and Segments (Hard version) Description: The only difference between eas ...

  4. CodeForces 300A Array

    http://codeforces.com/problemset/problem/300/A 题意 :给你n个数字,让你分成3组,第一组各个数之积要小于0,第二组要大于0,第三组要等于0,符合要求的答 ...

  5. 网络流(最大流):CodeForces 499E Array and Operations

    You have written on a piece of paper an array of n positive integers a[1], a[2], ..., a[n] and m goo ...

  6. Codeforces 1108E2 Array and Segments (Hard version)(差分+思维)

    题目链接:Array and Segments (Hard version) 题意:给定一个长度为n的序列,m个区间,从m个区间内选择一些区间内的数都减一,使得整个序列的最大值减最小值最大. 题解:利 ...

  7. Codeforces 623B Array GCD

    Array GCD 最后的序列里肯定有a[1], a[1]-1, a[1]+1, a[n], a[n]-1, a[n]+1中的一个,枚举质因子, dp去check #include<bits/s ...

  8. CodeForces 57C Array 组合计数+逆元

    题目链接: http://codeforces.com/problemset/problem/57/C 题意: 给你一个数n,表示有n个数的序列,每个数范围为[1,n],叫你求所有非降和非升序列的个数 ...

  9. codeforces A. Array 解题报告

    题目链接:http://codeforces.com/problemset/problem/300/A 题目意思:给出n个数,将它们分成三批:1.所有数相乘的结果 < 0    2.所有数相乘的 ...

随机推荐

  1. webpack 4 x使用详细

    1.首先安装node.js 2.打开控制台cmd,输入npm install webpack webpack-cli webpack-dev-server -g 3.在本地磁盘上建一个文件夹,然后通过 ...

  2. 微信小程序自定义组件-下拉框

    这个是网址https://www.cnblogs.com/zjjDaily/p/9548433.html 微信小程序之自定义select下拉选项框组件 知识点:组件,animation,获取当前点击元 ...

  3. Java虚拟机03(Java虚拟机内存模型)

    根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 其实最需要Java程序员关注的是堆,栈,还有方法区,因为啊: 如果代码又问题的话,可能回出现栈溢出 然后说 ...

  4. List<Object> 查询解析优化

    2018年3月16日 大型仪器设备分类查出后,需要展示个分类下总共有多少台设备.因为分类总共分三层,加起来数据700+.以后该系统上线设备可能达到2000+,这样统计每个分类下的设备可能会拖垮服务器. ...

  5. kali下的截图工具scrot、flameshot和deepin-scrot

    对于这几个截图工具,精简好用的应该是deepin-scrot了,这是个和QQ截图有类似功能的Linux截图工具.flameshot的功能是最多的,也很好用,虽然有的功能用不上. 1.scrot安装和使 ...

  6. Docker-harbor-V1.3.0 ”私有仓库“搭建 Easy

    准备: centos     7.0 Docker version 1.12.6    docker-compose version 1.19.0   1: updata-yum:   更新yum 源 ...

  7. Web服务器:Apache的安装使用

    Apache我们很熟悉,已经用了不短时间的tomcat就是apache公司开发的,那么这款以公司命名的所谓的Web服务器Apache,又到底什么呢? 一.概念 Apache是一个静态的Web服务器,是 ...

  8. 一道算法题加深我对C++中map函数的理解

    一.一道题目引发我对map函数的考量 首先是题目大意:有n个银行,a[i]表示这个人在第i个银行有a[i]块钱(可以是负数),所有银行的钱加起来正好是0.每次只能在相邻的银行之间转账,问最少要转多少次 ...

  9. Linux 文件夹和文件大小排序

    Linux 文件夹和文件大小排序 文件夹排序 du -k | sort -rn 文件排序 ls -lS -r, –reverse 依相反次序排列 -R, –recursive 同时列出所有子目录层 - ...

  10. 使用Kickstart+pxe自动化安装部署无人值守的linux服务器

    Kickstart+pxe Kickstart无人职守安装RHEL5过程分享(详细图解版) 启动应用有:httpd.dhcpd.named.xinetd 无人职守自动批量安装linux系统超详细 参考 ...