CH - 0304 IncDec Sequence(差分+思维)
题目链接:点击查看
题目大意:给定一个长度为 n(n≤10^5 ) 的数列 {a_1,a_2,…,a_n},每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一。求至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列可能有多少种。
题目分析:虽然是看过大蓝书之后再来做这个题的,但还是有一些细节没有想明白,想了好半天才算是消化了这个题目,真的是一道质量很好的差分,对于这个题目而言,我们想要用最少的操作数让最后的数列都变为一个相同的数字,我们可以先统计一下一开始相邻两个数字之间的差(区分正负),因为是可以区间操作的,普通的差分是b[l]+=,b[r+1]--,所以我们贪心的策略,首先匹配正负不同的,也就是正负可以相互抵消,我们设pos储存的是正数的和,neg储存的是负数的绝对值之和,那么就有min(neg,pos)的正数和负数可以互相抵消,现在还剩下了abs(neg-pos)的正数或负数无法两两抵消,那么我们可以将其与左右两端的两个边界相互匹配,一共是需要匹配abs(neg-pos)次,这样第一个答案就是min(nge,pos)+abs(neg-pos)=max(neg,pos),因为主要最后答案的差别是出在最后全正或全负的值与端点匹配的过程中,所以一共能组成不同的方案也是有abs(neg-pos)+1种,也就是第二问的答案了,相信对于第一问的最小值肯定没有什么疑问了,主要是第二问的abs(neg-pos)+1还是比较难想的,换种表达方式吧,假如现在我们剩下了k=abs(neg-pos)+1的正数,这是一个什么概念?当前序列要么是一个非严格递增的序列,要么是一个非严格递减的序列,那么我们的答案就可以在这个区间内浮动,也就是0~abs(neg-pos)中一共有abs(neg-pos)+1个数,都可以当做最终的答案
举个很简单的例子来理解一下吧:
1 3 5 3
差分后的答案为(从第二项开始处理,意思就是无视第一项)
1 2 2 -2
我们优先匹配正负数,显然一个-2匹配一个2,那么匹配完成后序列就变成了:
1 3 3 3(答案唯一)
这个时候的差分为:
1 2 0 0
我们现在的目标是要对于2这个点与左端点匹配或右端点匹配,现在有三种方案:
- 与右端点匹配两次,每次都减一,得到的差分为1 0 0 0,答案序列为1 1 1 1
- 与左端点匹配一次,加一,与右端点匹配一次,减一,得到的差分为2 0 0 0,答案序列为2 2 2 2
- 与左端点匹配两次,每次都加一,得到的差分为3 0 0 0,答案序列为3 3 3 3
大概就是这么个意思了,还是需要多多琢磨啊,这个题目的代码很简单,但是思维却很复杂
代码:
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;int a[N];int main()
{
// freopen("input.txt","r",stdin);
// ios::sync_with_stdio(false);int n;scanf("%d",&n);LL p=0,q=0;//q:维护负数的权值和的绝对值,p:维护正数的权值和for(int i=1;i<=n;i++)scanf("%d",a+i);for(int i=2;i<=n;i++)if(a[i]-a[i-1]>0)p+=a[i]-a[i-1];elseq+=a[i-1]-a[i];cout<<max(p,q)<<endl<<llabs(p-q)+1<<endl;return 0;
}
CH - 0304 IncDec Sequence(差分+思维)相关推荐
- 解题报告 『[Poetize6]IncDec Sequence(差分)』
原题地址 差分,想到了这个再看看代码应该就很好做了. 代码实现如下: #include <bits/stdc++.h> using namespace std; #define int l ...
- BZOJ 3043 IncDec Sequence:反向差分
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3043 题意: 给定一个长度为n的数列a[i],每次可以选择一个区间[l,r],使这个区间内 ...
- AT2005-[AGC003E]Sequential operations on Sequence【差分,思维】
正题 题目链接:https://www.luogu.com.cn/problem/AT2005 题目大意 开始有一个1∼n1\sim n1∼n依次排列的序列,然后QQQ次,第iii次把序列长度变为ai ...
- P4552-[Poetize6]IncDec Sequence【差分】
正题 题目链接:https://www.luogu.com.cn/problem/P4552 题目大意 给出nnn个数,每次可以选择一个区间加一或减一,求最少操作使得所有数相等,并且求可能的最终序列个 ...
- [Poetize6] IncDec Sequence
Description 有一个长度为\(n(n\leq 100000)\)的数列,每次可以给一个区间\([l,r]\)加1或者减1.问要多少次操作让整个数列一样,并求出最少操作的前提下,最终得到的数列 ...
- IncDec Sequence(codevs 2098)
题目描述 Description 给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一. 问至少需要多少次操作才能使数列中的所有数都一样,并 ...
- 100. 增减序列【差分 / 思维】
本题考察的是差分的思想. 设 b[i]=a[i]-a[i-1] 因为我们要想让其所有的数字都相等.故即b[2],b[3].......b[n]都得为0才行. 此时数组所有的数的值都是b[1]. 因为我 ...
- CodeForces - 1110E-Magic Stones(差分+思维)
Grigory has nn magic stones, conveniently numbered from 11 to nn. The charge of the ii-th stone is e ...
- CodeForces - 1000C Covered Points Count(差分+思维)
题目链接:点击查看 题目大意:给出n个区间,现在要求输出覆盖次数为1,2,3....n-1,n的点分别有多少个 题目分析:一开始看到区间问题想用线段树去做,但想了想又可以直接用差分去做,不过因为数比较 ...
最新文章
- linux 内核参数调整说明
- 【TP3.2】模板 select选项采坑
- 在用户控件中用户登录后台脚本判断
- python密码传参有特殊字符如何解决_python生成带特殊字符的密码
- Python基础概念_4_控制流程
- 前端学习(2620):新增品牌
- 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 11丨产品销售分析 III【难度中等】
- Overview of GTK+ and its Libraries
- Scrum立会报告+燃尽图(Beta阶段第一次)
- hystrix文档翻译之metrics
- 真实场景下如何解决类别不平衡问题
- 目前介绍区块链最好的教学视频
- LFM信号脉冲压缩仿真
- Unity 多人联机游戏(一)
- 七年级计算机会考重点知识点总结,2021年度七年级科学会考知识点整理.doc
- 公网访问阿里云RDS云数据库
- 检测浏览器是pc端还是移动端 是否微信浏览器
- 怎么样把pdf压缩到最小
- 激荡二十五年:wind、同花顺、东方财富、大智慧等金融服务商争霸史
- Django笔记总结