增减序列(差分)

news2024/11/26 9:07:07

分析:要想把整个数组变为同一个数,我们可以根据差分的思想来做。

差分定义:b[1]=a[1]

                  b[2]=a[2]-a[1]

                  ......

                  b[i]=a[i]-a[i-1]

由定义可知,可以把b[2]~b[n]全部变为0,那么整个数组就一样了。现在问题转换为如何用最少的操作次数把b[2]~b[n]全部变为0;由于差分数组操作是   b[ l ]+=1,b[ r+1 ]-=1/b[ l ]-=1,b[ r+1 ]+=1(操作的意思为在原数组a的区间[ l , r ] 加上1或减1)

那么对于2`~ n有四种操作(下边四种操作,l 和 r 都出现在了 1~ n中):

1. 2<=l , r <= n-1            (l,r都可以改变数组b  2~n 的值)b[l]+=1,b[r+1]-=1  /b[ l ]-=1,b[ r+1 ]+=1

2. l=1  ,2 <= r <= n-1         (只有r可以改变b数组 2~n的值) b[1]+=1,b[r+1]-=1  /b[ 1 ]-=1,b[ r+1 ]+=1

3. 2<= l <=n-1 ,r=n           (只有 l 可以改变b数组 2~n的值,注意:虽然r=n,但是我们改变的是b[r+1]                                            的值)                                         b[l]+=1,b[ r+1]-=1  /b[ l ]-=1,b[ r+1 ]+=1

4. l=1 , r=n                      执行b[l]+=1,b[r+1]-=1  /b[ l ]-=1,b[ r+1 ]+=1,相当于在原数组上整体加1                                           或减1,无意义 

我们的目的是把b数组的2~n的值变为0 ,且操作次数最少,那么我们优先使用操作1,执行完操作1后,b数组就只剩相同符号的数 了,然后再交替执行步骤 2和3(也可以只使用一个步骤,因为同一个步骤既可以加,也可以减,只是改变的值(b[1] 或 b[n+1])不一样) 就可以使b数组的2~n全部变为0

 操作1为什么可以使b数组全部变为相同的数呢 ?因为可以任选两个数执行(加1和减1  ,也可以是减1和加1),最终留下的数,就是正数(正数之和大于负数)或者负数(负数的绝对值之和大于正数)(操作1的次数等于==== min(正数,abs(负数))

当全部变为正数或者负数时,那么就可以执行步骤2或3,即b数组的2~n中不为0的数,加或减,最后变为0 ,那么操作2和3的步骤次数为 (假如正数比负数大  , 那么就等于==正数-abs(负数),负数比正数大的话,同理;

求出在保证最少次数的前提下,最终得到的数列可能有多少种?

前面说了最终全部的数都会和b[1]相等,  

  那么最终的b[1]被操作几次,b[1]就可以有几种情况。即 上边操作2,3的次数 再+1,加1是因为b[1]原本还有一个数(可以只执行操作3),

最后一个知识点:假如有两个数 a>b  那么  max(a,b) = min(a,b) + (a-b)

代码
 

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

const int N = 1e5 + 10;
typedef long long LL;
int a[N],b[N];
int n;

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        b[i]=a[i]-a[i-1];
    }
    
    LL p=0,q=0;
    for(int i=2;i<=n;i++)
    {
        if(b[i]>0) p+=b[i];
        else q-=b[i];
    }
    
    cout<<max(p,q)<<endl<<abs(q-p)+1<<endl;
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/345509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Seata-Server分布式事务原理加源码 (八) - Seata-XA模式

Seata-XA模式 Seata 1.2.0 版本重磅发布新的事务模式&#xff1a;XA 模式&#xff0c;实现对 XA 协议的支持。 我们从三个方面来深入分析&#xff1a; XA模式是什么&#xff1f;为什么支持XA&#xff1f;XA模式如何实现的&#xff0c;以及如何使用&#xff1f; XA模式 首先…

shell学习1

目录 一、echo 1.1 echo 1.2 打印彩色文本 1.3 打印彩色背景 二、printf 三、变量和环境变量 3.1 查看某个进程的环境变量 3.2给变量赋值。varvalue 3.3 给环境变量赋值 3.4 获取变量的长度 3.5 识别当前所使用的shell 3.6 检查是否为超级用户 四、数学运算 4.1 …

PHP新特性集合

php8新特性命名参数function foo(string $a, string $b, ?string $c null, ?string $d null) { /* … */ }你可以通过下面的方式传入参数进行调用foo(b: value b, a: value a, d: value d, );联合类型php7class Number {/** var int|float */private $number;/*** param f…

Vue|事件处理

事件处理1. 事件使用1.1 事件绑定1.2 事件参数2. 事件修饰符2.1 阻止默认事件2.2 阻止事件冒泡2.3 事件只允许触发一次2.4 事件捕获2.5 操作当前元素2.6 行为立即执行无需等待回调3. 键盘事件4. 本章小结4.1 事件使用小结4.2 事件修饰符小结4.3 键盘事件小结1. 事件使用 1.1 事…

C++STL剖析(八)—— unordered_set和unordered_multiset的概念和使用

文章目录前言1. unordered_set的介绍和使用&#x1f351; unordered_set的构造&#x1f351; unordered_set的使用&#x1f345; insert&#x1f345; find&#x1f345; erase&#x1f345; size&#x1f345; empty&#x1f345; clear&#x1f345; swap&#x1f345; count…

安全多方计算系列笔记1——前世今生

这一系列笔记参考了绿盟科技研究通讯的安全多方计算文章&#xff0c;及其他。 首先看定义&#xff1a;在不泄露参与方原始输入数据的前提下&#xff0c;允许分布式参与方合作计算任意函数&#xff0c;输出准确的计算结果。 起源 安全多方计算问题及解首先由姚期智&#xff08…

用大白话给你科普,到底什么是 API(应用程序编程接口)?

何为API&#xff1f;如果你在百度百科上搜索&#xff0c;你会得到如下结果&#xff1a;API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件得以访问一组…

Linux 安装Python3

python3 下载地址 python3 下载地址 https://www.python.org/downloads/ 选择自己需要的版本、 此文中选择3.10.9 下载源码压缩包 可下载到本地后上传至Linux服务器也可以复制下载地址 wget https://www.python.org/ftp/python/3.10.9/Python-3.10.9.tgzpython3 安装 yum…

python练习——简化路径

项目场景&#xff1a; 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 /开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&#xff09;表示当前目录本…

新库上线 | CnOpenData中国地方政府债券信息数据

中国地方政府债券信息数据 一、数据简介 地方政府债券 指某一国家中有财政收入的地方政府地方公共机构发行的债券。地方政府债券一般用于交通、通讯、住宅、教育、医院和污水处理系统等地方性公共设施的建设。地方政府债券一般也是以当地政府的税收能力作为还本付息的担保。地…

【电源专题】案例:用电子负载模拟电池测试充电芯片

最近在做有关充电芯片的选型,所以需要测试充电芯片中的很多参数。如涓流充电电流、快速充电电流、截止电流等等。 如下所示为某充电IC充电过程中的电流电压变化曲线。可以看出其中存在多个电流如Ishort/Iterm/Iprechg/Ichgerg等等。电压点也有Vshortz/Vbatlow/Vbatreg等。这些…

VTK- vtkStripper

前言&#xff1a;本博文主要研究接口vtkStripper的实现原理及主要的应用场景&#xff0c;希望对各位小伙伴有所帮助。 描述&#xff1a;vtkStripper是一个过滤器&#xff0c;用于从输入多边形、三角形带和线中生成三角形带和/或折线。输入多边形仅当它们是三角形时才被组装成三…

【Linux】-- 进程信号(处理、内核)

上篇&#xff1a;【Linux】-- 进程信号&#xff08;认识、应用&#xff09;_川入的博客-CSDN博客 目录 信号其他相关常见概念 pending handler block 信号处理的过程 sigset_t sigset_t使用 系统接口 sigpending sigprocmask 捕捉方法 sigaction struct sigactio …

小白入门模拟IC设计,如何快速学习?

众所周知&#xff0c;模拟电路很难学。以最普遍的晶体管来说&#xff0c;我们分析它的时候必须首先分析直流偏置&#xff0c;其次在分析交流输出电压。可以说&#xff0c;确定工作点就是一项相当麻烦的工作&#xff08;实际中来说&#xff09;&#xff0c;晶体管的参数多、参数…

JavaScript 计时事件

JavaScript 计时事件 通过使用 JavaScript&#xff0c;我们有能力做到在一个设定的时间间隔之后来执行代码&#xff0c;而不是在函数被调用后立即执行。我们称之为计时事件。 在 JavaScript 中使用计时事件是很容易的&#xff0c;两个关键方法是: setInterval() - 间隔指定的…

【CNN记录】tensorflow中depth_to_space

功能把depth维的数据移到space上&#xff0c;与spacetodepth刚好是相反的操作&#xff0c;depth对应channel&#xff0c;space对应height和width&#xff0c;而该操作是把depth上的数据分给height和width上&#xff0c;所以对应有一个参数block_size&#xff0c;要求原tensor的…

CSDN竞赛28期参赛体验

1、小Q的鲜榨柠檬汁 1、题目名称&#xff1a;小Q的鲜榨柠檬汁 团建活动是大家所想要的。 小Q给大家准备了鲜橙汁。 现在有n个朋友买回了k瓶饮料&#xff0c;每瓶有l毫升的饮料&#xff0c;同时还买回 了c个柠檬&#xff0c; 每个柠檬可以切成d片&#xff0c;p克盐。 已知每个朋…

Python基础学习笔记 —— 数据结构与算法

数据结构与算法1 数据结构基础1.1 数组1.2 链表1.3 队列1.4 栈1.5 二叉树2 排序算法2.1 冒泡排序2.2 快速排序2.3 &#xff08;简单&#xff09;选择排序2.4 堆排序2.5 &#xff08;直接&#xff09;插入排序3 查找3.1 二分查找1 数据结构基础 本章所需相关基础知识&#xff1a…

第七届蓝桥杯省赛——1有奖猜谜

题目&#xff1a; 小明很喜欢猜谜语。 最近&#xff0c;他被邀请参加了X星球的猜谜活动。 每位选手开始的时候都被发给777个电子币。 规则是&#xff1a;猜对了&#xff0c;手里的电子币数目翻倍&#xff0c; 猜错了&#xff0c;扣除555个电子币, 扣完为止。 小明一共猜了15…

入门深度学习——基于全连接神经网络的手写数字识别案例(python代码实现)

入门深度学习——基于全连接神经网络的手写数字识别案例&#xff08;python代码实现&#xff09; 一、网络构建 1.1 问题导入 如图所示&#xff0c;数字五的图片作为输入&#xff0c;layer01层为输入层&#xff0c;layer02层为隐藏层&#xff0c;找出每列最大值对应索引为输…