题目描述

给定一个长度为n的数列$a_1,a_2,……,a_n$​,每次可以选择一个区间[l,r],使这个区间内的数都加1或者都减1。

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

输入输出格式

输入格式:

第一行一个正整数n
接下来n行,每行一个整数,第i+1行的整数表示a[i]​。

输出格式:

第一行输出最少操作次数
第二行输出最终能得到多少种结果

输入输出样例

输入样例:

4
1
1
2
2
输出样例:

1
2

说明

对于100%的数据,n≤100000,0≤a[i]​≤2147483648。

题解:

经典差分模型。

总结对于这类模型的做法。

考虑差分的特点:

1、 反映数据之间的相对关系。

2、 前缀和和是原来的数据(废话……)

3、 原数组区间$[l,r]$加v在差分数组上变成了$dif[l]+v,dif[r+1]-v$,特别的当修改区间为$[l,n]$时,仅有$dif[l]+v$($n+1$直接忽略)

有了以上的特点我们就好分析题目了。

先考虑第一问:

要求最少操作使得数列列全部相等。如果我们将数列差分起来,那么我们要让全部数都相等,那么就是要让差分数组中每一项都为0,我们考虑要让每一项都等于多少,根据特点2,如果我们留下第一项的,只将$[2,n]$的差分数组变为0,那么数列就都是第一项的值了。所以我们只在$[2,n]$的差分序列上做操作。根据特点3,我们操作转换成了让$dif[l]+1,dif[r+1]-1$和$dif[l]-1,dif[r+1]+1$,所以我们考虑将差分数组中的正数和负数一一配对,那么最后如果剩下一些正数,那么就修改$dif[i]+1,dif[n+1]-1$就可以把正数消除,负数同理。

考虑第二问:

上面讲过,我们留下了第一项,所以数列中所有数会变成第一项的数,所以就考虑最优情况下,第一项可以有多少种取法即可。也就是考虑剩下的那些正数(或负数)和第一个位置互相抵消一部分(剩余的再和$n$抵消)的的情况,就是$dif[1]+1,dif[i]-1$

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 100005
using namespace std;
int n;
long long a[N],dif[N],pos,neg;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++) dif[i]=a[i]-a[i-1];
for(int i=2;i<=n;i++){
pos+=max(dif[i],0ll);
neg-=min(dif[i],0ll);
}
printf("%lld\n",max(pos,neg));
printf("%lld\n",abs(pos-neg)+1);
return 0;
}

BZOJ 3043 [Poetize6] IncDec Sequence的更多相关文章

  1. Poetize6: IncDec Sequence

    3043: IncDec Sequence Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 233  Solved: 132[Submit][Statu ...

  2. Luogu 4552 [Poetize6] IncDec Sequence

    在BZOJ上好像被权限掉了. 考虑差分,定义差分数组$b$ $$b_i = \left\{\begin{matrix} a_i \ \ \ (i == 1)\\ a_i - a_{i - 1}\ \ ...

  3. 解题:Poetize6 IncDec Sequence

    题面 差分原数列得到差分数组$dif$,这样对于$dif[2]->dif[n]$会多出来两个“空位置”$1$和$n+1$.然后区间加减就变成了使一个位置$+1$,另一个位置$-1$(可以对“空位 ...

  4. 洛谷 P4552 [Poetize6] IncDec Sequence【差分+脑洞】

    一看区间操作,很容易想到差分 所以就是先差分,然后为了保证最小步数,把政府差分抵消,也就相当于原数组区间加减 第二问,因为差分数组抵消之后不为0就需要使用n+1的虚拟位置,而这个的值其实没有,所以我们 ...

  5. P4552 [Poetize6] IncDec Sequence

    Link 题目描述 给定一个长度为 \(n\) 的数列 \({a_1,a_2,\cdots,a_n}\),每次可以选择一个区间 \([l,r]\),使这个区间内的数都加 \(1\) 或者都减 \(1\ ...

  6. 【BZOJ 3043】 3043: IncDec Sequence (差分)

    3043: IncDec Sequence Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 589  Solved: 332 Description 给 ...

  7. BZOJ 3043: IncDec Sequence

    3043: IncDec Sequence Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 578  Solved: 325[Submit][Statu ...

  8. bzoj 3043: IncDec Sequence 模拟

    3043: IncDec Sequence Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 248  Solved: 139[Submit][Statu ...

  9. 前缀和与差分之IncDec sequence

    参考链接:https://blog.csdn.net/hzk_cpp/article/details/80407014 题目链接:https://www.acwing.com/problem/cont ...

随机推荐

  1. WPF 排版基础

    一.WPF 排版基础 WPF使用控制面板来进行排版,控制面板实际上是一种可以放入WPF界面元素的容器.当用户把界面元素放入控制面板后,WPF会自动把这些界面元素放在它认为合适的地方.WPF开发人员需要 ...

  2. mysql all_ip_test局域网IP测试工具,有需要的改一改.

    1 import threading 2 import subprocess 3 import pymysql 4 # threading.Lock() 5 6 7 class Link(object ...

  3. Kotlin/Native 用KMM写Flutter插件

    一.用KMM写Flutter插件 Google官方有一个写Flutter例子How to write a Flutter plugin,这里把Google plugin_codelab 例子改成用KM ...

  4. Noip模拟62 2021.9.26

    T1 Set 真就随机化拿了$90$?? 不过还是有依据的,毕竟这道题出解的几率很大,随出答案的概率也极大 所以不妨打一个随机化 1 #include<bits/stdc++.h> 2 # ...

  5. 热身训练1 Blood Cousins Return

    点此看题 简要题面: 一棵树上有n个节点,每个节点有对应的名字(名字可重复). 每次询问,求深度比$vi$多$ki$的$vi$的儿子中,有多少种名字 分析: Step1: 我们可以懂$DFS$轻松找到 ...

  6. 2021.8.16考试总结[NOIP模拟41]

    T1 你相信引力吗 肯定是单调栈维护.但存在重复值,还是个环,不好搞. 发现取区间时不会越过最大值,因此以最大值为断点将环断为序列.在栈里维护当前栈中有多少个与当前元素相等的元素,小分类讨论一下. 最 ...

  7. vs2010中release模式下调试程序

    debug模式调试信息全,但是速度很慢,在数据量比较大的时候非常影响调试效率,release模式速度快,但是没有调试信息.所以在编译的时候很多编译器会提供一种折中的编译方式,在release下提供调试 ...

  8. c语言编程基础入门必备知识

    数据类型 基本数据类型 类型名称说明char字符类型存放字符的ASCII码int整型存放有符号整数short短整型存放有符号整数long长整型存放有符号整数long long存放有符号整数float单 ...

  9. linux安装后ping不通局域网其他主机的解决方式

    安装了linux后尝试进行机器间的相互通讯,发现自己虚拟机并不能查看ip地址,也不能够ping通任何一台局域网内的主机 上网查了一下发现是网卡并没有打开,需要进行如下配置 查看ls 一下/etc/sy ...

  10. CSS学习(三)特指度和层叠

    一.特指度 特制度的一般形式是0,0,0,0 行内样式,第一位的特指度加一 id选择符,第二位的特指度加一 类选择符.属性选择符.伪类,第三位的特指度加一 元素选择符.伪元素,第四位的特指度加一 特指 ...