博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【UOJ 50】树状数组2
阅读量:4653 次
发布时间:2019-06-09

本文共 1290 字,大约阅读时间需要 4 分钟。

Description

如题,已知一个数列(下标从1开始计数),你需要进行下面两种操作:

1.将某区间每一个数,加上x

2.获取某一个数的值

Input

第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。

第二行包含N个用空格分隔的整数,第i个数字表示数列第i项的初始值。

接下来M行每行包含2或4个整数,表示一个操作,具体如下:

操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k

操作2: 格式:2 x 含义:输出第x个数的值

Output

输出包含若干行整数,即为所有操作2的结果。

Sample Input

5 51 5 4 2 31 2 4 22 31 1 5 -11 3 5 72 4

Sample Output

610

Hint

时间:1s 空间:128M

对于30%的数据:N<=8,M<=10

对于70%的数据:N<=10000,M<=10000

对于100%的数据:N<=100000,M<=100000

 

题解:emm树状数组变形qwq

#include
#include
#include
#include
#include
#include
#include
#include
typedef long long ll;using namespace std;ll tree[500005];int n,m,x,y;ll k;int low(int x){ return x&(-x);}void add(int x, ll num) { while(x<=n){ tree[x]+=num; x+=low(x); }}ll biu(int x){ ll ans = 0; while(x){ ans+=tree[x]; x-=low(x); } return ans;}int main() { freopen("50.in","r",stdin); freopen("50.out","w",stdout); scanf("%d %d",&n,&m); ll last=0,now; for(int i=1;i<=n;i++){ scanf("%lld", &now); add(i,now-last); last=now; } int op; while(m--){ scanf("%d", &op); if(op==1){ scanf("%d %d %lld",&x,&y,&k); add(x,k); add(y+1,-k); } if(op==2){ scanf("%d",&x); printf("%lld\n", biu(x)); } } return 0;}

 

转载于:https://www.cnblogs.com/wuhu-JJJ/p/11195842.html

你可能感兴趣的文章
解决Cacti监控图像断断续续问题
查看>>
结构体的传参理解成员的存储方式
查看>>
python 进程与线程(理论部分)
查看>>
什么是API
查看>>
Java反射中method.isBridge() 桥接方法
查看>>
[shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证
查看>>
强名称程序集(strong name assembly)——为程序集赋予强名称
查看>>
1028. List Sorting (25)
查看>>
BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划
查看>>
ubuntu 重启命令,ubuntu 重启网卡方法
查看>>
Linux的学习:
查看>>
JavaScript中的原型继承原理
查看>>
Python logger模块
查看>>
jquery控制css的display(控制元素的显示与隐藏)
查看>>
关于python做人工智能的一个网页(很牛逼)
查看>>
判断控件的CGRect是否重合,获取控件的最大XY值
查看>>
POJ-1128 Frame Stacking
查看>>
python第三十九课——面向对象(二)之初始化属性
查看>>
GET请求在Tomcat中的传递及URI传递
查看>>
Far manager界面混乱问题解决
查看>>