热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《算法竞赛高阶指导》第3章:差分技术详解与应用

在《算法竞赛高阶指导》第三章中,详细探讨了差分技术的原理及其在实际问题中的应用。本章节通过具体示例,如通过区间操作使序列中的所有元素相等的问题,深入解析了如何利用差分技术高效解决此类问题,并讨论了不同操作方式下的最优解法及其复杂度分析。题目链接:https://www.acwing.com/problem/content/102。该章节不仅提供了理论上的指导,还结合了丰富的实例,帮助读者更好地理解和掌握差分技术的应用技巧。

题目链接:https://www.acwing.com/problem/content/102/

给定一个序列,只能对一个区间加一或者减一,问至少需要多少步使得所有数都变成一致的?有多少种一致序列?

利用差分,对一个区间进行加一或者减一的话,一定是一个差分+1加上另一个差分-1。

代码如下:

#include
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a))
#define prime1 1e9+7
#define prime2 1e9+9
#define pi 3.14159265
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define scand(x) scanf("%llf",&x)
#define f(i,a,b) for(int i=a;i<=b;i++)
#define scan(a) scanf("%d",&a)
#define mp(a,b) make_pair((a),(b))
#define P pair
#define dbg(args) cout<<#args<<":"<#define inf 0x7ffffff
inline int read(){
int ans=0,w=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
return ans*w;
}
int n,m,t;
const int maxn=1e5+10;
const ll mod=10000;
ll a[maxn],d[maxn];
int main()
{
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
n=read();
f(i,1,n)scanf("%lld",&a[i]);
d[1]=a[1];
f(i,2,n)d[i]=a[i]-a[i-1];
ll p=0,q=0;
f(i,2,n)
{
if(d[i]>0)p+=d[i];
if(d[i]<0)q-=d[i];
}//min(p,q)+abs(p,q)=max(p,q)
cout<}

 



推荐阅读
author-avatar
包括萨u盾根本_173
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有