题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3043

题意:

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

  求:(1)至少需要多少次操作才能使数列中的所有数都一样。

    (2)在保证最少次数的前提下,最终得到的数列有多少种。

题解:

  对于差分来说,给[l,r]+1(或-1)就是给差分数组s[l]+1和s[r+1]-1。

  所以数列a[i],是从一个所有元素都相等的初始数组,经过若干次差分操作得来的。

  因此可以求出a[i]的差分数组s[i]。

  因为要使操作次数最小,所以先让s[i]中的正数和负数配对(可能有剩余),每一对"+1"和"-1"对应一次操作。

  剩下来的正数(或负数),只能单独消去。

  pos为s[i]的正数之和,neg为s[i]的负数的绝对值之和。

  所以第(1)问的答案为max(pos,neg)。

  因为要使操作次数最小,所以配对的"+1"和"-1"一定会被消去,对于最终数列的种类没有影响。

  所以只用考虑剩下来的正数(或负数)的消去方法。

  对于一个在i位置的"+1"来说,有两种消去方法:

    (1)自己跟自己消,即在s[i]再-1。

      从效果上看,相当于给a[i]及后面的数都-1。

    (2)跟位置1消,即在s[i]处-1。

      相当于给[1,i]之间的数-1。

  对于这两种消去方法,最终数组的数字大小相差1。

  剩下的数共有abs(pos-neg)个。

  所以最终数组的数字大小最多相差abs(pos-neg),即数字种类有abs(pos-neg)+1种。

  abs(pos-neg)+1即为第(2)问答案。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 100005 using namespace std; int n;
long long pos=;
long long neg=;
long long a[MAX_N]; long long labs(long long x)
{
return x>?x:-x;
} void read()
{
cin>>n;
for(int i=;i<n;i++)
{
cin>>a[i];
}
} void solve()
{
for(int i=;i<n;i++)
{
if(a[i]>a[i-]) pos+=a[i]-a[i-];
else neg+=a[i-]-a[i];
}
} void print()
{
cout<<max(pos,neg)<<endl;
cout<<labs(pos-neg)+<<endl;
} int main()
{
read();
solve();
print();
}

BZOJ 3043 IncDec Sequence:反向差分的更多相关文章

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

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

  2. BZOJ 3043: IncDec Sequence

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

  3. bzoj 3043: IncDec Sequence 模拟

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

  4. BZOJ 3043: IncDec Sequence 差分 + 思维

    Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...

  5. IncDec Sequence(差分)

    题意:给定一个序列,可以对一个区间进行加1或减1的操作,问最少需要多少次可以将序列的值一样. Solution 我们将序列差分,得到一个差分数组. 对于每一个区间操作,我们可以把它转化为在查分数组上某 ...

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

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

  7. IncDec Sequence (差分)

    题目地址 这道题可以用来检测一下你是否学会了差分,或者你可以更加透彻的理解差分 我们把 \(cf[]\) (差分)数组拿出了,就可以发现这道题就是每次可以在 \(cf[]\)中 选两个数,一个+1,一 ...

  8. Poetize6: IncDec Sequence

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

  9. 前缀和与差分之IncDec sequence

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

随机推荐

  1. apache压缩页面, 全面加速网站

    介绍: 网页压缩来进一步提升网页的浏览速度,它完全不需要任何的成本,只不过是会让您的服务器CPU占用率稍微提升一两个百分点而已或者更少.   原理:   网页压缩是一项由 WEB 服务器和浏览器之间共 ...

  2. 算法-search

    O(big o) 是上限,是我们关注的算法的时间复杂度.数据量大,数据量涨一千倍,lgn的算法就是 耗费的时间就是10倍,o(n)就是一千倍,o(n2)就是一百万倍的差距 例一:Sequential ...

  3. sql join相关

    JOIN: 如果表中有至少一个匹配,则返回行 LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行,返回左表所有行 RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行,返回右表 ...

  4. SQLSERVER聚集索引和主键(Primary Key)的误区认识

    引用别人的,供以后学习使用,谢谢! 很多人会把Primary Key和聚集索引搞混起来,或者认为这是同一个东西.这个概念是非常错误的. 主键是一个约束(constraint),他依附在一个索引上,这个 ...

  5. 转:static关键字的总结

    static关键字的总结 C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. ...

  6. IPv4(四)子网和子网掩码

    为了完成路由选择,每个数据链路(网络)都必须有一个惟一的地址: 另外,数据链路上的每台主机也必须有一个地址,这个地址不仅标识主机为一个网络成员,还可以把主机与网络上的其他主机区分开来. 粗放使用IPv ...

  7. linux支持的machine-types

    在内核文件中arch/arm/tools/mach-types定义目前内核支持的板卡.芯片等: ##machine_is_xxx  CONFIG_xxxx  MACH_TYPE_xxx  number ...

  8. PHP正则匹配6到16位字符组合(且只能为数字、字母、下划线)

    php正则匹配6到16位的字符串. 只允许包含数字.字母.下划线组成的6到16位字符,符合返回ture,否则返回false. 解答: 6到16位,正则可以这样写:{6,16}. 任意的字符6到16位的 ...

  9. HDU 5338(ZZX and Permutations-用线段树贪心)

    ZZX and Permutations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/O ...

  10. 认识XmlReader

    认识XmlReader   摘要 XmlReader类是组成.NET的关键技术之一,极大地方便了开发人员对Xml的操作.通过本文您将对XmlReader有一个很好的认识,并将其应用到实际开发中. 目录 ...