2018年全国多校算法寒假训练营练习比赛(第五场) Big Water Problem(树状数组)
2018-02-26 02:02
453 查看
链接:https://www.nowcoder.com/acm/contest/77/B
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
示例1
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
给一个数列,会有多次询问,对于每一次询问,会有两种操作: 1:给定两个整数x, y, 然后在原数组的第x位置上加y; 2:给定两个整数l,r,然后输出数组从第l位加到第r位数字的和并换行输入描述:
第一行有两个整数n, m(1 <= n, m <= 100000)代表数列的长度和询问的次数 第二行n个数字,对于第i个数字a[i],(0<=a[i]<=100000)。 接下来m行,每一行有三个整数f, x, y。第一个整数f是1或者是2,代表操作类型,如果是1,接下来两个数x,y代表第x的位置上加y,如果是2,则求x到y的和,保证数据合法。
输出描述:
输出每次求和的结果并换行
示例1
输入
10 2 1 2 3 4 5 6 7 8 9 10 1 1 9 2 1 10
输出
64
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define MAX 100010 #define ll long long using namespace std; ll c[MAX],d[MAX],a[MAX]; int n,q; int lowbit(int x) { return x&(-x); } void update1(int x,ll u) { for (int i = x;i<=n;i+=lowbit(i)) { c[i]+=u; } } void update2(int x,ll u) { for (int i=x;i<=n;i+=lowbit(i)) { d[i]+=u; } } ll sum1(int x) { ll s = 0; for (int i=x;i>0;i-=lowbit(i)) { s+=c[i]; } return s; } ll sum2(int x) { ll s=0; for(int i=x;i>0;i-=lowbit(i)) { s+= d[i]; } return s; } int main() { while(scanf("%d %d",&n,&q)!=EOF) { memset(a,0,sizeof(a)); memset(c,0,sizeof(c)); memset(d,0,sizeof(d)); ll t; for(int i=1;i<=n;i++) { scanf("%lld",&t); a[i]=a[i-1]+t; } int s; while(q--) { scanf("%d",&s); int x,y; ll z; if (s==2) { scanf("%d %d",&x,&y); ll t1=a[y]-a[x-1]; ll t2=(y+1)*sum1(y)-x*sum1(x-1); ll t3=sum2(y)-sum2(x-1); pr 4000 intf("%lld\n",t1+t2-t3); } else { scanf("%d %lld",&x,&z); update1(x,z); update1(x+1,-z); update2(x,x*z); update2(x+1,-(x+1)*z); } } } return 0; }
相关文章推荐
- 牛客网NowCoder 2018年全国多校算法寒假训练营练习比赛(第五场)A.逆序数 B.Big Water Problem(线段树-区间查询求和和单点更新) F.The Biggest Water Problem H.Tree Recovery(线段树-区间查询求和和区间更新)
- 2018年全国多校算法寒假训练营练习比赛(第五场)B Big Water Problem
- 2018年全国多校算法寒假训练营练习比赛(第五场)F-The Biggest Water Problem
- 2018年全国多校算法寒假训练营练习比赛(第五场)The Biggest Water Problem
- 2018年全国多校算法寒假训练营练习比赛(第五场)题解 F The Biggest Water Problem
- 2018年全国多校算法寒假训练营练习比赛(第五场) (树状数组模板)
- 2018年全国多校算法寒假训练营练习比赛(第五场)A 逆序数
- 2018年全国多校算法寒假训练营练习比赛(第五场) G 送分啦-QAQ HDU 2516 斐波拉底博弈
- 2018年全国多校算法寒假训练营练习比赛(第五场)A:逆序数(小技巧)
- 2018年全国多校算法寒假训练营练习比赛(第一场) Problem:H
- 2018年全国多校算法寒假训练营练习比赛(第五场) C 字符串的问题(substr,find的用法)
- 2018年全国多校算法寒假训练营练习比赛(第五场)题解
- 2018年全国多校算法寒假训练营练习比赛(第五场) G 送分啦-QAQ HDU 2516 斐波拉底博弈
- 2018年全国多校算法寒假训练营练习比赛(第五场)
- 2018年全国多校算法寒假训练营练习比赛(第五场) G 送分啦-QAQ HDU 2516 斐波拉底博弈
- 2018年全国多校算法寒假训练营练习比赛(第五场) C、字符串的问题
- 2018年全国多校算法寒假训练营练习比赛(第五场)B(简单线段树)
- 2018年全国多校算法寒假训练营练习比赛(第五场)题解
- 2018年全国多校算法寒假训练营练习比赛(第五场)比赛题目题解
- 2018年全国多校算法寒假训练营练习比赛(第五场)题解 H Tree Recovery