P3368 【模板】树状数组 2

题目描述

如题,已知一个数列,你需要进行下面两种操作:

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

2.求出某一个数的和

输入输出格式

输入格式:

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

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

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

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

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

输出格式:

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

输入输出样例

输入样例#1:

  1. 5 5
  2. 1 5 4 2 3
  3. 1 2 4 2
  4. 2 3
  5. 1 1 5 -1
  6. 1 3 5 7
  7. 2 4
输出样例#1:

  1. 6
  2. 10

说明

时空限制:1000ms,128M

数据规模:

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

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

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

样例说明:

故输出结果为6、10

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. const int N = ;
  5.  
  6. int n,m,a;
  7. int ch,x,y,v;
  8. int sum[N];//树状数组
  9.  
  10. int lowbit(int x)
  11. {
  12. return x&(-x);
  13. }
  14.  
  15. void update(int p,int v) //将第P个数增加v
  16. {
  17. while(p<=n)
  18. {
  19. sum[p] += v;
  20. p += lowbit(p);
  21. }
  22. }
  23.  
  24. int query(int p) //查询第p个点的值是多少
  25. {
  26. int ans=;
  27. while(p)
  28. {
  29. ans += sum[p];
  30. p -= lowbit(p);
  31. }
  32. return ans;
  33. }
  34.  
  35. int main()
  36. {
  37. ios::sync_with_stdio(false) ;
  38. cin>>n>>m;
  39. int last=;
  40. for (int i=;i<=n;i++)
  41. {
  42. cin>>a;
  43. update(i,a-last); //建树
  44. last = a;
  45. /*
  46. 这里运用了差分思想,假设原本的数据存在a数组中,
  47. 那么c数组储存的就是c[i]=a[i]-a[i-1],如果c[1]=a[1],那么很明显
  48. a[i]=c[i]+c[i-1]+c[i-2]+...+c[2]+c[1].
  49. 这样我们每次单点查询的时候只要加上c数组的前缀就可以了。
  50. */
  51. }
  52. for (int i=;i<=m;++i)
  53. {
  54. cin>>ch;
  55. if (ch==) //区间修改
  56. {
  57. cin>>x>>y>>v;
  58. update(x,v);
  59. update(y+,-v);
  60. }
  61. if (ch==) //单点查询
  62. {
  63. cin>>x;
  64. cout<<query(x)<<endl;
  65. }
  66. }
  67. return ;
  68. }

更新模板

  1. #include<cstdio>
  2. int sum[];
  3. int n,m,last = ;
  4.  
  5. void update(int p,int v) {
  6. for (; p<=n; p+=p&(-p)) sum[p] += v;
  7. }
  8. int query(int p) {
  9. int ans = ;
  10. for (; p; p-=p&(-p)) ans += sum[p];
  11. return ans;
  12. }
  13.  
  14. int main()
  15. {
  16. scanf("%d%d",&n,&m);
  17. for (int a,i=; i<=n; ++i)
  18. {
  19. scanf("%d",&a);
  20. update(i,a-last);
  21. last = a;
  22. }
  23. for (int x,y,z,a,i=; i<=m; ++i)
  24. {
  25. scanf("%d",&a);
  26. if (a==) //区间修改
  27. {
  28. scanf("%d%d%d",&x,&y,&z);
  29. update(x,z);
  30. update(y+,-z);
  31. }
  32. else //单点查询
  33. {
  34. scanf("%d",&x);
  35. printf("%d\n",query(x));
  36. }
  37. }
  38. return ;
  39. }

P3368 【模板】树状数组 2(区间增减,单点查询)的更多相关文章

  1. hdu1556树状数组的区间更新单点查询

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  2. 洛谷 P3368 【模板】树状数组 2(区间修改点查询)

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的值 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  3. POJ 2155 Matrix 【二维树状数组】(二维单点查询经典题)

    <题目链接> 题目大意: 给出一个初始值全为0的矩阵,对其进行两个操作. 1.给出一个子矩阵的左上角和右上角坐标,这两个坐标所代表的矩阵内0变成1,1变成0. 2.查询某个坐标的点的值. ...

  4. poj3468树状数组的区间更新,区间求和

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 47174   ...

  5. 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间

    从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...

  6. 【树状数组】区间出现偶数次数的异或和(区间不同数的异或和)@ codeforce 703 D

    [树状数组]区间出现偶数次数的异或和(区间不同数的异或和)@ codeforce 703 D PROBLEM 题目描述 初始给定n个卡片拍成一排,其中第i个卡片上的数为x[i]. 有q个询问,每次询问 ...

  7. [模板] 树状数组 (C++ class)

    闲来无事(其实是打了两三道树状数组题),写了个树状数组模板…… /* Author: hotwords */ template<typename tp> class BinTree { p ...

  8. 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】

    模拟题,可以用树链剖分+线段树维护. 但是学了一个厉害的..树状数组的区间修改与区间查询.. 分割线里面的是转载的: ----------------------------------------- ...

  9. 2018中国大学生程序设计竞赛 - 网络选拔赛 1010 YJJ's Salesman 【离散化+树状数组维护区间最大值】

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6447 YJJ's Salesman Time Limit: 4000/2000 MS (Java/O ...

  10. bzoj 2819 Nim dfn序+树状数组维护区间异或值

    题目大意 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...

随机推荐

  1. Failed to read Class-Path attribute from manifest of jar file:/XXX问题

    java.lang.IllegalStateException: Failed to read Class-Path attribute from manifest of jar file:/XXX ...

  2. Debian下Cannot set LC_CTYPE to default locale: No such file or directory解决方法

    把语言环境变量改为英文 将Ubuntu系统语言环境改为英文的en_US.UTF-8 查看当前系统语言环境 locale 编辑配置文件,将zh_US.UTF-8改为en_US.UTF-8,zh改为en ...

  3. BZOJ3769:BST again(记忆化搜索DP)

    Description 求有多少棵大小为n的深度为h的二叉树.(树根深度为0:左右子树有别:答案对1000000007取模) Input 第一行一个整数T,表示数据组数. 以下T行,每行2个整数n和h ...

  4. 【[HAOI2015]树上染色】

    这道题真是非常神仙 第一眼看到题面肯定能想到状态是\(dp[i][j]\)表示\(i\)这棵子树里染了\(j\)个黑点的最大值 最大值? 什么最大值,之后就会发现这个样子完全没有办法转移 所以我们考虑 ...

  5. POJ3068 "Shortest" pair of paths

    嘟嘟嘟 题目大意:一个有向图,每一条边有一个边权,求从节点\(0\)到\(n - 1\)的两条不经过同一条边的路径,并且边权和最小. 费用流板子题. 发个博客证明一下我写了这题. #include&l ...

  6. ZooKeeper学习之路 (五)ZooKeeper API的简单使用 增删改查

    zookeeper文件系统的增删改查 public class ZKDemo1 { private static final String CONNECT_STRING = "hadoop1 ...

  7. E、CSL 的魔法 【模拟】 (“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)

    题目传送门:https://ac.nowcoder.com/acm/contest/551#question 题目描述 有两个长度为 n 的序列,a0,a1,…,an−1a0,a1,…,an−1和 b ...

  8. Springboot时间参数格式化

    @Configuration public class DateTimeFormatConfiguration extends WebMvcConfigurerAdapter { @Value(val ...

  9. HeapAnalyzer分析工具

    HeapAnalyzer分析工具 由于jvisualvm或jmap生成的dump文件太大,常常需要用到dump文件分析工具对dump文件进行分析.HeapAnalyzer通过分析heapdump文件, ...

  10. Java性能监控

    Java性能监控 上次介绍了如何使用jvisualvm监控java,今天做进一步讲解!Java性能监控主要关注CPU.内存和线程. 在线程页中,点击线程Dump,可以生成threaddump日志,通过 ...