bzoj 3155 Preprefix sum
3155: Preprefix sum
Time Limit: 1 Sec Memory Limit: 512 MB
Submit: 1208 Solved: 553
[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
【分析】
大半夜水一道树状数组感觉还是很好哒…
我们只需要维护两个树状数组,一个cp[i],维护前缀和,另一个是cpp[i],维护sigema (n-i+1)*a[i]。到时候加加减减乱搞一下就好了。
算了…举个例子吧
比如 1 2 3 4 5 ,我们要求ans[3]
我们维护了 cp[3]=1+2+3
还维护了 cpp[3]=5*1+4*2+3*3
那么答案就是 cpp[3]-2*cp[3],很好理解吧。(2就是5-3得到的嘛)
【代码】
//bzoj 3155 Preprefix sum
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define ll long long
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int mxn=100006;
ll n,m;
char ch[10];
ll a[mxn],cp[mxn],cpp[mxn];
inline ll lowbit(ll x) {return x&(-x);}
inline void add(ll x,ll v)
{ll tmp=(n-x+1)*v;for(ll i=x;i<=n;i+=lowbit(i))cp[i]+=v,cpp[i]+=tmp;
}
inline ll gets(ll x)
{ll sum=0,ot=0;for(ll i=x;i;i-=lowbit(i))sum+=cpp[i],ot+=cp[i];sum-=ot*(n-x);return sum;
}
int main()
{ll i,j,x,y;scanf("%lld%lld",&n,&m);fo(i,1,n){scanf("%lld",&a[i]);add(i,a[i]);}while(m--){scanf("%s",ch);if(ch[0]=='Q'){scanf("%lld",&x);printf("%lld\n",gets(x));}else{scanf("%lld%lld",&x,&y);add(x,y-a[x]);a[x]=y;}}return 0;
}
bzoj 3155 Preprefix sum相关推荐
- 10.20 Bzoj 3155 Preprefix sum(树状数组)
Bzoj 3155 Preprefix sum 题意: 长度为n的序列,m次操作 操作有两种:1.询问前缀和的前缀和:2.修改某个ai的值 解题思路: S1=a1S_1=a_1S1=a1 S2=a ...
- 3155: Preprefix sum
传说可以用树状数组,不过因为本人比较菜,于是上无脑差分数组+线段树. 容易发现,当一个数i增加x时,会使前缀和的前缀和j(j>=i)增加(j-i+1)*x.那么可以想象成i~n段加x,i+1~n ...
- BZOJ3155: Preprefix sum【线段树】
3155: Preprefix sum emmm,没什么好说的,线段树区间加. #include<cstdio> using namespace std; const int MAXN=1 ...
- 【BZOJ 3155】Preprefix sum(树状数组)
显然是不能直接开两个树状数组维护 前缀和,前缀和的前缀和.因为一旦对a[i]进行修改,将会影响许多位前缀和的前缀和 我们考虑对式子变一下形 Qi =S1+S2+S3+...+Si =a1+a1+a2+ ...
- bzoj3155 Preprefix sum 线段树
Description Solution 只会写水题了.. 可以发现每次改a[x]就是在改[x,n]的前缀和s,那么线段树区间修改区间查询即可 Code #include <stdio.h> ...
- BZOJ3155 Preprefix sum
一个数相当于给他后边的前缀和序列加了一个等差数列 直接线段树 #include<iostream> #include<cstdlib> #include<cstdio&g ...
- BZOJ3155:Preprefix sum(线段树)
Description Input 第一行给出两个整数N,M.分别表示序列长度和操作个数 接下来一行有N个数,即给定的序列a1,a2,....an 接下来M行,每行对应一个操作,格式见题目描述 Out ...
- BZOJ3155Preprefix sum
3155: Preprefix sum Time Limit: 1 Sec Memory Limit: 512 MB Submit: 1288 Solved: 588 Description In ...
- 2019.5.summary
2019.5.1 CF C. Prefix Sum Primes 感觉CF就是训练妳如何养成对题目强大的YY能力的QAQ 我们构造 如果只有一种,没辙,只能这样放 否则先放一个2,再放一个1 接下来把 ...
最新文章
- 实用 | 宝藏男孩教你如何魔改 Grafana 主题!
- dubbo内置哪几种服务容器_dubbo启动服务之容器(Container)
- Asp2.0下Login.Aspx页面和VS2005登陆控件冲突问题!
- SVM支持向量机,我用到的自学材料
- Oracle DB 优化-AWR及相关内容
- eclipse和myeclipse集成Xjad
- JAVA服务器获取手机设备的IP地址
- 【webrtc0419 点对点视频聊天功能】
- python量化羊驼法则
- 13 年的 Bug 调试经验总结(来自蜗牛学院)
- 网吧机子dns服务器没有响应,网吧找不到的服务器dns地址
- numpy数组中元素单个选取或部分选取
- 普通话-命题说话1-10
- 人脸检测or五官检测
- 细数红帽linux系统下的各个文件夹作用
- CSS属性 – cursor
- 类与队列的简单实战爬虫
- 数组排列组合问题——BACKTRACKING
- 概率论与数理统计 —— 概率论的基本概念
- Java语言int型与byte型数组的转换