BZOJ3155Preprefix sum

3155: Preprefix sum

Time Limit: 1 Sec  Memory Limit: 512 MB
Submit: 1288  Solved: 588

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

Source

Katharon+#1

Solution

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100001
typedef long long LL;
int n,m,a[MAXN];
LL delta[MAXN<<2],sum[MAXN<<2],S[MAXN];

void read(int &x,char ch=getchar())
{
    for (;ch<‘0‘ || ch>‘9‘;ch=getchar());
    for (x=0;ch>=‘0‘ && ch<=‘9‘;ch=getchar()) x=(x<<1)+(x<<3)+ch-‘0‘;
}

void build(int s,int l,int r)
{
    int mid=(l+r)/2;
    if (l==r) return sum[s]=(LL)S[l],void();
    build(s*2,l,mid),build(s*2+1,mid+1,r),sum[s]=sum[s*2]+sum[s*2+1];
}

void pushdown(int s,int l,int r)
{
    int mid=(l+r)/2;
    if (!delta[s]) return;
    sum[s*2]+=delta[s]*(LL)(mid-l+1),sum[s*2+1]+=delta[s]*(LL)(r-mid),delta[s*2]+=delta[s],delta[s*2+1]+=delta[s],delta[s]=0;
}

LL query(int s,int l,int r,int x,int y)
{
    int mid=(l+r)/2;
    LL ans=0;
    if (x<=l && y>=r) return sum[s];
    pushdown(s,l,r);
    if (x<=mid) ans+=query(s*2,l,mid,x,y);
    if (y>mid) ans+=query(s*2+1,mid+1,r,x,y);
    return ans;
}

void insert(int s,int l,int r,int x,int y,int z)
{
    int mid=(l+r)/2;
    if (x<=l && y>=r) return sum[s]+=(LL)z*(r-l+1),delta[s]+=(LL)z,void();
    pushdown(s,l,r);
    if (x<=mid) insert(s*2,l,mid,x,y,z);
    if (y>mid) insert(s*2+1,mid+1,r,x,y,z);
    sum[s]=sum[s*2]+sum[s*2+1];
}

int main()
{
    int i,x,y;
    char s[10];
    //freopen("3155.in","r",stdin),freopen("3155.out","w",stdout);
    read(n),read(m);
    for (i=1;i<=n;++i) read(a[i]),S[i]=S[i-1]+(LL)a[i];
    build(1,1,n);
    while (m--)
      {
          scanf("%s",s),read(x);
          if (s[0]==‘M‘) read(y),insert(1,1,n,x,n,y-a[x]),a[x]=y;
          else printf("%lld\n",query(1,1,n,1,x));
      }
    return 0;
}

线段树

时间: 2024-10-17 22:50:54

BZOJ3155Preprefix sum的相关文章

LeetCode OJ - Sum Root to Leaf Numbers

这道题也很简单,只要把二叉树按照宽度优先的策略遍历一遍,就可以解决问题,采用递归方法越是简单. 下面是AC代码: 1 /** 2 * Sum Root to Leaf Numbers 3 * 采用递归的方法,宽度遍历 4 */ 5 int result=0; 6 public int sumNumbers(TreeNode root){ 7 8 bFSearch(root,0); 9 return result; 10 } 11 private void bFSearch(TreeNode ro

129. Sum Root to Leaf Numbers

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 / 2 3 T

Leetcode 494 Target Sum 动态规划 背包+滚动数据

这是一道水题,作为没有货的水货楼主如是说. 题意:已知一个数组nums {a1,a2,a3,.....,an}(其中0<ai <=1000(1<=k<=n, n<=20))和一个数S c1a1c2a2c3a3......cnan = S, 其中ci(1<=i<=n)可以在加号和减号之中任选. 求有多少种{c1,c2,c3,...,cn}的排列能使上述等式成立. 例如: 输入:nums is [1, 1, 1, 1, 1], S is 3. 输出 : 5符合要求5种

31.SUM() 函数

SUM() 函数 SUM 函数返回数值列的总数(总额). SQL SUM() 语法 SELECT SUM(column_name) FROM table_name SQL SUM() 实例 我们拥有下面这个 "Orders" 表: O_Id OrderDate OrderPrice Customer 1 2008/12/29 1000 Bush 2 2008/11/23 1600 Carter 3 2008/10/05 700 Bush 4 2008/09/28 300 Bush 5

1305 Pairwise Sum and Divide

基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整: fun(A) sum = 0 for i = 1 to A.length for j = i+1 to A.length sum = sum + Floor((A[i]+A[j])/(A[i]*A[j])) return sum 给出数组A,由你来计算fun(A)的结果.例如:A = {1, 4, 1},fun(A) = [5/4] + [

Java [Leetcode 303]Range Sum Query - Immutable

题目描述: Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive. Example: Given nums = [-2, 0, 3, -5, 2, -1] sumRange(0, 2) -> 1 sumRange(2, 5) -> -1 sumRange(0, 5) -> -3 Note: You may assume that the ar

LeetCode 303. Range Sum Query - Immutable

求数组nums[i,j]的和 思路:另开一sum数组,sum[i]为nums[0,i]的和,所以nums[i,j] = sum[j] - sum[i-1] 1 class NumArray { 2 public: 3 vector<int> sum; 4 NumArray(vector<int> &nums) { 5 sum.resize(nums.size(), 0); 6 sum[0] = nums[0]; 7 int len = nums.size(); 8 for(

【数组】Minimum Path Sum

题目: Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. Note: You can only move either down or right at any point in time. 思路: 设res[i][j]表示从左上角到grid[i][

HDU 5586 Sum

最大子串和 #include<cstdio> #include<cstring> const int maxn=100000+10; int n; int x[maxn]; int fx[maxn]; int a[maxn]; int sum[maxn]; int L[maxn],R[maxn]; const int INF=0x7FFFFFFF; int max(int a,int b) { if(a>b) return a; return b; } int main()