首页 > 其他分享 >一个简单的整数问题(树状数组区间修改,单点查询)

一个简单的整数问题(树状数组区间修改,单点查询)

时间:2024-12-11 19:57:49浏览次数:11  
标签:单点 树状 int 查询 MM add 数组 define

给定长度为 NN 的数列 AA,然后输入 MM 行操作指令。

第一类指令形如 C l r d,表示把数列中第 l∼rl∼r 个数都加 dd。

第二类指令形如 Q x,表示询问数列中第 xx 个数的值。

对于每个询问,输出一个整数表示答案。

输入格式

第一行包含两个整数 NN 和 MM。

第二行包含 NN 个整数 A[i]A[i]。

接下来 MM 行表示 MM 条指令,每条指令的格式如题目描述所示。

输出格式

对于每个询问,输出一个整数表示答案。

每个答案占一行。

数据范围

1≤N,M≤1051≤N,M≤105,
|d|≤10000|d|≤10000,
|A[i]|≤109

困难的是进行区间修改的时候,如果只区间修改,最后再查询就可以用差分解决,但这个是边修改边查询,就不能用差分了,因为查询的时候差分比较费时间。树状数组启动!和差分的思路一样,只不过用lowbit和树状数组加快了查询的过程,查询的时候就用树状数组的query进行求和会好了。

虽然感觉有些地方想不太通,但问题不大

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define inf 0x3f3f3f3f3f3f3f3f
#define endl "\n"
#define lowbit(x) (x&(-x))
const int N = 1e5+10;
int a[N],tr[N];
int n,m;
void add(int x, int c){
    for(int i = x; i <= n; i+=lowbit(i)) tr[i] += c;     
}
int qry(int x){
    int res = 0;
    for(int i = x; i ; i-=lowbit(i)) res += tr[i];
    return res;
}
void solve(){
    cin >> n >> m;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        add(i,a[i]-a[i-1]);
    }
    while(m--){
        char op;
        cin >> op;
        if(op=='C'){
            int l,r,d;
            cin >> l >> r >> d;
            add(l,d);
            add(r+1,-d); 
        }
        else{
            int x;
            cin >> x;
            cout << qry(x) << endl;
        }
    }
}
signed main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int T=1;
    //cin >> T;
    while(T--) solve();
    return 0;
}

//
//
//
//
//

标签:单点,树状,int,查询,MM,add,数组,define
From: https://blog.csdn.net/2403_85701606/article/details/144381770

相关文章

  • DriverPropertyBagTool.exe 是一个命令行工具,主要用于处理驱动程序的属性包(Property B
    DriverPropertyBagTool.exe是一个命令行工具,主要用于处理驱动程序的属性包(PropertyBag)。它允许用户将不同的数据项添加到属性包中,这些数据项可以是文件、字节数组或是流形式的数据。通过这个工具,你可以创建或更新驱动程序安装过程中使用的属性包,这对于定制化驱动程序部署或者在......
  • C语言(指针数组和数组指针)
    变量指针与指针变量指针变量指向数组通过指针引用数组元素引用一个数组元素,可以用:下标法:如a[i]形式。指针法:如*(a+i)*(p+i)。其中a是数组名,p是指向数组元素的指针变量,其初值:p=a;案例需求:有一个整型数组a,有10个元素。输出数组中的全部元素。分析:要输出各元素的值,有三......
  • leetcode面试经典 150 题第三题(26. 删除有序数组中的重复项)#更适合新手学习
     题目:26.删除有序数组中的重复项-力扣(LeetCode)给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。考虑 nums 的唯......
  • 代码随想录算法训练营第四十三天|LeetCode300.最长递增子序列、LeetCode674.最长连续
    前言打卡代码随想录算法训练营第49期第四十三天 (๑ˉ∀ˉ๑)首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。LeetCode300......
  • Perl 数组
    Perl数组一个是存储标量值的列表变量,变量可以是不同类型。数组变量以@开头。访问数组元素使用 $+变量名称+[索引值] 格式来读取,实例如下:实例#!/usr/bin/perl@hits=(25,30,40);@names=("google","runoob","taobao");print"\$hits[0]=$hits[0]\n";pri......
  • 数组元素全倒排列并去重
    functionreverseAndDedup(arr){//ReversethearrayconstreversedArr=arr.slice().reverse();//DeduplicatethereversedarrayconstuniqueArr=[];constseen=newSet();for(constelementofreversedArr){if(!seen.has(element))......
  • 善于运用指针--通过指针引用数组
    一个数组包含若干个元素,每个元素在内存中占用储存单元,它们都有相应的地址,指针变量能指向变量,也可以指向地址。所谓数组元素的地址,也就是数组元素的指针。文章目录前言一、在引用数组元素时指针的运算二、通过指针引用数组元素三、用数组名作函数参数1用指针打印数组2.指......
  • JPA 自动处理数组字段
    //@ElementCollection//@CollectionTable(name="specification_vote_task_reviewer",joinColumns=@JoinColumn(name="vote_task_id"))@Convert(converter=IntegerListConverter.class)@Column(nullable=true,columnDefini......
  • 从 动态前缀和 到 树状数组
    一.引言——动态前缀和前缀和求解我会在最后给出,想看的直接翻到最后,这里默认大家都知道前缀和怎么求解。有这么一个场景,我们需要不断修改数组中的元素,并且问我们数组内某个区间的和。如果使用最原始的前缀和来求解,每次我们都要重新求一遍sum[],更新时间复杂度是O(n)的,查询是O(1)的......
  • 树状数组进阶
    树状数组是众多数据结构中常数较小,简单好写的,很多ds题都应该优先考虑树状数组。接下来介绍树状数组的几种常见套路。单点加,区间求和区间加,单点查询区间加,区间求和二维树状数组,包括上面\(3\)个操作单点修改,求全局\(k\)小值求前驱,后继,排名等平衡树操作......