luoguP4868 Preprefix sum
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的更多相关文章
- [bzoj3155]Preprefix sum(树状数组)
3155: Preprefix sum Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 1183 Solved: 546[Submit][Status] ...
- BZOJ 3155: Preprefix sum( 线段树 )
刷刷水题... 前缀和的前缀和...显然树状数组可以写...然而我不会, 只能写线段树了 把改变成加, 然后线段树维护前缀和, 某点p加, 会影响前缀和pre(x)(p≤x≤n), 对[p, n]这段 ...
- Preprefix sum BZOJ 3155 树状数组
题目描述 前缀和(prefix sum)Si=∑k=1iaiS_i=\sum_{k=1}^i a_iSi=∑k=1iai. 前前缀和(preprefix sum) 则把SiS_iSi作为原序列 ...
- 3155: Preprefix sum
3155: Preprefix sum https://www.lydsy.com/JudgeOnline/problem.php?id=3155 分析: 区间修改,区间查询,线段树就好了. 然后,这 ...
- 差分+树状数组【p4868】Preprefix sum
Description 前缀和(prefix sum)\(S_i=\sum_{k=1}^i a_i\). 前前缀和(preprefix sum) 则把\(S_i\)作为原序列再进行前缀和.记再次求得前 ...
- 树状数组【bzoj3155】: Preprefix sum
3155: Preprefix sum 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3155 把给出的a_i当成查分数组d_i做就可以了 ...
- 2021.08.09 P4868 Preprefix sum(树状数组)
2021.08.09 P4868 Preprefix sum(树状数组) P4868 Preprefix sum - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 前缀和(pr ...
- BZOJ3155: Preprefix sum
题解: 写过树状数组搞区间修改和区间求和的就可以秒出吧... 代码: #include<cstdio> #include<cstdlib> #include<cmath& ...
- BZOJ 3155: Preprefix sum
大意:给一个数组,先求出SUM[I],然后动态的求出1-I的SUM[I]的和, 这题得化公式: 树状数组维护两个和:SUM(A[I])(1<=I<=X); SUM(A[I]*(N-I+1) ...
随机推荐
- 使用airodump-ng扫描网络
执行命令 root@sch01ar:~# airodump-ng wlan0mon 参数介绍: BSSID:表示无线AP的Mac地址 PWR:网卡报告的信号水平 Beacons:无线AP发出的通告编号 ...
- Pandas:表计算与数据分析
目录 Pandas之Series Pandas之DataFrame 一.pandas简单介绍 1.pandas是一个强大的Python数据分析的工具包.2.pandas是基于NumPy构建的. 3.p ...
- bash shell笔记6 脚本控制
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/522415 知 ...
- A Look at the Razor View Engine in ASP.NET MVC
The biggest architectural difference that exists between ASP.NET MVC and ASP.NET Web Forms is the ne ...
- 把Oracle的数据导入到SQL2012中 导出数据--SSIS
在ORACLE表和SQL Server表之间'转换'那步很重要,可以改变默认的字段数据类型,如image->text,decimal->int number ->int (注意设置 ...
- 3-1 Git下载与安装
https://desktop.github.com/
- Gym - 101128C:Canvas Painting
这个就是哈夫曼树哇~ 我们仨英语太差了,跟榜时候才看出来是哈夫曼树雾 一个优先队列就可以搞定 #include <cstdio> #include <algorithm> #i ...
- 2014蓝桥杯B组初赛试题《奇怪的分式》
题目描述: 上小学的时候,小明经常自己发明新算法.一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png) ...
- 什么是Kali Linux?
什么是Kali Linux? Kali Linux是一个基于Debian的Linux发行版,旨在实现高级渗透测试和安全审计.Kali包含数百种工具,适用于各种信息安全任务,如渗透测试,安全研究,计算机 ...
- 模板模式和Comparable类
模板模式中,父类规定好了一些算法的流程,并且空出一些步骤(方法)留给子类填充 Java的数组类中静态方法sort()就是一个模板,它空出了一个compareTo的方法,留给子类填充,用来规定什么是大于 ...