差分+贪心:IncDec序列
题目描述
给定一个长度为 n 的数列 a1,a2,…,ana1,a2,…,an,每次可以选择一个区间 [l,r][l,r],使下标在这个区间内的数都加一或者都减一。
求至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列可能有多少种。
输入格式
第一行输入正整数n。
接下来n行,每行输入一个整数,第i+1行的整数代表ai。
输出格式
第一行输出最少操作次数。
第二行输出最终能得到多少种结果。
数据范围
0<n≤1050<n≤105
0≤ai<21474836480≤ai<2147483648
输入样例:
4
1
1
2
2
输出样例:
1
2
思路:首先这题一个重点,就是区间[l,r][l,r]的修改操作。因为这道题目的修改操作有一个特性,就是只加一或者只减一,而不是+x+x,也不是−x−x,所以说我们并不需要用到高级的数据结构,线段树和树状数组,而只是需要用差分即可。
差分:差分的定义,可以见《算法竞赛进阶指南》的P21页。
介于第一版没有差分,这里说一下定义:对于一个给定的数列A,它的差分数列B定义为, B[1]=A[1],B[i]=Ai−Ai−1(2<=i<=n)B[1]=A[1],B[i]=Ai−Ai−1(2<=i<=n)
这里只说性质,也就是把序列A的区间[L,R][L,R]加d,也就是把Al,Al+1....ArAl,Al+1....Ar都加上d,其实就是它的差分序列B中,Bl+d,Br+1−dBl+d,Br+1−d,其他的位置统统不改变。
因此在这道题目中,我们就可以利用这个非常有用的性质,因为我们只要求A序列中所有的数相同,而不在意这些方案具体是什么,所以说我们就可以转化题目,也就是将对A序列的+1,−1+1,−1操作,让A序列相同,改成目标把B2,…,BnB2,…,Bn变成全0即可,也就是A序列全部相等。而且最后得到的序列,就是这n个B1B1
贪心:因为我们有上面所说的性质,那么我们就可以,每一次选取Bi和BjBi和Bj,2<=i,j<=n2<=i,j<=n,而且这两个数,一个为正数,一个为负数,至于为什么要是正负配对,因为我们是要这个B序列2~n都要为0,所以这样负数增加,正数减少,就可以最快地到达目标为0的状态。
至于那些无法配对的数BkBk可以选B1B1或者BnBn,这两个不影响的数,进行修改。
所以说我们这道题目得出的答案就是,最少操作数min(p,q)+abs(p−q)=max(p,q)min(p,q)+abs(p−q)=max(p,q),然后最终序列a可能会有abs(p−q)+1abs(p−q)+1种情况。p为b序列中正数之和,而q为b序列中负数之和
作者:秦淮岸灯火阑珊
链接:https://www.acwing.com/solution/acwing/content/816/
来源:AcWing
代码:·要开long long!!!!(别问我为什么这么说)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
long long a[N],b[N],n;
int main(){
std::ios::sync_with_stdio(false);
cin>>n;
long long zans=0,fans=0,ans1,ans2;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)b[i]=a[i]-a[i-1];
for(int i=2;i<=n;i++)
if(b[i]>0)zans+=b[i];
else fans+=b[i];
ans2=abs(fans+zans);
fans=abs(fans);
ans1=max(fans,zans);
cout<<ans1<<endl<<ans2+1;
return 0;
}
差分+贪心:IncDec序列的更多相关文章
- IncDec序列:差分+贪心
IncDec序列 题目描述: 给定一个长度为 n 的数列 a1,a2,…,an,每次可以选择一个区间[l,r],使下标在这个区间内的数都加一或者都减一. 求至少需要多少次操作才能使数列中的所有数都一样 ...
- 100 IncDec序列
IncDec序列 Description 给定一个长度为 n 的数列 a1,a2,-,an,每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一. 求至少需要多少次操作才能使数列中 ...
- 洛谷P3406 海底高铁[差分 贪心]
题目背景 大东亚海底隧道连接着厦门.新北.博艾.那霸.鹿儿岛等城市,横穿东海,耗资1000亿博艾元,历时15年,于公元2058年建成.凭借该隧道,从厦门可以乘坐火车直达台湾.博艾和日本,全程只需要4个 ...
- hdu 4982 贪心构造序列
http://acm.hdu.edu.cn/showproblem.php?pid=4982 给定n和k,求一个包含k个不相同正整数的集合,要求元素之和为n,并且其中k-1的元素的和为完全平方数 枚举 ...
- Codeforces 1065C Make It Equal (差分+贪心)
题意:n个塔,第i个塔由$h_i$个cube组成,每次可以切去某高度h以上的最多k个cube,问你最少切多少次,可以让所有塔高度相等 k>=n, n<=2e5 思路:差分统计每个高度i有的 ...
- codeforces 1017C - Cloud Computing 权值线段树 差分 贪心
https://codeforces.com/problemset/problem/1070/C 题意: 有很多活动,每个活动可以在天数为$[l,r]$时,提供$C$个价格为$P$的商品 现在从第一天 ...
- 51nod 1133 不重叠的线段 (贪心,序列上的区间问题)
题意: 最多能选几条不重叠的线段 思路: 按R从小到大排序,维护一个最大的右端点 右端点最小的那个线段是必选的,可以贪心地证明 代码: #include<iostream> #includ ...
- 差分:IncDec Sequence 差分数组
突然就提到了这个东西,为了不再出现和去年联赛看见二分没学二分痛拿二等第一的情况,就去学了一下,基础还是比较简单的-- 先看一个经典例题: 给定一个长度为n的数列{a1,a2...an},每次可以选择一 ...
- ARIMA模型——本质上是error和t-?时刻数据差分的线性模型!!!如果数据序列是非平稳的,并存在一定的增长或下降趋势,则需要对数据进行差分处理!ARIMA(p,d,q)称为差分自回归移动平均模型,AR是自回归, p为自回归项; MA为移动平均,q为移动平均项数,d为时间序列成为平稳时所做的差分次数
https://www.cnblogs.com/bradleon/p/6827109.html 文章里写得非常好,需详细看.尤其是arima的举例! 可以看到:ARIMA本质上是error和t-?时刻 ...
随机推荐
- vue的store状态管理模式
var store = { debug: true, state: { message: 'Hello!' }, setMessageAction (newValue) { //所有 store 中 ...
- PHP类知识----clone方法上机实验
<?php class mycoach { public function __construct($name,$age) { $this->name = $name; $this-> ...
- vs2015显示代码行数
打开visual studio 2015,在菜单中点击“工具” --> "选项" -->“文本编辑器” --> "所有语言" -->勾选 ...
- The Cost of JavaScript --------引用
tl;dr: 想要保持页面的快速运行,你需要仅加载当前页面所需的 JavaScript 代码.优先考虑用户所需,之后运用代码分离懒加载其他内容. Is it happening - 在这个时期,你可以 ...
- React之this.refs, 实现数据双向绑定
1.实现数据双向绑定 将input组件与this.state属性绑定,要么是readonly, 要么使用onChange事件: 获取input元素的value值,有两种方式: 1) e.target. ...
- mysql优化(下)
优化SQL语句:(1)不要使用 select *(2)尽量在where字段上添加索引:(3)模糊查询中%前置不能使用索引,比如 like ‘%a’;(4)使用or语句时,两侧语句都有索引时才使 ...
- Linux帮助文档
Linux当中有许多命令: 在Linux中提供了详细的帮组文档,利用好可以提高使用效率: 1.help参数 大多数命令都可以使用 -h 或 --help 参数来获取该命令的使用方法.参数等信息: ...
- H5 设计尺寸
750*1218 微信下 兼容 7plus 内容高度 居中 1000px 内 750*1448 微信下 兼容 iphoneX 微信导航栏高度 64px 64px = 导航栏44+状态栏20 但是现在 ...
- Java集合框架之接口Iterator
简述 Iterator迭代器的定义:迭代器(Iterator)模式,又叫做游标(Cursor)模式.GOF给出的定义是,提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象 ...
- Requests 代理池
Requests 本身不提供代理池,然而爬数据又要用,所以只能自己搞.其实还挺简单的.我也不知道为什么这么有用的 feature 一直没有被加入. import requests class Clie ...