题目描述-->p2357 守墓人

敲了一遍线段树,水过.

树状数组分析

主要思路:

差分

简单介绍一下差分(详细概念太麻烦,看下面.

  1. 给定一个数组
  2. 7 8 6 5 1 8 18 20 35 //瞎敲的emmm
  3. 7 1 -2 -1 3 10 2 15//对应得到差分数组.
  4. 我们发现从[1,i]求和,得到的就是我们的原数组对应值.(这就是差分.

为什么用差分+树状数组?

对应差分,我们修改一个位置都会对应影响一段区间.

差分的话,我们修改一个位置就达到了修改后面区间的效果.

而我们修改一个区间,只需要对于左端点增加k,右端点+1位置减去k即可.

对应差分操作,区间修改操作,我们可以推导出下面的式子.



图片来源-->@胡小兔

学习一下(简单了解)就可以了.

所以我们就可以很简单码出来.

码量小又简单,树状数组你值得拥有

安利一篇很好的写树状数组的blog

--------------------代码---------------------

  1. /*
  2. 目前树状数组解法rank1(吸氧
  3. Timeuse:214ms
  4. Creator:顾z
  5. Date:2018.09.07
  6. */
  7. #include<bits/stdc++.h>
  8. #define int long long
  9. #define IL inline
  10. #define RI register int
  11. #define lowbit(x) x&-x
  12. IL void in(int &x){
  13. int f=1;x=0;char s=getchar();
  14. while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}
  15. while(s<='9'&&s>='0'){x=x*10+s-'0';s=getchar();}
  16. x*=f;
  17. }
  18. int n,m,last,opt,x,y,z,mian;
  19. int sum1[500002],sum2[500002];
  20. IL void add(int pos,int x)
  21. {
  22. for(RI i=pos;i<=n;i+=lowbit(i))
  23. sum1[i]+=x,sum2[i]+=pos*x;
  24. }
  25. IL long long query(int pos)
  26. {
  27. long long res=0;
  28. for(RI i=pos;i;i-=lowbit(i))
  29. res+=(pos+1)*sum1[i]-sum2[i];
  30. return res;
  31. }
  32. main(void)
  33. {
  34. in(n),in(m);
  35. for(RI i=1;i<=n;i++)in(x),add(i,x-last),last=x;
  36. for(RI i=1,opt;i<=m;i++)
  37. {
  38. in(opt);
  39. switch(opt)
  40. {
  41. case 1:in(x),in(y),in(z),add(x,z),add(y+1,-z);break;
  42. case 2:in(z),mian+=z;break;
  43. case 3:in(z),mian-=z;break;
  44. case 4:in(x),in(y);printf("%lld\n",query(y)-query(x-1)+(x==1)*mian);break;
  45. case 5:printf("%lld\n",query(1)+mian);
  46. }
  47. }
  48. }

再粘一下线段树代码 emm↓


  1. /*
  2. 线段树就跑的有些慢了 emmm(未吸氧
  3. zkw线段树应该会更快一些.
  4. Timeuse:594ms
  5. Creator:顾z
  6. Date:2018.09.03
  7. */
  8. #include<bits/stdc++.h>
  9. #define int long long
  10. #define IL inline
  11. #define RI register int
  12. #define ls o<<1
  13. #define rs o<<1|1
  14. #define N 1000008
  15. IL void read(int &x){
  16. int f=1;x=0;char s=getchar();
  17. while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}
  18. while(s<='9'&&s>='0'){x=x*10+s-'0';s=getchar();}
  19. x*=f;
  20. }
  21. int n,f,tr[N],tg[N],mian,c[N];
  22. IL void up(int o){tr[o]=tr[ls]+tr[rs];return;}
  23. IL void build(int o,int l,int r)
  24. {
  25. if(l==r)
  26. {
  27. read(tr[o]);
  28. return;
  29. }
  30. int mid=(l+r)>>1;
  31. build(ls,l,mid);
  32. build(rs,mid+1,r);
  33. up(o);
  34. return;
  35. }
  36. IL void down(int o,int l,int r)
  37. {
  38. if(tg[o])
  39. {
  40. int mid=(l+r)>>1;
  41. tg[ls]+=tg[o];tg[rs]+=tg[o];
  42. tr[ls]+=tg[o]*(mid-l+1);
  43. tr[rs]+=tg[o]*(r-mid);
  44. tg[o]=0;
  45. }
  46. }
  47. IL int query(int o,int l,int r,int x,int y)
  48. {
  49. if(x<=l&&y>=r)return tr[o];
  50. down(o,l,r);
  51. int res=0;
  52. int mid=(l+r)>>1;
  53. if(x<=mid)res+=query(ls,l,mid,x,y);
  54. if(y>mid)res+=query(rs,mid+1,r,x,y);
  55. return res;
  56. }
  57. IL void change(int o,int l,int r,int x,int y,int del)
  58. {
  59. if(x<=l&&y>=r)
  60. {
  61. tg[o]+=del;
  62. tr[o]+=del*(r-l+1);
  63. return;
  64. }
  65. down(o,l,r);
  66. int mid=(l+r)>>1;
  67. if(x<=mid)change(ls,l,mid,x,y,del);
  68. if(y>mid)change(rs,mid+1,r,x,y,del);
  69. up(o);
  70. return;
  71. }
  72. signed main()
  73. {
  74. read(n),read(f);
  75. build(1,1,n);
  76. for(RI i=1,opt,x,y,z;i<=f;i++)
  77. {
  78. read(opt);
  79. switch(opt)
  80. {
  81. case 1:read(x),read(y),read(z),change(1,1,n,x,y,z);break;
  82. case 2:read(z),mian+=z;break;
  83. case 3:read(z),mian-=z;break;
  84. case 4:read(x),read(y),printf("%lld\n",query(1,1,n,x,y)+(x==1)*mian);break;
  85. case 5:printf("%lld\n",query(1,1,n,1,1)+mian);break;
  86. }
  87. }
  88. }

目前**树状数组解法rank1 **

差分+树状数组 线段树【P2357】 守墓人的更多相关文章

  1. 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树

    正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...

  2. 树状数组 && 线段树应用 -- 求逆序数

    参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...

  3. hdu1394(枚举/树状数组/线段树单点更新&区间求和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...

  4. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

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

  5. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  6. 「CodePlus 2017 11 月赛」Yazid 的新生舞会(树状数组/线段树)

    学习了新姿势..(一直看不懂大爷的代码卡了好久T T 首先数字范围那么小可以考虑枚举众数来计算答案,设当前枚举到$x$,$s_i$为前$i$个数中$x$的出现次数,则满足$2*s_r-r > 2 ...

  7. acwing 243. 一个简单的整数问题2 树状数组 线段树

    地址 https://www.acwing.com/problem/content/description/244/ 给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“C l ...

  8. 区间操作---树状数组&&线段树

    涉及区间操作的一些套路必须要会呀 区间加减为了偷懒能不写线段树so我选择树状数组!! 但是区间乘除,最大值我想了想还是用线段树分块吧. 树状数组: 这里用网上的一张图: 这里灰色数组是原本的数组(a[ ...

  9. 数据结构--树状数组&&线段树--基本操作

    随笔目的:方便以后对树状数组(BIT)以及基本线段树的回顾 例题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 例题:hdu 1166 敌兵布阵 T ...

随机推荐

  1. 【题解】AHOI2009同类分布

    好开心呀~果然只有不看题解做出来的题目才会真正的有一种骄傲与满足吧ヾ(๑╹◡╹)ノ" 实际上这题只要顺藤摸瓜就可以了.首先按照数位dp的套路,有两维想必是省不掉:1.当前dp到到的位数:2. ...

  2. 容器(vector)、数组、new创建的动态数组,你到底用哪一个(执行效率分析)

    1.问题的提出 在没有了解vector之前,动态数组一般都是又new创建的.在了解vector后发现vector竟是那样方便好用,但方便的同时却是以牺牲执行效率为代价的.网上对vector和array ...

  3. BZOJ3132 上帝造题的七分钟 【二维树状数组】

    题目 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的 ...

  4. Jsp上传组件Smartupload介绍

    <form action="UploadServlet" enctype="multipart/form-data" method="post& ...

  5. nodejs 喜欢报cannot find module .....的简单解决方案

    在安装nodejs后使用命令npm install <package_name>一直喜欢报cannot find module........ 因为我之前在我的电脑上安装过nodejs,当 ...

  6. Input操作文件

    在HTML表单中,可以上传文件的唯一控件就是<input type="file">. 注意:当一个表单包含<input type="file" ...

  7. js实现页面触摸滑动

    先设置一个div  高度不能设置100% . window.addEventListener("load",function(){ var addEventListener = ' ...

  8. 群联MPALL(Rel) 7F V5.03.0A-DL07量产工具 PS2251-07(PS2307)

    前言:U盘被写保护,真的很醉人啊~~      群联MPALL是一款群联PS2251系列主控量产修复工具,本版本支持PS2251-67.PS2251-68.PS2251-02.PS2251-03.PS ...

  9. webpack3基础知识

    ## 本地化安装webpack ## 1. npm init //npm初始化生成package.json文件 2. npm install --save-dev webpack //安装webpac ...

  10. WebView使用--文章集锦

    对于android WebView加载不出Html5网页的解决方法 在android4.4中webview的使用相对于之前版本的一些区别 理解WebKit和Chromium: Android 4.4 ...