差分标记

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

要将区间加上一个1, 4, 9, 16…即平方数序列, 每次直接操作的复杂度都是区间长度, 如果有很多次这样的操作, 就必须利用差分标记了
因为
n2=2n(n+1)2n n 2 = 2 n ( 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、付费专栏及课程。

余额充值