【bzoj3155】【Preprefix sum】【树状数组】

原创 2015年11月21日 16:35:15

Description

Input

第一行给出两个整数N,M。分别表示序列长度和操作个数
接下来一行有N个数,即给定的序列a1,a2,....an
接下来M行,每行对应一个操作,格式见题目描述

Output

对于每个询问操作,输出一行,表示所询问的SSi的值。

Sample Input

5 3
1 2 3 4 5
Query 5
Modify 3 2
Query 5

Sample Output

35
32

HINT

1<=N,M<=100000,且在任意时刻0<=Ai<=100000

题解:树状数组的区间修改。。。或许直接用线段树吧。。

代码:

#include<iostream>
#include<cstdio>
#define N 100010
using namespace std;
long long c[N],c2[N],a[N];
int n,q,v,x;
char ch[10];
long long read(){
    long long x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
void updata(long long c[],int x,long long v){for (int i=x;i<=n;i+=(i&(-i))) c[i]+=v;}
long long query(long long c[],int x){
  long long ans(0);
  for (int i=x;i;i-=(i&(-i))) ans+=c[i];
  return ans;
}
int main(){
  n=read();q=read();
  for (int i=1;i<=n;i++){
    a[i]=read();updata(c,i,a[i]);updata(c2,i,(n-i+1)*a[i]);
  } 
  for (int i=1;i<=q;i++){
     scanf("%s",&ch);
     if (ch[0]=='Q'){x=read();printf("%lld\n",query(c2,x)-(n-x)*query(c,x));}
     if (ch[0]=='M'){
       x=read();v=read();updata(c,x,v-a[x]);updata(c2,x,(n-x+1)*(v-a[x]));a[x]=v;
     }
  }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

bzoj3155 Preprefix sum(简单线段树)

3155: Preprefix sum Time Limit: 1 Sec  Memory Limit: 512 MB Submit: 1258  Solved: 573 [Submit][Statu...

【BZOJ】3155 Preprefix Sum

【解析】线段树,区间修改,区间求和 [Analysis]考虑每个数的更改对答案的影响 [Sumup] ①对于区间求和的标记,注意要+而不是直接更改 ②如果存在LL和int的运算,统一转成LL,注意...

3155: Preprefix sum

传说可以用树状数组,不过因为本人比较菜,于是上无脑差分数组+线段树。 容易发现,当一个数i增加x时,会使前缀和的前缀和j(j>=i)增加(j-i+1)*x。那么可以想象成i~n段加x,i+1~n段加...

(LeetCode 307) Range Sum Query - Mutable(树状数组讲解)

Q: Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), incl...

CodeForces 703D Mishka and Interesting sum (树状数组处理异或和)

题意:求区间上出现偶数次的数 的异或和。 分析: 如果求出现奇数次的数 的异或和,则只需预处理前缀异或和,然后马上就能求出来了。一个数异或偶数次为0。             ...
  • Just_Lm
  • Just_Lm
  • 2016年08月13日 00:32
  • 295

LeetCode 307 Range Sum Query - Mutable(树状数组 || 线段树)

Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive...

Codeforces Round #365 (Div. 2) D Mishka and Interesting sum (离线树状数组)

题目链接 题意:求区间内出现偶数次的数的异或值。 分析:和求一个区间内不同元素个数做法一样。树状数组存的是不同元素的前缀异或和。用map标记数a[i]最近的出现的下标。其实就是先求出这个区间的(异...

※ Leetcode - Segment Tree - 307. Range Sum Query - Mutable (线段树+树状数组两种解法以及模板的常见问题解析)

1. Problem Description Given an integer array nums, find the sum of the elements between indices i a...

【Codeforces Round 365 (Div 2)D】【离线询问 树状数组 前驱思想】Mishka and Interesting sum 区间内出现次数偶数的数的异或和

#include #include #include #include #include #include #include #include #include #include #include #...

Codeforces 703D Mishka and Interesting sum (树状数组求区间内不同的数的异或和)

http://www.codeforces.com/contest/703/problem/D Little Mishka enjoys programming. Since her birthda...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【bzoj3155】【Preprefix sum】【树状数组】
举报原因:
原因补充:

(最多只允许输入30个字)