链接:http://codevs.cn/problem/1080/

先用树状数组水一发,再用线段树水一发

树状数组代码:84ms

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<math.h>
  5. #include<string.h>
  6. #include<vector>
  7. #include<queue>
  8. #include<iterator>
  9. #include<vector>
  10. #include<set>
  11. #define dinf 0x3f3f3f3f
  12. typedef long long ll;
  13. const int Max=(<<)+;
  14. using namespace std;
  15.  
  16. #define SIZE 1000005
  17.  
  18. int c[SIZE],a[SIZE];
  19.  
  20. int Lowbit(int x)
  21. {
  22. return x&(-x);
  23. }
  24.  
  25. int Sum(int x)
  26. {
  27. int sum=;
  28. while(x>)
  29. {
  30. sum+=c[x];
  31. x-=Lowbit(x);
  32. }
  33. return sum;
  34. }
  35.  
  36. void Update(int i,int x)
  37. {
  38. while(i<=SIZE)//要把所有的与i相关的c数组中的值全部更新,不然会出错
  39. {
  40. c[i]+=x;
  41. i+=Lowbit(i);
  42. }
  43. }
  44.  
  45. int main()
  46. {
  47. int n,m;
  48. while(~scanf("%d",&n))
  49. {
  50. memset(a,,sizeof(a));
  51. memset(c,,sizeof(c));
  52.  
  53. for(int i=;i<=n;i++)
  54. {
  55. scanf("%d",&a[i]);
  56. Update(i,a[i]);
  57. }
  58. scanf("%d",&m);
  59. int op,node,num;
  60. for(int i=;i<=m;i++)
  61. {
  62. scanf("%d %d %d",&op,&node,&num);
  63. if(op==)
  64. Update(node,num);
  65. else if(op==)
  66. {
  67. printf("%d\n",Sum(num)-Sum(node-));
  68. }
  69. }
  70. }
  71. return ;
  72. }

线段树代码:48ms

  1. #include<cstdio>
  2. using namespace std;
  3. struct RE
  4. {
  5. int sum,l,r;
  6. }tree[];
  7. int a[];
  8. void build(int node,int l,int r)
  9. {
  10. int mid=(l+r)>>;
  11. tree[node].l=l;
  12. tree[node].r=r;
  13. if (l==r)
  14. {
  15. tree[node].sum=a[l];
  16. return;
  17. }
  18. build(*node,l,mid);
  19. build(*node+,mid+,r);
  20. tree[node].sum+=tree[*node].sum+tree[*node+].sum;
  21. }
  22. void updata(int node,int a,int b)
  23. {
  24. int mid=(tree[node].l+tree[node].r)>>;
  25. if (mid==tree[node].l&&mid==tree[node].r)
  26. {
  27. tree[node].sum+=b;
  28. return;
  29. }
  30. if (a<=mid)
  31. updata(*node,a,b);
  32. else
  33. updata(*node+,a,b);
  34. tree[node].sum+=b;
  35. }
  36. int query(int node,int l,int r)
  37. {
  38. int mid=(tree[node].l+tree[node].r)>>;
  39. if (tree[node].l==l&&tree[node].r==r)
  40. return tree[node].sum;
  41. if (l>mid)
  42. return query(*node+,l,r);
  43. if (r<=mid)
  44. return query(*node,l,r);
  45. return query(*node,l,mid)+query(*node+,mid+,r);
  46. }
  47. int main()
  48. {
  49. int n,m;
  50. scanf("%d",&n);
  51. int i,j;
  52. for (i=;i<=n;i++)
  53. scanf("%d",&a[i]);
  54. build(,,n);
  55. scanf("%d",&m);
  56. int sign,a,b;
  57. for (i=;i<=m;i++)
  58. {
  59. scanf("%d%d%d",&sign,&a,&b);
  60. if (sign==) updata(,a,b);
  61. else printf("%d\n",query(,a,b));
  62. }
  63. return ;
  64. }

codevs 1080 线段树练习的更多相关文章

  1. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  2. codevs 1080 线段树练习 CDQ分治

    codevs 1080 线段树练习 http://codevs.cn/problem/1080/  时间限制: 1 s  空间限制: 128000 KB   题目描述 Description 一行N个 ...

  3. codevs 1080 线段树练习--用树状数组做的

    1080 线段树练习  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现在动态 ...

  4. Codevs 1080 线段树练习(CDQ分治)

    1080 线段树练习  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 一行N个方格,开始每个格子里都有 ...

  5. codevs——1080 线段树练习

    1080 线段树练习  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 一行N个方格,开始每个格子里都有 ...

  6. Codevs 1080 线段树联系

    题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和:修改的规则是指定某一个格子x,加上或 ...

  7. codevs 1080 线段树练习(线段树)

    题目: 题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和:修改的规则是指定某一个格子x ...

  8. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  9. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

随机推荐

  1. Docker 容器测试全探索

    导读 当我们构建好Docker镜像并利用多套容器共同组合成应用程序,建立起持续交付通道,了解了如何将新创建的镜像纳入到生产或者测试环境当中之后,新的问题来了——我们该如何测试自己的Docker容器?测 ...

  2. [codevs1154][COJ0177][NOIP2006]能量项链

    [codevs1154][COJ0177][NOIP2006]能量项链 试题描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这 ...

  3. jquery的change():下拉框值改变时触发

    <script src="jquery.min.js" type="text/javascript"></script> <scr ...

  4. ImageView显示网络图片

    package com.example.urlimage; import java.io.InputStream; import java.net.HttpURLConnection; import ...

  5. IE盒模型

    IE5.5及更早的版本使用的是IE盒模型,在在IE6及以上版本的浏览器中,浏览器支持一种解决了这种差异的可选的渲染模式,也开始遵循标准模式. IE盒模型和W3C盒模型的差异: IE盒模型,块元素的实际 ...

  6. Hashtable和HashMap类的区别

    Hashtable和HashMap类有三个重要的不同之处.第一个不同主要是历史原因.Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现. ...

  7. Kali Linux渗透基础知识整理(一):信息搜集

    写在前面的废话:最近要给一些新人做培训,整理些东西,算不上什么太高端的内容,只是简单的整理下了,我觉得对于小白的话也还算是干货.在乌云水了几年,算不上什么大神水平,最近生活费紧张,现在打算在FreeB ...

  8. 1.AngularJS初探

    1.需要什么前端开发环境 1)代码编辑工具 webstorm 2)断点调试工具 chrome插件Batarang 3)版本管理 tortoiseGit 4)代码合并和混淆工具 grunt-contri ...

  9. php5.3 appache phpstudy win7win8win10下 运行速度慢解决办法

         在部署服务器以及本地测试的时候发现了一个奇怪的现象,运行PHP程序的时候非常慢,起先以为是网速的原因,后经本地测试发现速度依旧非常慢,打开一个页面差不多要用时3秒以上,这肯定是不正常的,因为 ...

  10. [20160701]DevideByZeroWithoutNoException——from 《Java How To Program (Early Objects), 10th》

    //一段优美的例子 import java.util.Scanner; import java.util.InputMismatchException; public class DevideByZe ...