刷刷水题...

前缀和的前缀和...显然树状数组可以写...然而我不会, 只能写线段树了

把改变成加, 然后线段树维护前缀和, 某点p加, 会影响前缀和pre(x)(p≤x≤n), 对[p, n]这段区间加即可, 然后query就求[1, p]的和即可

---------------------------------------------------------------------------------

#include<bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
 
const int maxn = 100009;
 
int L, R, v, seq[maxn], N;
ll cnt[maxn];
 
struct Node {
Node *l, *r;
ll add, sum;
Node() {
add = 0;
}
inline void pushdown() {
if(add) {
l->add += add;
r->add += add;
add = 0;
}
}
inline void update(int len) {
if(l) sum = l->sum + r->sum;
sum += add * len;
if(!l) add = 0;
}
} pool[maxn << 1], *pt = pool, *root;
 
void build(Node* t, int l, int r) {
if(l == r) {
t->sum = cnt[l];
} else {
int m = (l + r) >> 1;
build(t->l = pt++, l, m);
build(t->r = pt++, m + 1, r);
t->update(r - l + 1);
}
}
 
void modify(Node* t, int l, int r) {
if(L <= l && r <= R) {
t->add += v;
} else {
t->pushdown();
int m = (l + r) >> 1;
L <= m ? modify(t->l, l, m) : t->l->update(m - l + 1);
m < R ? modify(t->r, m + 1, r) : t->r->update(r - m);
}
t->update(r - l + 1);
}
 
ll query(Node* t, int l, int r) {
if(L <= l && r <= R) return t->sum;
int m = (l + r) >> 1;
t->pushdown();
t->l->update(m - l + 1); t->r->update(r - m);
return (L <= m ? query(t->l, l, m) : 0) + (m < R ? query(t->r, m + 1, r) : 0);
}
 
int main() {
int m; scanf("%d%d", &N, &m);
for(int i = 1; i <= N; i++) scanf("%d", seq + i);
cnt[0] = 0;
for(int i = 1; i <= N; i++) cnt[i] += cnt[i - 1] + seq[i];
build(root = pt++, 1, N);
while(m--) {
char s[10]; scanf("%s", s);
if(s[0] == 'M') {
int p, v; scanf("%d%d", &p, &v);
::v = v - seq[p];
seq[p] = v;
L = p; R = N;
modify(root, 1, N);
} else {
L = 1;
  scanf("%d", &R);
printf("%lld\n", query(root, 1, N));
}
}
return 0;
}

---------------------------------------------------------------------------------

3155: Preprefix sum

Time Limit: 1 Sec  Memory Limit: 512 MB
Submit: 765  Solved: 341
[Submit][Status][Discuss]

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

BZOJ 3155: Preprefix sum( 线段树 )的更多相关文章

  1. BZOJ3155:Preprefix sum(线段树)

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

  2. BZOJ 3155: Preprefix sum

    大意:给一个数组,先求出SUM[I],然后动态的求出1-I的SUM[I]的和, 这题得化公式: 树状数组维护两个和:SUM(A[I])(1<=I<=X); SUM(A[I]*(N-I+1) ...

  3. 3155: Preprefix sum

    3155: Preprefix sum https://www.lydsy.com/JudgeOnline/problem.php?id=3155 分析: 区间修改,区间查询,线段树就好了. 然后,这 ...

  4. Bzoj 2752 高速公路 (期望,线段树)

    Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时 ...

  5. 2021.08.09 P4868 Preprefix sum(树状数组)

    2021.08.09 P4868 Preprefix sum(树状数组) P4868 Preprefix sum - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 前缀和(pr ...

  6. BZOJ 3779: 重组病毒(线段树+lct+树剖)

    题面 escription 黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒.这种病毒的繁殖和变异能力极强.为了阻止这种病毒传播,某安全机构策划了一次实验,来研究这种病 ...

  7. BZOJ 2124等差子序列 线段树&&hash

    [题目描述 Description] 给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len& ...

  8. bzoj 2957 楼房重建 (线段树+思路)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2957 思路: 用分块可以很简单的过掉,但是这道题也可以用线段树写. 分类讨论左区间最大值对 ...

  9. BZOJ.3938.Robot(李超线段树)

    BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...

随机推荐

  1. SignaLR通信技术

    新建MVC项目 如果没有Signale需要使用NuGet安装Signalr namespace SignaLrDemo { public class ChatHub : Hub { public vo ...

  2. Python学习笔记 (2) :字符串输出、操作、格式化和日期、时间格式化

    一.字符串输出及运算 1.常用输出格式及方法 ')#单引号 ")#双引号 """)#三个引号 1234567890 1234567890 1234567890 ...

  3. java ee环境搭建

    1.安装java(tm)2 platform 2.下载安装Java EE SDK 版本:Java Platform,Enterprise Edition 7 SDK (with JDK 7u45) 下 ...

  4. web压缩gzip响应

    String data = "ggrgrgw4gergergregerge"; byte b[] = data.getBytes(); String gzipValue = req ...

  5. QT小技巧—更好管理项目(增加预编译头文件,并且指定moc文件的生成位置)good

    预编译加速编译 QT也可以像VS那样使用预编译头文件来加速编译器的编译速度.首先在.pro文件中加入: CONFIG += precompiled_header 然后定义需要预编译的头文件: PREC ...

  6. Failure [INSTALL_FAILED_OLDER_SDK]

    在AndroidManifest.xml 中把  <uses-sdk android:minSdkVersion="21" />的版本调节的低一点

  7. HDU 2215 Maple trees

    增量法的最小包围圈算法,不会…… #include <cstdio> #include <cstring> #include <iostream> #include ...

  8. Curling 2.0(dfs回溯)

    Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15567   Accepted: 6434 Desc ...

  9. Android ScrollView嵌套HorizontalScrollView 滑动问题 ScrollView包括GridView显示问题

    今天项目使用到ScrollView嵌套HorizontalScrollView,ScrollView里包括GridView,发现几个问题非常经典.在此记录: 问题1.ScrollView嵌套Horiz ...

  10. 用ToggleButton和ImageView实现不同状态下显示的切换

    靠,写的时候第一次因为把implements OnCheckedChangeListener这里实现的接口写错了,搞了很久, 后来发现又少了这两句错了 btn = (ToggleButton) fin ...