3043: IncDec Sequence

本文介绍了一种通过差分数组简化区间操作的算法,用于解决序列中所有元素变为相同值所需的最少操作次数问题,并探讨了最终可能存在的不同数值种类。

题目链接

题目大意:给定一个序列,提供一个操作:将某个区间内所有数+1或-1
求将所有数变成一样最少多少次操作,以及最终可以有多少种数

题解:对于带有“将一段区间内的每个数全部加上某个值”这种操作的题目,通常考虑差分原数列以简化情况

每次对[l,r]进行+-1,相当于在差分数组d[]上进行d[l]+1,d[r+1]-1(或反之)
目标:将差分数组变成第一个位置是最终的数字,2~n都是0的形式

设d数组中第2–n项正数和为p,负数绝对值和为q
第一步:正负数一一配对,操作次数为min(p,q),完成后剩余abs(p-q)的数
第二步:题目中的多少种结果实际上就是第一项的取值个数。观察发现,这剩余的abs(p-q)的数有两种消除方法
(1)和1号位置消除,影响答案;
(2)和n号位置消除,不影响答案

最终答案与操作顺序无关,只与(1)操作的次数有关,那么答案就是
abs(p-q)+1,即进行0~abs(p-q)次操作

可以抽象出数学模型
球盒问题:n个球放进2个盒子,允许空盒,方案数为n+1(第一个盒子放0……n个球),即n分解为1个和2个数的种数之和

而第一问的答案就是min(p,q)+abs(p-q)=max(p,q)

我的收获:差分法,通过端点解决区间修改,套路(

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 100005
using namespace std;

int n,a[M];
long long f[2];

void init()
{
    cin>>n;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=2;i<=n;i++) f[a[i]>a[i-1]]+=abs(a[i]-a[i-1]);
    printf("%lld\n%lld\n",max(f[0],f[1]),abs(f[0]-f[1])+1);
}

int main()
{
    init();
    return 0;
}
### Increment Decrement Sequence Implementation In programming, an increment-decrement sequence typically refers to operations that involve increasing or decreasing values by a fixed amount iteratively. This concept can be implemented using loops and arithmetic operators. A common way to implement such sequences involves initializing variables with start values and then applying increments or decrements within loop structures: ```cpp // C++ example demonstrating inc/dec sequence #include <iostream> int main() { int value = 0; // Initial value while (value < 5) { // Loop condition std::cout << "Incrementing: " << ++value << '\n'; // Pre-increment operation } while (value > 0) { std::cout << "Decrementing: " << --value << '\n'; // Pre-decrement operation } return 0; } ``` For more complex scenarios involving collections like arrays or vectors, iterator-based approaches provide flexibility when traversing elements forward or backward[^2]: ```cpp std::vector<int> numbers{1, 2, 3, 4}; for(auto it = numbers.begin(); it != numbers.end(); ++it){ *it += 1; // Increment each element via dereferenced iterator } for(auto rit = numbers.rbegin(); rit != numbers.rend(); ++rit){ *rit -= 1; // Decrement from reverse direction similarly } ``` Iterators allow for efficient traversal over container types without exposing underlying data structure details. When working with standard template library containers, iterators offer powerful ways to manipulate sequences through generic algorithms provided by the C++ Standard Library. Regarding specific implementations of `incdec` as mentioned in some contexts, these might refer to specialized functions designed around particular requirements not covered here directly but following similar principles outlined above.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值