序列算法

区间查询&单点修改:

给定一个序列a,进行很多次操作:
访问a[l ~~ r]的区间和;
将a[i] 的值修改为 a[i] + 1;

求区间x ~~ y中的区间和:

#include <cstdio>
#include <algorithm>

#define MAXN 2222

int n, m;
int a[MAXN], s[MAXN];

int main() {
   
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++) {
   
		
		scanf("%d", &a[i]);
		s[i] = s[i - 1] + a[i];	//前缀和 
	}
	for(int i = 1, x, y; i <= m; i++) {
   //m次操作 
		scanf("%d%d", &x, &y);
		printf("%d\n", s[y] - s[x - 1]);//s[y] - s[x - 1]即为x ~~ y的区间和 
	}
	return 0;
}
/*
10 100
1 9 5 6 8 7 4 3 6 9 
*/

树状数组:

/树状数组:动态维护前缀和/
在这里插入图片描述

#include<cstdio>

#define lowbit(x) (x & -x)
#define MAX 11111 
int n,m;
int t[MAX],a[MAX];//t为树状数组 

void add(int x, int k) {
   //单点修改(向树上走) 
	for(int i = x; i <= n; i += lowbit(i)) {
   
		t[i] += k;
	} 
}

int query(int x) {
   //区间查询(在树下向前推进)//求的是前缀和 
	int sum = 0;
	for(int i = x; i; i -= lowbit(i)) {
   
		sum += t[i];
	<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值