#树状数组,线段树#洛谷 3374 【模(mú)板】树状数组 1

2024-02-11 06:48
文章标签 数组 树状 洛谷 线段 3374

本文主要是介绍#树状数组,线段树#洛谷 3374 【模(mú)板】树状数组 1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

树状数组单点修改和区间查询不想多讲

#include <cstdio>
#include <cctype>
using namespace std;
int a[500001],n,m;
int in(){char c=getchar(); int ans=0,f=1;while (!isdigit(c)&&c!='-') c=getchar();if (c=='-') f=-f,c=getchar();while (isdigit(c)) ans=ans*10+c-48,c=getchar();return ans*f;
}
int lowbit(int x){return x&(-x);}
void add(int l,int r){while (l<=n){a[l]+=r;l+=lowbit(l);}
}
int ask(int x){int ans=0;while (x>0){ans+=a[x];x-=lowbit(x);}return ans;
}
int main(){int l,r,q;n=in(); m=in();for (int i=1;i<=n;i++) q=in(),add(i,q);for (int i=1;i<=m;i++){q=in(); l=in(); r=in();if (q==1) add(l,r);else printf("%d\n",ask(r)-ask(l-1));}return 0;
} 

线段树

这里写图片描述

首先是建树

int build(int l,int r,int k){if (l==r) return tree[k].w=a[r];else return tree[k].w=build(l,(l+r)>>1,2*k)+build(((l+r)>>1)+1,r,2*k+1);
}

修改

void update(int l,int r,int x,int y,int k){if (l==x&&r==x) {tree[k].w+=y; return;}int mid=(l+r)>>1;if (x<=mid) update(l,mid,x,y,2*k); else update(mid+1,r,x,y,2*k+1);tree[k].w=tree[2*k].w+tree[2*k+1].w;
}

查找

void find(int l,int r,int x,int y,int k){if (x==l&&y==r) {ans+=tree[k].w;return;}int mid=(l+r)>>1;if (y<=mid) find(l,mid,x,y,2*k);else if (x>mid) find(mid+1,r,x,y,2*k+1);else find(l,mid,x,mid,2*k),find(mid+1,r,mid+1,y,2*k+1);return;
}

代码

#include <cstdio>
#include <cctype>
using namespace std;
struct node{int w,laz;}tree[2000001]; int a[500001],n,m,ans;
int build(int l,int r,int k){if (l==r) return tree[k].w=a[r];else return tree[k].w=build(l,(l+r)>>1,2*k)+build(((l+r)>>1)+1,r,2*k+1);
}
inline int in(){int ans=0,f=1; char c=getchar();while (!isdigit(c)&&c!='-') c=getchar();if (c=='-') f=-f,c=getchar();while (isdigit(c)) ans=ans*10+c-48,c=getchar();return ans*f;
}
void update(int l,int r,int x,int y,int k){if (l==x&&r==x) {tree[k].w+=y; return;}int mid=(l+r)>>1;if (x<=mid) update(l,mid,x,y,2*k); else update(mid+1,r,x,y,2*k+1);tree[k].w=tree[2*k].w+tree[2*k+1].w;
}
void find(int l,int r,int x,int y,int k){if (x==l&&y==r) {ans+=tree[k].w;return;}int mid=(l+r)>>1;if (y<=mid) find(l,mid,x,y,2*k);else if (x>mid) find(mid+1,r,x,y,2*k+1);else find(l,mid,x,mid,2*k),find(mid+1,r,mid+1,y,2*k+1);return;
}
void in1(int &x,int &y){x=in();y=in();}
int main(){n=in(); m=in();for (int i=1;i<=n;i++) a[i]=in();build(1,n,1);	while (m--){int q=in(),x,y;ans=0;in1(x,y); if (q==1) update(1,n,x,y,1);else find(1,n,x,y,1),printf("%d\n",ans);}return 0;
} 

这篇关于#树状数组,线段树#洛谷 3374 【模(mú)板】树状数组 1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/699118

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的