寒假第二周个人学习总结

本周学习了以下内容:1,一维前缀和和差分; 2,贪心算法的区间划分; 3,快速幂。

虽然目前只是初步了解, 只能进行简单的应用,但还是感悟颇多。

1,一维前缀和和差分。

前缀和指的是某一组数的前n项和, 如S[n] = a[1] + a[2] + a[3] + ... + a[n], 其中S数组是a的前缀和数组, 在求某组数中任意区间的数的和上有很大的作用,如给定个大小为n的数组,并求出[l, r]之间的和,如果暴力遍历,当数据大时易TLE, 如果用前缀和,在输入时先进行预处理:S[i] = S[i-1] + a[i], 查询时只要求出S[r] - S[l]即可, 时间复杂度大大降低。

差分是前缀和的逆运算,如S[n] = a[1] + a[2] + a[3] + ... + a[n], a[1]=S[1], a[i] = S[i] - S[i-1], 其中a是S的差分数组,差分对于求[l, r]之间每个数加常数c的问题十分有效,因为差分是前缀和的逆运算,所以差分数组中某个位置的数值变化将影响对应位置及之后的前缀和数组的数值大小,如a[l]+c, 则其新的前缀和数组将变为

S[1], S[2], ... , S[l]+c, S[l+1]+c, S[l+2]+c, ..., S[r]+c, S[r+1]+c, ... S[n]+c.

而如果再a[r+1]-c, 那么前缀和数组又变为

S[1],S[2],...,S[l]+c,S[l+1]+c,...,S[r]+c, S[r+1],..., S[n].

因此求[l, r]之间每个数加c后的新数组, 只要求出该数组的差分数组a,并a[l]+=c, a[r+1]-=c, 再重新求前缀和即可

2,差分的变式

Acwing 100增减序列

给定一个长度为 n 的数列 a1,a2,…,ana1,a2,…,an,每次可以选择一个区间 [l,r][l,r],使下标在这个区间内的数都加一或者都减一。

求至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列可能有多少种。

因为要求数列中所有数都一样所以可以看出,该数列最终的差分数列 bn(n>=2)==0(因为b[n]=a[n]-a[n-1], a[n]==a[n-1]), 所以可以把题看成对b数列中的任意两个数分别+1,-1(因为上文的公式a[l]+=c,a[r+1]-=c), 让其n>=2的部分等于0最少需要执行次数和种数。

因为是选两个数分别+1,-1所以当b[i](i>=2 && i<=n)的部分,负数+1,正数-1可以更快地达到目标,所以设sum1是正数的和,sum2是负数的和,两者绝对值小的为min,大的为max.

如果sum1=-sum2,那么sum1或sum2的绝对值便是最少操作次数。当sum1!=sum2时, 正负抵消后多余的部分|sum1+sum2|可以和差分数组第一个数b[1]或b[n+1]匹配,因为b[n+1]不影响原数组a中n+1位置之前(即1~n)的所有数,所以最少操作次数为|sum1+sum2|+min = max,在此基础上的种类则由b1决定,所以等于b1本身加上|sum1+sum2|的匹配次数,所以为|sum1+sum2|+1。

3,贪心算法区间划分和快速幂

虽然这周对该知识进行学习,也能进行部分运用写题,但仍不能表述清楚,对原理没有深刻理解,所以仍需继续努力.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值