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相关推荐

  1. 10.20 Bzoj 3155 Preprefix sum(树状数组)

    Bzoj 3155 Preprefix sum 题意: 长度为n的序列,m次操作 操作有两种:1.询问前缀和的前缀和:2.修改某个ai的值 解题思路: S1=a1S_1=a_1S1​=a1​ S2=a ...

  2. 3155: Preprefix sum

    传说可以用树状数组,不过因为本人比较菜,于是上无脑差分数组+线段树. 容易发现,当一个数i增加x时,会使前缀和的前缀和j(j>=i)增加(j-i+1)*x.那么可以想象成i~n段加x,i+1~n ...

  3. BZOJ3155: Preprefix sum【线段树】

    3155: Preprefix sum emmm,没什么好说的,线段树区间加. #include<cstdio> using namespace std; const int MAXN=1 ...

  4. 【BZOJ 3155】Preprefix sum(树状数组)

    显然是不能直接开两个树状数组维护 前缀和,前缀和的前缀和.因为一旦对a[i]进行修改,将会影响许多位前缀和的前缀和 我们考虑对式子变一下形 Qi =S1+S2+S3+...+Si =a1+a1+a2+ ...

  5. bzoj3155 Preprefix sum 线段树

    Description Solution 只会写水题了.. 可以发现每次改a[x]就是在改[x,n]的前缀和s,那么线段树区间修改区间查询即可 Code #include <stdio.h> ...

  6. BZOJ3155 Preprefix sum

    一个数相当于给他后边的前缀和序列加了一个等差数列 直接线段树 #include<iostream> #include<cstdlib> #include<cstdio&g ...

  7. BZOJ3155:Preprefix sum(线段树)

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

  8. BZOJ3155Preprefix sum

    3155: Preprefix sum Time Limit: 1 Sec  Memory Limit: 512 MB Submit: 1288  Solved: 588 Description In ...

  9. 2019.5.summary

    2019.5.1 CF C. Prefix Sum Primes 感觉CF就是训练妳如何养成对题目强大的YY能力的QAQ 我们构造 如果只有一种,没辙,只能这样放 否则先放一个2,再放一个1 接下来把 ...

最新文章

  1. 实用 | 宝藏男孩教你如何魔改 Grafana 主题!
  2. dubbo内置哪几种服务容器_dubbo启动服务之容器(Container)
  3. Asp2.0下Login.Aspx页面和VS2005登陆控件冲突问题!
  4. SVM支持向量机,我用到的自学材料
  5. Oracle DB 优化-AWR及相关内容
  6. eclipse和myeclipse集成Xjad
  7. JAVA服务器获取手机设备的IP地址
  8. 【webrtc0419 点对点视频聊天功能】
  9. python量化羊驼法则
  10. 13 年的 Bug 调试经验总结(来自蜗牛学院)
  11. 网吧机子dns服务器没有响应,网吧找不到的服务器dns地址
  12. numpy数组中元素单个选取或部分选取
  13. 普通话-命题说话1-10
  14. 人脸检测or五官检测
  15. 细数红帽linux系统下的各个文件夹作用
  16. CSS属性 – cursor
  17. 类与队列的简单实战爬虫
  18. 数组排列组合问题——BACKTRACKING
  19. 概率论与数理统计 —— 概率论的基本概念
  20. Java语言int型与byte型数组的转换

热门文章

  1. 光学中的计算机原理,光学传感器的工作原理
  2. exFAT文件系统2
  3. poj_1974,最长回文字串manacher
  4. 生物-海底人:海底人
  5. 如何使用CAD图块功能制图呢?
  6. Jenkins+Pipeline流水线+Docker实现自动化CI/CD发布Java项目
  7. 《放羊的星星》经典台词
  8. 网站后台管理-登录页面
  9. matlab中数据保存到dat格式的文件
  10. 为什么重视安全的公司都在用SSL安全证书?