Luogu 4868 Preprefix sum
类似于树状数组维护区间的方法。
每一次询问要求$\sum_{i = 1}^{n}\sum_{j = 1}^{i}a_j$。
展开一下:
$\sum_{i = 1}^{n}\sum_{j = 1}^{i}a_j = \sum_{i = 1}^{n}a_i * (n - i + 1) = (n + 1)\sum_{i = 1}^{n}a_i - \sum_{i = 1}^{n}a_i * i$
用两个树状数组分别维护一下$\sum_{i = 1}^{n}a_i$和$\sum_{i = 1}^{n}a_i * i$就可以了。
时间复杂度$O((n + q)logn)$。
Code:
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll; const int N = 1e5 + ; int n, qn;
ll a[N]; template <typename T>
inline void read(T &X) {
X = ; char ch = ; T op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} namespace Bit {
ll sum1[N], sum2[N]; #define lowbit(p) (p & (-p)) inline void modify(int p, ll v, ll *arr) {
for(; p <= n; p += lowbit(p))
arr[p] += v;
} inline ll query(int p, ll *arr) {
ll res = 0LL;
for(; p > ; p -= lowbit(p))
res += arr[p];
return res;
} } using namespace Bit; int main() {
read(n), read(qn);
for(int i = ; i <= n; i++) {
read(a[i]);
modify(i, a[i], sum1);
modify(i, 1LL * a[i] * i, sum2);
} for(char op[]; qn--; ) {
scanf("%s", op);
if(op[] == 'Q') {
int x; read(x);
printf("%lld\n", 1LL * (x + ) * query(x, sum1) - query(x, sum2));
} else {
int x; ll v;
read(x), read(v);
modify(x, -a[x], sum1), modify(x, -1LL * a[x] * x, sum2);
modify(x, v, sum1), modify(x, v * x, sum2);
a[x] = v;
}
} return ;
}
Luogu 4868 Preprefix sum的更多相关文章
- 2021.08.09 P4868 Preprefix sum(树状数组)
2021.08.09 P4868 Preprefix sum(树状数组) P4868 Preprefix sum - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 前缀和(pr ...
- [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做就可以了 ...
- 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) ...
随机推荐
- QT下的QProcess调用外部程序
头文件widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class Widget; ...
- 本地连接出现"已启用检测该状态的服务"解决方法、方案
1.运行 输出dcomcnfg 2.组件服务-计算机-我的电脑-DCOM配置-netprofm 3.右键属性-安全-启动和激活权限-自定义 4.编辑-添加-输入对象名称来选择-输入“LOCAL SER ...
- 51nod 1681
题目 神犇题解 这题挺神的..思路很巧妙 首先想到DFS序(毕竟是子树问题),这道题可以转化成:我们对于每一个节点的子树区间去看,两棵树同一节点的这个子树区间有多少个相同元素,设个数为x,那么这个点的 ...
- 算法(Algorithms)第4版 练习 1.5.5
对于quick-find,对每个输入数据对,其最少的循环次数为N(sites) 故对于109 sites和106 input pairs,其总的指令次数为:sum = 10^9 * 10^6 * 10 ...
- mysql 启动服务错误
在博客上看到下面这个文档解决了问题.推荐可以看下. http://blog.csdn.net/yaowuliu/article/details/51133279
- 分享知识快乐自己:Layui 常用样式
下载 样式包 Layui layer 引入 js 及 样式: <link rel="stylesheet" href="${ctx}/static/layui/ ...
- 关于ios::sync_with_stdio(false);和 cin.tie(0)加速c++输入输出流
原文地址:http://www.hankcs.com/program/cpp/cin-tie-with-sync_with_stdio-acceleration-input-and-output.ht ...
- png8 png24 png32
解释 PNG8 : 8位的PNG最多支持256(2的8次方)种颜色,8位的PNG支持不透明.索引透明.alpha透明. PNG24 : 支持2的24次方种颜色,表现为不透明.PS导出PNG24是会根据 ...
- 关于pyhton中的__xxx__格式的方法与变量的理解
python中类似__xx__的方法和变量是python系统内定义的方法和变量,都是具有特殊意义的基础变量和方法,一般不要擅自使用,除非知道自己在干什么. 具体查看python内置模块builtins ...
- sphinx:python项目文档自动生成
Sphinx: 发音: DJ音标发音: [sfiŋks] KK音标发音: [sfɪŋks] 单词本身释义: an ancient imaginary creature with a lion's bo ...