一、前置知识-树状数组

树状数组(binary indexed tree)是一种简洁的代码量很小的数据结构,能够高效的处理前缀区间上的问题。在很多情况下能写树状数组解决的就不用码半天线段树了。

树状数组支持两种操作:

a)单点更新: 例如更改序列中的某一个元素的值,复杂度O(logn)

b)前缀查询: 查询序列中的前缀信息,例如,区间[1,n]中的最大值或者区间和,复杂度O(logn)

同时由于求和操作的“可减性”,可以通过查询两次前缀和实现求解序列的区间和

二、HDU1166 树状数组求解区间和

题意:单点修改元素,查询区间和,树状数组求区间和实现。

代码:

  1. # include <iostream>
  2. # include <cstdio>
  3. # include <cstring>
  4. using namespace std;
  5. const int maxn = 5e4+;
  6. int N,A[maxn],C[maxn];
  7. inline int lowbit(int x)
  8. {
  9. return x&(-x);
  10. }
  11. void Update(int index,int val)
  12. {
  13. while(index<=N)
  14. {
  15. C[index] += val;
  16. index += lowbit(index);
  17. }
  18. }
  19. int Query_Sum(int index)
  20. {
  21. int res = ;
  22. while(index)
  23. {
  24. res += C[index];
  25. index -= lowbit(index);
  26. }
  27. return res;
  28. }
  29. void Init()
  30. {
  31. scanf("%d",&N);
  32. memset(C,,sizeof(C));
  33. memset(A,,sizeof(A));
  34. for(int i=;i<=N;i++)
  35. {
  36. scanf("%d",&A[i]);
  37. Update(i,A[i]);
  38. }
  39. }
  40. void Solve(int t)
  41. {
  42. printf("Case %d:\n",t);
  43. int a,b;
  44. char ins[];
  45. while(scanf("%s",ins)!=EOF)
  46. {
  47. if(ins[]=='E')
  48. break;
  49. scanf("%d%d",&a,&b);
  50. if(ins[]=='Q')
  51. printf("%d\n",Query_Sum(b)-Query_Sum(a-));
  52. if(ins[]=='A')
  53. Update(a,b);
  54. if(ins[]=='S')
  55. Update(a,-b);
  56. }
  57. }
  58. int main()
  59. {
  60. int T;
  61. scanf("%d",&T);
  62. for(int t=;t<=T;t++)
  63. {
  64. Init();
  65. Solve(t);
  66. }
  67. return ;
  68. }

三、BZOJ1012 树状数组求解前缀最大值

题意:在空队列里不断向队尾插入元素,过程中查询倒数第K大的元素,树状数组求最值实现。

代码:

  1. # include <iostream>
  2. # include <cstdio>
  3. # include <cstring>
  4. using namespace std;
  5. const int maxn = 2e5+;
  6. int M,cnt;
  7. long long D,val,ans,A[maxn],C[maxn];
  8. char S[];
  9. inline long long lowbit(long long x) {return x&(-x);}
  10. void update(int index,long long value)
  11. {
  12. while(index)
  13. {
  14. C[index] = max(C[index],value);
  15. index -= lowbit(index);
  16. }
  17. }
  18. long long query(int index)
  19. {
  20. long long res = ;
  21. while(index<=M)
  22. {
  23. res = max(res,C[index]);
  24. index += lowbit(index);
  25. }
  26. return res;
  27. }
  28. void Init()
  29. {
  30. cnt = ;
  31. ans = ;
  32. memset(C,,sizeof(C));
  33. }
  34. void Solve()
  35. {
  36. for(int i=;i<M;i++)
  37. {
  38. scanf("%s%lld",S,&val);
  39. if(S[]=='A')
  40. {
  41. cnt++;
  42. update(cnt,(val+ans)%D);
  43. }
  44. else
  45. {
  46. ans = query(cnt-val+);
  47. printf("%lld\n",ans);
  48. }
  49. }
  50. }
  51. int main()
  52. {
  53. while(scanf("%d%lld",&M,&D)!=EOF)
  54. {
  55. Init();
  56. Solve();
  57. }
  58. return ;
  59. }

HDU1166 敌兵布阵 BZOJ1012 最大数[树状数组]的更多相关文章

  1. HDU1166敌兵布阵(线段树,树状数组)

    题面 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况 ...

  2. kuangbin专题七 HDU1166 敌兵布阵 (线段树或树状数组)

    C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...

  3. HDU1166 敌兵布阵_线段树

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  4. HDU1166敌兵布阵(线段树单点更新)

    线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点.       对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b ...

  5. hdu1166敌兵布阵_线段树单点更新

    Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...

  6. hdu1166 敌兵布阵【线段树】

    C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...

  7. hdu1166 敌兵布阵 (线段树单点更新)

    Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营 地,Derek和Tidy的任务就是要监视这 ...

  8. HDU 1611 敌兵布阵 / HRBUST 1794 敌兵布阵(线段树)

    HDU 1611 敌兵布阵 / HRBUST 1794 敌兵布阵(线段树) Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A ...

  9. HDU1166 敌兵布阵(树状数组实现

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

随机推荐

  1. 反射技术的入口 获取类的Class信息

    package com.sxt.reflect; import com.sxt.reflect.entity.Student; /* * 获取类的Class信息 */ public class Tes ...

  2. windows7蓝屏0x000000c4

    故障还原: 360更新弹出更新提示,于是选择了关机自动更新,第二天开机发现电脑蓝屏报0x000000c4错误! 故障排查: 1.无法从最后一次正确配置启动windows7 2.无法进入安全模式 该错误 ...

  3. Hibernate错误——No row with the given identifier exists

    错误 是用的是Hibernate自动建立的数据表,在进行数据库操作时,出现错误No row with the given identifier exists 解决 关系数据库一致性遭到了破坏,找到相关 ...

  4. @atcoder - CODE FESTIVAL 2017 Final - J@ Tree MST

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 个点,第 i 点有一个点权 Xi,再给定一棵边带权的树 ...

  5. selenium webdriver学习(四)------------定位页面元素(转)

    selenium webdriver学习(四)------------定位页面元素 博客分类: Selenium-webdriver seleniumwebdriver定位页面元素findElemen ...

  6. oracle函数 exp(y)

    [功能]返回e的y次幂(e为数学常量) [参数]y,数字型表达式 [返回]数字 [示例] select exp(3),exp(0),exp(-3) from dual; 返回:20.0855369,1 ...

  7. H3C TCP封装

  8. H3C DCC的特点

  9. 【t079】火星上的加法运算

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 最近欢欢看到一本有关火星的书籍,其中她被一个加法运算所困惑,由于她的运算水平有限,想向你求助,作为一名 ...

  10. hadoop 端口总结

    localhost:50030/jobtracker.jsp localhost:50060/tasktracker.jsp localhost:50070/dfshealth.jsp 1. Name ...