BZOJ 3043 IncDec Sequence:反向差分
题目链接: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:反向差分的更多相关文章
- 【BZOJ 3043】 3043: IncDec Sequence (差分)
3043: IncDec Sequence Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 589 Solved: 332 Description 给 ...
- BZOJ 3043: IncDec Sequence
3043: IncDec Sequence Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 578 Solved: 325[Submit][Statu ...
- bzoj 3043: IncDec Sequence 模拟
3043: IncDec Sequence Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 248 Solved: 139[Submit][Statu ...
- BZOJ 3043: IncDec Sequence 差分 + 思维
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...
- IncDec Sequence(差分)
题意:给定一个序列,可以对一个区间进行加1或减1的操作,问最少需要多少次可以将序列的值一样. Solution 我们将序列差分,得到一个差分数组. 对于每一个区间操作,我们可以把它转化为在查分数组上某 ...
- 洛谷 P4552 [Poetize6] IncDec Sequence【差分+脑洞】
一看区间操作,很容易想到差分 所以就是先差分,然后为了保证最小步数,把政府差分抵消,也就相当于原数组区间加减 第二问,因为差分数组抵消之后不为0就需要使用n+1的虚拟位置,而这个的值其实没有,所以我们 ...
- IncDec Sequence (差分)
题目地址 这道题可以用来检测一下你是否学会了差分,或者你可以更加透彻的理解差分 我们把 \(cf[]\) (差分)数组拿出了,就可以发现这道题就是每次可以在 \(cf[]\)中 选两个数,一个+1,一 ...
- Poetize6: IncDec Sequence
3043: IncDec Sequence Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 233 Solved: 132[Submit][Statu ...
- 前缀和与差分之IncDec sequence
参考链接:https://blog.csdn.net/hzk_cpp/article/details/80407014 题目链接:https://www.acwing.com/problem/cont ...
随机推荐
- Linux下自动备份MySQL数据库详细操作步骤(转载)
环境说明操作系统:CentOSIP:192.168.150.214Oracle数据库版本:Oracle11gR2用户:root 密码:123456端口:3306数据库:ts_0.ts_1.ts_2.t ...
- jquery方法
$.inArray(被判断的量,ArrayName); 如果存在返回索引值,如果不存在返回-1 $.unique() 数组去重 根据去重前后的长度,判断是否有重复 $.each(被遍历的数组,f ...
- 在 Linux 多节点安装配置 Apache Zookeeper 分布式集群
规划: 三台物理服务器就形成了(法定人数).对于高可用性集群,您可以使用高于3的任何奇数.例如,如果设置5台服务器,则集群可以处理两个故障节点等. 物理服务器需要开启的端口 2888 , 3888 和 ...
- oracle session和process的关系
什么是session 通俗来讲,session 是通信双方从开始通信到通信结束期间的一个上下文(context).这个上下文是一段位于服务器端的内存:记录了本次连接的客户端机器.通过哪个应用程序.哪个 ...
- python实现区块链代码
如果你明白了原理其实挺简单的. 加密算法是python自带的 需要导入hashlib import hashlib as hash sha = hasher.sha256() sha.update(' ...
- 宜信开源|微服务任务调度平台SIA-TASK入手实践
引言 最近宜信开源微服务任务调度平台SIA-TASK,SIA-TASK属于分布式的任务调度平台,使用起来简单方便,非常容易入手,部署搭建好SIA-TASK任务调度平台之后,编写TASK后配置JOB进行 ...
- u-boot-2014.04分析
本文档以smdk2410为例初步分析了u-boot-2014.04的配置.启动流程.代码重定向.内存分布. u-boot-2014.04这个版本的uboot从Linux内核中借鉴了很多东西,比如编译u ...
- 给js对象赋值,赋值key
var pastResult = []; pastResult.push(feature.attributes.F_iID); pastResult.push(feature.attributes.F ...
- JavaScript系列问题
JavaScript系列问题: 0.javascript 基础教程[温故而知新一] 1.通过JS变更页面字体的大小 2.图片压缩优化能有效提高网站浏览速度
- centOS中如何修改运行级别!
在图形化界面可以用Ctrl+Alt+F2进入命令行窗口 * 假如你使用了虚拟机,有可能会出现不能进去的问题,原因是因为热键冲突 * 解决办法:修改热键就行了 edit→parameter→hot ke ...