首页 > 其他分享 >区间修改+区间查询的树状数组

区间修改+区间查询的树状数组

时间:2024-02-01 15:13:37浏览次数:40  
标签:树状 int LL t2 cin t1 add 数组 区间

/*
https://www.acwing.com/solution/content/44886/
看acwing
*/
#include <bits/stdc++.h>
#define CLOSE ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define endl "\n"
typedef long long LL;
const int N = 1e6 + 10, M = N, mod = 1e9 + 7;
using namespace std;
int n, q;
LL  t1[N], t2[N], a[N], b[N];
int lowbit(int x) {return x & -x;}
void add(int x, LL c, LL t[]){
    for(int i = x; i <= n; i += lowbit(i)){
        t[i] += c;
    }
}
LL getsum(int x, LL t[]){
    LL sum = 0;
    for(int i = x; i; i -= lowbit(i)){
        sum += t[i];
    }
    return sum;
}
LL query(int x){
	return getsum(x, t1) * (x + 1) - getsum(x, t2); 
}
int main()
{
    CLOSE;
    cin >> n >> q;
    for(int i = 1; i <= n; i ++){
        cin >> a[i];
    }
    for(int i = 1; i <= n; i ++){
        b[i] = a[i] - a[i - 1];
        add(i, b[i], t1);
        add(i, b[i] * i, t2);
    }
    while(q --){
        int op;
        cin >> op;
        if(op == 1){
            int l, r;
			LL k;
            cin >> l >> r >> k;
            add(r + 1, -k, t1), add(l, k, t1);//改差分数组
            add(r + 1, -k * (r + 1), t2), add(l, k * l, t2);//改i*差分数组
        } else{
            int l, r;
            cin >> l >> r;
            cout << query(r) - query(l - 1) << endl;
        }
    }
    return 0;
}

标签:树状,int,LL,t2,cin,t1,add,数组,区间
From: https://www.cnblogs.com/acwhr/p/18001294

相关文章

  • R语言GAMLSS模型对艾滋病病例、降雪量数据拟合、预测、置信区间实例可视化
    全文链接:http://tecdat.cn/?p=31996原文出处:拓端数据部落公众号GAMLSS模型是一种半参数回归模型,参数性体现在需要对响应变量作参数化分布的假设,非参数性体现在模型中解释变量的函数可以涉及非参数平滑函数,非参数平滑函数不预先设定函数关系,各个解释变量的非线性影响结果完全取决......
  • Financial - 置信区间 (Confidence Interval,CI)
    总结1.一些前置概念置信区间是谁的置信区间?-->置信区间是参数的置信区间参数又是什么的参数?--> 参数是总体(population)的参数置信区间是怎么算的?-->是通过样本(sample)算的 2.正确理解置信区间95%置信区间,意味着如果你用同样的步骤,去选样本,计算置信区间,那么100次这样的独......
  • 数组的度
    697.DegreeofanArray(Easy)给定一个非空且只包含非负数的整数数组nums,数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是找到与nums拥有相同大小的度的最短连续子数组,返回其长度。示例1:输入:[1,2,2,3,1]输出:2解释:输入数组的度是2,因为元......
  • 嵌套数组
    565.ArrayNesting(Medium)Input:A=[5,4,0,3,1,6,2]Output:4Explanation:A[0]=5,A[1]=4,A[2]=0,A[3]=3,A[4]=1,A[5]=6,A[6]=2.OneofthelongestS[K]:S[0]={A[0],A[5],A[6],A[2]}={5,6,2,0}题目描述:S[i]表示一个集合,集合的第一个......
  • 后缀数组好题选讲
    CodeForces616FExpensiveStringshttps://codeforces.com/problemset/problem/616/FProblemtagsstringsuffixstructuresstrings*2700ProblemStatement给定\(n\)个字符串\(t_1,t_2,\dots,t_n\)。每个字符串有一个权值,对于\(1\leqi\leqn\),有\(t_i\)的权......
  • Java 数组
    数组数组是相同类型数据的有序集合。数组的声明和创建publicclassDemo01{//变量的类型变量的名字=变量的值//数组类型publicstaticvoidmain(String[]args){//首先声明数组变量int[]nums;//定义,首选这种intnums2[]......
  • const copyStories = [...stories] 和 let storiesToDisplay = stories.slice(); 两
    constcopyStories=[...stories]和letstoriesToDisplay=stories.slice();两种复制数组的方式,哪种更优雅?在JavaScript中,constcopyStories=[...stories](使用扩展运算符)和letstoriesToDisplay=stories.slice()都可以用来复制数组,并且都能生成一个新的数组。这两种......
  • golang 使用hex包,转换文件的16进制字符、16进制字节数组
    某些特殊情况下需要根据文件的16进制转换成字符在linux系统用vim保存一个文件,写入两行内容这是测试A这是测试B用linux的xxd命令输出文件的16进制字节数组xxd-g1-it.txtunsignedchart_txt[]={0xe8,0xbf,0x99,0xe6,0x98,0xaf,0xe6,0xb5,0x8b,0x......
  • 鸿蒙二进制数组创建
    背景c++层数据都是二进制,需要转换成arrayBuffer透传到ets层给业务使用,但是鸿蒙的使用下面两个api创建出来的二进制数组数据都是错误的。接口napi_create_arraybuffer:这个接口只能创建空的二进制数组,没办法把char的内容丢进去创建napi_create_external_arraybuffer:这个接口支持......
  • 代码随想录 day36 无重叠区间 划分字母区间 合并区间
    无重叠区间这里的思路是找到有几个非重叠区间然后总数减去非重叠区间就是剩下的重叠区间数首先排好序按左或者右都可以这里按左排好然后发现边界不重叠就++边界重叠那么由于左边界优先对齐了所以右边界更新作为一个新的整体区间和下一个区间比较划分字母区间......