交错和查询 (树状数组)
http://112.74.32.32/problem/1006题意:给出一个数字序列,查询区间内的数字交错和 ,更新某点的值题解:维护一个二维的树状数组,一维存储奇数前缀和,另一维存储偶数前缀和。(其实自己手动按照代码模拟一遍就明白为什么这样做了)#include<iostream>#include<algorithm>#include&a
·
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;
}
}
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)