https://www.luogu.org/problemnew/show/P4868

线段树上加等差数列,基础区间修改单点查询

等差数列具有可加性,当在同一段区间内时,首项相加公差相加即可

#include <bits/stdc++.h>
using namespace std; template <typename T>
inline void read(T &f) {
f = 0; T fu = 1; char c = getchar();
while(c < '0' || c > '9') {if(c == '-') fu = -1; c = getchar();}
while(c >= '0' && c <= '9') {f = (f << 3) + (f << 1) + (c & 15); c = getchar();}
f *= fu;
} typedef long long ll;
const int N = 100000 + 10; struct Tree {
ll val[N << 2], sx[N << 2], gc[N << 2]; void update(int u) {
val[u] = val[u << 1] + val[u << 1 | 1];
} void pushdown(int u, int l, int r) {
if(sx[u] || gc[u]) {
int mid = (l + r) >> 1;
ll llen = (mid - l + 1);
ll rlen = (r - mid);
val[u << 1] += (sx[u] + sx[u] + gc[u] * (llen - 1)) * llen / 2ll;
val[u << 1 | 1] += (sx[u] * 2 + gc[u] * llen * 2 + gc[u] * (rlen - 1)) * rlen / 2ll;
sx[u << 1] += sx[u]; sx[u << 1 | 1] += sx[u] + gc[u] * llen;
gc[u << 1] += gc[u]; gc[u << 1 | 1] += gc[u];
sx[u] = gc[u] = 0;
}
} void change(int u, int l, int r, int L, int R, ll x, ll y) {
if(l <= L && R <= r) {
int len = (R - L + 1); x += (L - l) * y;
val[u] += (x + x + (len - 1) * y) * len / 2ll;
sx[u] += x; gc[u] += y;
return;
}
pushdown(u, L, R);
int mid = (L + R) >> 1;
if(mid >= l) change(u << 1, l, r, L, mid, x, y);
if(mid + 1 <= r) change(u << 1 | 1, l, r, mid + 1, R, x, y);
update(u);
} ll query(int u, int l, int r, int L, int R) {
if(l <= L && R <= r) return val[u];
pushdown(u, L, R); int mid = (L + R) >> 1;
ll ans = 0;
if(mid >= l) ans += query(u << 1, l, r, L, mid);
if(mid + 1 <= r) ans += query(u << 1 | 1, l, r, mid + 1, R);
return ans;
}
}p; char c[12];
int w[N];
int n, m; int main() {
read(n); read(m);
for(int i = 1; i <= n; i++) {
read(w[i]);
p.change(1, i, n, 1, n, w[i], w[i]);
}
for(int i = 1; i <= m; i++) {
scanf("%s", c + 1);
if(c[1] == 'Q') {
int a; read(a);
printf("%lld\n", p.query(1, a, a, 1, n));
} else {
int a, b; read(a); read(b);
p.change(1, a, n, 1, n, -w[a], -w[a]);
w[a] = b;
p.change(1, a, n, 1, n, w[a], w[a]);
}
}
return 0;
}

luoguP4868 Preprefix sum的更多相关文章

  1. [bzoj3155]Preprefix sum(树状数组)

    3155: Preprefix sum Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 1183  Solved: 546[Submit][Status] ...

  2. BZOJ 3155: Preprefix sum( 线段树 )

    刷刷水题... 前缀和的前缀和...显然树状数组可以写...然而我不会, 只能写线段树了 把改变成加, 然后线段树维护前缀和, 某点p加, 会影响前缀和pre(x)(p≤x≤n), 对[p, n]这段 ...

  3. Preprefix sum BZOJ 3155 树状数组

    题目描述 前缀和(prefix sum)Si=∑k=1iaiS_i=\sum_{k=1}^i a_iSi​=∑k=1i​ai​. 前前缀和(preprefix sum) 则把SiS_iSi​作为原序列 ...

  4. 3155: Preprefix sum

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

  5. 差分+树状数组【p4868】Preprefix sum

    Description 前缀和(prefix sum)\(S_i=\sum_{k=1}^i a_i\). 前前缀和(preprefix sum) 则把\(S_i\)作为原序列再进行前缀和.记再次求得前 ...

  6. 树状数组【bzoj3155】: Preprefix sum

    3155: Preprefix sum 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3155 把给出的a_i当成查分数组d_i做就可以了 ...

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

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

  8. BZOJ3155: Preprefix sum

    题解: 写过树状数组搞区间修改和区间求和的就可以秒出吧... 代码: #include<cstdio> #include<cstdlib> #include<cmath& ...

  9. BZOJ 3155: Preprefix sum

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

随机推荐

  1. python爬西刺代理

    爬IP代码 import requests import re import dauk from bs4 import BeautifulSoup import time def daili(): p ...

  2. ubuntu16.04 双网卡绑定

    ubuntu 16.04 双网卡绑定仅仅需要配置/etc/network/interfaces 添加标记内容即可 apt-get install ifenslave 默认已经安装

  3. 主表当中明细表字段的金额计算问题,操作控件是在gridview+aspnetPage

    做这个例子,主要是我在工作当中遇到一个主表的明细表的操作计算问题,也用了不少时间.操作计算的方式是这样的. 这个功能是在.net语言当中实现,操作过程当点击添加行,添加第一行时,当我输入金额的时候,累 ...

  4. 什么是jsonp?——使用jsonp解决跨域请求问题

    我们在使用ajax请求的时候经常会产生跨域问题,这是由于浏览器的同源策略导致的.所谓同源,即域名.协议.端口均相同,否则不管是静态页面还是动态网页或者web服务都无法通过ajax正常请求.有时候,我们 ...

  5. ocx控件针对网页刷新和关闭分别进行区分处理

    当ocx加载在网页上时,如果对网页执行F5刷新事件,ocx控件会销毁ocx的窗口类,但是ocx的APP类是不会销毁的. 只有当网页被关闭时,才销毁app类. --------------------- ...

  6. .Net Core 迁移之坑二 《ToString("F") 输出与windows不一致问题》

    大家都知道 ToString("F") 是干什么的 这里我还是介绍一下 格式字符串采用以下形式:Axx,其中 A 为格式说明符,指定格式化类型,xx 为精度说明符,控制格式化输出的 ...

  7. JDK和CGLIB生成动态代理类的区别(转)

     关于动态代理和静态代理 当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象. 按照代理对象的创建时期不同,可以分为两种: 静态代 ...

  8. 【原创】2. MYSQL++之Connect类型

    mysqlpp:: Connect类型主要负责连接事宜,这是在所有开始mysql操作之前必须进行的(这是句废话). 该类型的主要的结果如下所示 mysqlpp::OpeitonalExceptions ...

  9. c++多线程编程(一)

    C++本身并没有提供任何多线程机制,但是在windows下,我们可以调用SDK win32 api来编写多线程的程序,下面就此简单的讲一下: 创建线程的函数 HANDLE CreateThread( ...

  10. 分布式文件系统MFS(moosefs)实现存储共享

    分布式文件系统MFS(moosefs)实现存储共享(第二版) 作者:田逸(sery@163.com) 由于用户数量的不断攀升,我对访问量大的应用实现了可扩展.高可靠的集群部署(即lvs+keepali ...