博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 3043
阅读量:6692 次
发布时间:2019-06-25

本文共 909 字,大约阅读时间需要 3 分钟。

 

Description

给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一。

问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多少种。

Input

第一行一个正整数n 

接下来n行,每行一个整数,第i+1行的整数表示ai。

Output

第一行输出最少操作次数

第二行输出最终能得到多少种结果

Sample Input

4
1
1
2
2

Sample Output

1
2

HINT

 

对于100%的数据,n=100000,0<=ai<2147483648

 

题解:

明显要求最后差分数列除第一项都是0的情况。然而为什么答案是只用统计上升和下降的差分呢????

有个比较牵强的说法,>0的差分其实是指后面连续一段降的话只需要上升的差分这么多。

而<0的话其实是把后面连续一段升高为相同高度所需的操作数。

如果你升高的话只能连续升高,或下降的话只能连续下降。因为上升的话后面所有的数都上升了,如果你再下降的话,就会有重复的多余操作。下降同理。

AC代码:

#include
#include
using namespace std;#define N 100005int n;long long ans1,ans2,a[N];int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=2;i<=n;i++){ if(a[i]>a[i-1]) ans1+=a[i]-a[i-1]; else ans2+=a[i-1]-a[i]; } printf("%lld\n%lld\n",max(ans1,ans2),abs(ans1-ans2)+1); return 0;}

 

转载于:https://www.cnblogs.com/shenben/p/5677149.html

你可能感兴趣的文章
读取日志文件开发总结
查看>>
IOS --React Native
查看>>
Linux CPU
查看>>
Linux/Centos ntp时间同步,联网情况和无网情况配置
查看>>
初级网络运维工程师比赛题目
查看>>
跨交换机实现vlan实验报告
查看>>
jquery easyui滚动条部分设置介绍
查看>>
cannot find -lxxx问题
查看>>
预防云端开源项目打包 Redis Labs再更改模块
查看>>
超惊人!去年发生的身分外泄安全事件是2017的4倍
查看>>
oracle sqlplus免安装的配置instantclient-basiclite
查看>>
Java开发GUI之选择列表
查看>>
一、分布式商城架构逻辑图
查看>>
机器人是如何完成避障的?机器人避障解决方案解读
查看>>
通过错误堆栈信息和源码分析错误来源
查看>>
C和C++ 读写文件速度问题
查看>>
layer.mobile 弹出框插件(2.0版)
查看>>
C#基础 条件语句、选择语句和循环语句
查看>>
bugzilla安装笔记
查看>>
Hadoop 2.0(YARN/HDFS)学习资料汇总
查看>>