首页 > 其他分享 >牛牛的等差数列(树状数组,区间加等差数列、区间求和)

牛牛的等差数列(树状数组,区间加等差数列、区间求和)

时间:2024-02-07 13:55:53浏览次数:24  
标签:牛牛 sum cin int add 区间 ll 等差数列

https://ac.nowcoder.com/acm/contest/5157/C

区间加等差数列,区间求和

image

树状数组,二阶差分

\(b_i = a_i-a_{i-1}\)

\(c_i=b_i-b_{i-1}\)

\[\sum_{i=1}^n a_i = \sum_{i=1}^n \sum_{j=1}^i b_j = \sum_{i=1}^n \sum_{j=1}^i \sum_{k=1}^j c_k \\= \sum_{k=1}^n c_k \sum_{i,j}[k\le j\le i\le n] = \sum_{k=1}^n c_k \frac{(1+n-k+1)(n-k+1)}{2} \\= \frac12 \times \left [(n+1)(n+2)\sum_{k=1}^n c_k - (2n+3)\sum_{k=1}^n kc_k + \sum_{k=1}^n k^2c_k \right] \]

在原数组 \(a[]\) 的 \([l,r]\) 区间加一个首项为 \(a_0\) 公差为 \(d\) 的等差数列

就是 b[l] += a0, b[l+1~r] += d, b[r+1] -= a0 + d(n-1)

就是 c[l] += a0, c[l+1] += d-a0, c[r+1] -= a0+d*n, c[r+2] += a0+d(n-1)

关于取模:取所有可能的模数的乘积作为模数。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int P = 3*5*7*11*13*17*19*23;
const int inv2 = 55773218; //2的逆,我本地暴力找的

struct BIT {
    int n; vector<ll> tr;
    BIT(int n): n(n), tr(n + 1) {}
    int lowbit(int x) { return x & -x; }
    void add(int p, ll x) { for (; p <= n; p += lowbit(p)) (tr[p] += x) %= P; }
    ll ask(int p) { ll s = 0; for (; p > 0; p -= lowbit(p)) s += tr[p]; return s % P; }
};

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int n;
    cin >> n;
    
    BIT c(n), kc(n), kkc(n);
    auto add = [&](int p, ll x) { //对c数组的单点加
        c.add(p, x); kc.add(p, x * p % P); kkc.add(p, x * p % P * p % P);
    };
    auto upd = [&](int l, int r, ll a, ll d) { //a数组区间加等差数列
        add(l, a);
        add(l + 1, d - a);
        add(r + 1, -(a + d * (r - l + 1) % P));
        add(r + 2, (a + d * (r - l)) % P);
    };
    auto ask = [&](int n) {
        ll s = c.ask(n) * (n + 1) % P * (n + 2) % P;
        s -= (2 * n + 3) * kc.ask(n) % P;
        s += kkc.ask(n);
        return s % P * inv2 % P;
    };
    
    for (int i = 1; i <= n; i++) {
        int x; cin >> x;
        upd(i, i, x, 0);
    }
    
    int q;
    cin >> q;
    while (q--) {
        int o, l, r, a, d, m;
        cin >> o;
        if (o == 1) {
            cin >> l >> r >> a >> d;
            upd(l, r, a, d);
        } else {
            cin >> l >> r >> m;
            ll ans = (ask(r) - ask(l - 1)) % m;
            cout << (ans + m) % m << '\n';
        }
    }
    
    return 0;
}

标签:牛牛,sum,cin,int,add,区间,ll,等差数列
From: https://www.cnblogs.com/wushansinger/p/18010870

相关文章

  • 区间统计
    问题:根据J列数据分别统计等于1的客户数;大于1小于等于5的客户数;大于5小于等于7的客户数;大于7小于等于10的客户数;大于10小于等于15的客户数函数公式思路1:P4公式 =COUNTIF(J:J,O4)P5公式 =COUNTIFS(J:J,">"&O4,J:J,"<="&O5)P4公式计算J列中等于O4的个数P5公式计算J列中小于O......
  • java - 判断时间范围区间
    JSONObjectrespObj=newJSONObject(s);SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");StringstartTimeStr="2024-01-01";StringendTimeStr="2024-01-31";DatestartTimDate=sdf.parse(startTimeStr);//strin......
  • 【模板】 与等差数列结合的线段树
    题面代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineIOSios::sync_with_stdio(0);cin.tie(0);cout.tie(0);#definerep(i,a,n)for(inti=a;i<=n;i++)#defineper(i,a,n)for(inti=n;i>=a;i--)#definefifirst#definesesecond#defin......
  • 【字符串】区间本质不同子串个数
    题目描述给定一个字符串\(S\),\(m\)次询问,每次询问\(S_{[l,r]}\)中有多少个本质不同的子串。\(1\leq|S|\leq10^5,1\leqm\leq2\times10^5\)。算法描述考虑HH的项链那道题,扫描右端点,维护对于某些串,能贡献的最大的左端点。假设有一个长为\(len\)的串,最后一次......
  • 【C++】力扣101-分配问题和区间问题
    1.有一群孩子和一堆饼干,每个孩子有一个饥饿度,每个饼干都有一个大小。每个孩子只能吃一个饼干,且只有饼干的大小不小于孩子的饥饿度时,这个孩子才能吃饱。求解最多有多少孩子可以吃饱。#include<iostream>#include<vector>#include<algorithm>usingnamespacestd;intcalc......
  • 从CF1737学习区间计数处理与开方精度丢失问题
    Problem-B-Codeforces思路出来之后,需要计算\(l,r\)区间的个数。我想的是计算出\([0,r]\)的个数和\([0,l]\)的个数,然后相减。大体上是没问题,但是我的实现麻烦而且有错误。初始代码voidsolve(){lll,r;cin>>l>>r;autocalc=[&](llx,bool......
  • 区间修改,单点查询的树状数组
    #include<bits/stdc++.h>#defineCLOSEios::sync_with_stdio(false);cin.tie(0);cout.tie(0)#defineendl"\n"typedeflonglongLL;constintN=1e6+10,M=N,mod=1e9+7;usingnamespacestd;inta[N],b[N],n,q;LLt[N];intlowbi......
  • 区间修改+区间查询的树状数组
    /*https://www.acwing.com/solution/content/44886/看acwing*/#include<bits/stdc++.h>#defineCLOSEios::sync_with_stdio(false);cin.tie(0);cout.tie(0)#defineendl"\n"typedeflonglongLL;constintN=1e6+10,M=N,mod=1e9+7;u......
  • R语言GAMLSS模型对艾滋病病例、降雪量数据拟合、预测、置信区间实例可视化
    全文链接:http://tecdat.cn/?p=31996原文出处:拓端数据部落公众号GAMLSS模型是一种半参数回归模型,参数性体现在需要对响应变量作参数化分布的假设,非参数性体现在模型中解释变量的函数可以涉及非参数平滑函数,非参数平滑函数不预先设定函数关系,各个解释变量的非线性影响结果完全取决......
  • Financial - 置信区间 (Confidence Interval,CI)
    总结1.一些前置概念置信区间是谁的置信区间?-->置信区间是参数的置信区间参数又是什么的参数?--> 参数是总体(population)的参数置信区间是怎么算的?-->是通过样本(sample)算的 2.正确理解置信区间95%置信区间,意味着如果你用同样的步骤,去选样本,计算置信区间,那么100次这样的独......