http://112.74.32.32/problem/1006

题意:给出一个数字序列,查询区间内的数字交错和 ,更新某点的值

题解:维护一个二维的树状数组,一维存储奇数前缀和,另一维存储偶数前缀和。

(其实自己手动按照代码模拟一遍就明白为什么这样做了)

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<cmath>
#include<map>
#include<set>
#include<vector> 
using namespace std;
#define inf 0x3f3f3f
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mem(a,b) memset(a,b,sizeof(a));
#define lowbit(x)  x&-x;
typedef long long ll;
const int mx = 1e5+5;
ll c[2][mx];  //一维标记奇偶 
ll a[mx];
int n,q;
void update(int x,ll val,int flag){
	while(x < mx){
		c[flag][x] += val;
		x += lowbit(x);
	}
} 
ll query(int x,int flag){
	ll res = 0;
	while(x > 0){
		res += c[flag][x];
		x -= lowbit(x);
	}
	return res;
}
int main(){
	while(~scanf("%d",&n)){
		mem(c,0);
		rep(i,1,n){
			scanf("%lld",&a[i]);
			if(i&1){
				update(i,a[i],0);
				update(i,-a[i],1);
			}else{
				update(i,-a[i],0);
				update(i,a[i],1);
			}
		}
		scanf("%d",&q);
		ll ans;
		while(q--){
			int op,l,r;
			scanf("%d%d%d",&op,&l,&r);
			if(op){
				if(l&1){
					ans = query(r,0) - query(l-1,0);
				}else{
					ans = query(r,1) - query(l-1,1);
				}
				printf("%lld\n",ans);
			}else{
				if(l&1){
					update(l,r-a[l],0);
					update(l,a[l]-r,1);
				}else{
					update(l,a[l]-r,0);
					update(l,r-a[l],1);
				}
				a[l] = r;
			}
		}
	}
}

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐