差分标记

博客介绍了如何使用差分标记来优化区间加上平方数序列的操作。通过数学推导,证明可以先加上{1, 3, 6, 10…}再减去{1, 2, 3, 4…}实现目标,这样每次操作的复杂度降低为常数。对于多组操作,可以积累差分标记,最后一次性计算前缀和,提高效率。这种方法也适用于处理其他形式的高阶多项式区间操作。" 74783286,6980935,LaTeX数学符号速查指南,"['LaTex', '数学公式', '排版', '技术写作']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

次数a1a1a2a2a3a3a4a4a5a5通项
零次11111an=1an=1
一次12345an=nan=n
二次1361015an=n(n+1)2an=n(n+1)2
三次14102035an=n(n+1)(n+2)6an=n(n+1)(n+2)6
….

要将区间加上一个1, 4, 9, 16…即平方数序列, 每次直接操作的复杂度都是区间长度, 如果有很多次这样的操作, 就必须利用差分标记了
因为
n2=2n(n+1)2nn2=2n(n+1)2−n
所以可以用差分标记, 加上两次{1, 3, 6, 10…}, 变成{2, 6, 12, 20…}, 再减去{1, 2, 3, 4…}, 变成{1, 4, 9, 16…}
如果有多组操作, 可以用差分标记, 将所有操作标记起来, 最后只需要计算常数次前缀和就好了
如果要加上其他形式的高阶多项式, 也可以由上面的若干个通项组成

#include <iostream>
using namespace std;
typedef long long ll;
const int maxn = 1e6+100;
ll a[maxn];
ll op, l, r, x;
int n;
ll add[3][maxn];

void show()
{
    for(int i=1; i<=n; ++i) cout << a[i] << " ";
    cout << endl;
}
void cal()
{
    for(int i=1; i<=3; ++i)
    {
        for(int j=0; j<i; ++j)
        {
            for(int k=2; k<=n; ++k)
            {
                add[i-1][k] += add[i-1][k-1];
            }
        }
    }
    for(int i=1; i<=n; ++i) 
    {
        for(int j=0; j<3; ++j) a[i] += add[j][i];
    }
}
void add_0(ll l, ll r, ll x)//x
{
    add[0][l] += x;
    add[0][r+1] -= x;
}
void add_1(ll l, ll r, ll x)//nx
{
    int n = (r-l+1);
    add[1][l] += x;
    add[1][r+1] -= x;
    add[1][r+1] -= x*n;
    add[1][r+2] += x*n;
}
void add_2(ll l, ll r, ll x)//n*(n+1)/2*x
{
    int n = (r-l+1);
    add[2][l] += x;
    add[2][r+1] -= x;
    add[2][r+1] -= x*n;
    add[2][r+2] += x*n;
    add[2][r+1] -= x*n*(n+1)/2;
    add[2][r+2] += x*n*(n+1)/2;
    add[2][r+2] += x*n*(n+1)/2;
    add[2][r+3] -= x*n*(n+1)/2; 
}
int main()
{
    // cin >> n;
    n = 20;
    add_2(1, 10, 2);
    add_1(1, 10, -1);
    cal();
    show();

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值