zkw线段树

code1简单版本 code2差分版本(暂无)

code1:(有注释)

  1. //By Menteur_Hxy
  2. #include<cstdio>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<cstring>
  6. using namespace std;
  7. const int MAX=100010;
  8. const int INF=0x3f3f3f3f;
  9. int n,m,M;
  10. long long rd() { //快读(*/ω\*)
  11. long long x=0,fla=1;
  12. char c=' ';
  13. while(c>'9'|| c<'0') {if(c=='-') fla=-fla; c=getchar();}
  14. while(c<='9'&&c>='0') x=x*10+c-'0',c=getchar();
  15. return x*fla;
  16. }
  17. struct zkw_Segment_Tree { //无需差分 支持单点修改和区间查询 (求和 和 最值 都可以)
  18. long long a[MAX<<1];
  19. void build() {
  20. for(M=1;M<n;M<<=1); //强行开够(大于n) 方便二进制访问叶节点
  21. for(int i=M+1;i<=M+n;i++) a[i]=rd();
  22. /*这里要解释下。。
  23. 理论上从M开始都是叶节点那为什么不从M开始而是M+1呢
  24. 因为在区间查询时最大是[1,n]而这个线段树区间查询需要变成开区间
  25. 即变为(0,n+1) 所以当然要给0的位置留个空 区间查询才能
  26. */
  27. for(int i=M-1;i;i--) a[i]=a[i<<1]+a[i<<1|1];
  28. }
  29. void point_change(long long x,long long k) {
  30. a[x=x+M]+=k;
  31. while(x) a[x>>=1]=a[x<<1]+a[x<<1|1];
  32. }
  33. long long query_interval (long long l,long long r) {
  34. long long ans=0;
  35. for(l=l+M-1,r=r+M+1;l^r^1;l>>=1,r>>=1) {
  36. if(~l&1) ans+=a[l^1];
  37. if(r&1) ans+=a[r^1];
  38. }
  39. return ans;
  40. }
  41. }tr;
  42. int main() {
  43. n=rd(),m=rd();
  44. tr.build();
  45. for(int i=1;i<=m;i++) {
  46. int opt=rd();
  47. if(opt==1) {
  48. int x=rd(),k=rd();
  49. tr.point_change(x,k);
  50. }
  51. else {
  52. int l=rd(),r=rd();
  53. if(l>r) swap(l,r);
  54. printf("%d",tr.query_interval(l,r));
  55. }
  56. }
  57. return 0;
  58. }

code1:(无注释)

  1. //By Menteur_Hxy
  2. #include<cstdio>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<cstring>
  6. using namespace std;
  7. const int MAX=100010;
  8. const int INF=0x3f3f3f3f;
  9. int n,m,M;
  10. long long rd() {
  11. long long x=0,fla=1;
  12. char c=' ';
  13. while(c>'9'|| c<'0') {if(c=='-') fla=-fla; c=getchar();}
  14. while(c<='9'&&c>='0') x=x*10+c-'0',c=getchar();
  15. return x*fla;
  16. }
  17. struct zkw_Segment_Tree {
  18. long long a[MAX<<1];
  19. void build() {
  20. for(M=1;M<n;M<<=1);
  21. for(int i=M+1;i<=M+n;i++) a[i]=rd();
  22. for(int i=M-1;i;i--) a[i]=a[i<<1]+a[i<<1|1];
  23. }
  24. void point_change(long long x,long long k) {
  25. a[x=x+M]+=k;
  26. while(x) a[x>>=1]=a[x<<1]+a[x<<1|1];
  27. }
  28. long long query_interval (long long l,long long r) {
  29. long long ans=0;
  30. for(l=l+M-1,r=r+M+1;l^r^1;l>>=1,r>>=1) {
  31. if(~l&1) ans+=a[l^1];
  32. if(r&1) ans+=a[r^1];
  33. }
  34. return ans;
  35. }
  36. }tr;
  37. int main() {
  38. n=rd(),m=rd();
  39. tr.build();
  40. for(int i=1;i<=m;i++) {
  41. int opt=rd();
  42. if(opt==1) {
  43. int x=rd(),k=rd();
  44. tr.point_change(x,k);
  45. }
  46. else {
  47. int l=rd(),r=rd();
  48. if(l>r) swap(l,r);
  49. printf("%d",tr.query_interval(l,r));
  50. }
  51. }
  52. return 0;
  53. }

[模板] zkw线段树的更多相关文章

  1. zkw线段树模板题

    学了zkw线段树,觉得没什么必要刷专题的吧(切不动啊).. 那先放一个模板题吧(我绝不会和你说搬了一道树状数组模板题的!!!) 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加 ...

  2. 题解 P3372 【【模板】线段树1 】(zkw)

    看了一下题解里的zkw线段树,感觉讲的不是很清楚啊(可能有清楚的但是我没翻到,望大佬勿怪). 决定自己写一篇...希望大家能看明白... zkw线段树是一种优秀的非递归线段树,速度比普通线段树快两道三 ...

  3. zkw线段树详解

    转载自:http://blog.csdn.net/qq_18455665/article/details/50989113 前言 首先说说出处: 清华大学 张昆玮(zkw) - ppt <统计的 ...

  4. [SinGuLaRiTy] ZKW线段树

    [SinGuLaRiTy-1007] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. 关于ZKW线段树 Zkw线段树是清华大学张昆玮发明非递 ...

  5. 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题

    “队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄>     线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...

  6. 『zkw线段树及其简单运用』

    阅读本文前,请确保已经阅读并理解了如下两篇文章: 『线段树 Segment Tree』 『线段树简单运用』 引入 这是一种由\(THU-zkw\)大佬发明的数据结构,本质上是经典的线段树区间划分思想, ...

  7. 有趣的 zkw 线段树(超全详解)

    zkw segment-tree 真是太棒了(真的重口味)!写篇博客纪念入门 emmm...首先我们来介绍一下 zkw 线段树这个东西(俗称 "重口味" ,与 KMP 类似,咳咳. ...

  8. ZKW线段树入门

    Part 1 来说说它的构造 线段树的堆式储存 我们来转成二进制看看 小学生问题:找规律 规律是很显然的 一个节点的父节点是这个数左移1,这个位运算就是低位舍弃,所有数字左移一位 一个节点的子节点是这 ...

  9. HDU 1166 - 敌兵布阵 - [单点修改、区间查询zkw线段树]

    题还是那个题:http://www.cnblogs.com/dilthey/p/6827959.html 不过我们今天换一种线段树实现来做这道题: 关于zkw线段树的讲解:https://zhuanl ...

随机推荐

  1. IP地址的规划和设计方法(三)

    九,内部网络专用IP地址规划与网络地址转换NAT方法 (1)内部网络的专用IP地址选择的根据 RFC1918在讨论内部网络的专用IP地址规划方法时任务.使用专用地址规划一个内部网络地址系统时.首选的方 ...

  2. codeforces Round #258(div2) C解题报告

    C. Predict Outcome of the Game time limit per test 2 seconds memory limit per test 256 megabytes inp ...

  3. Spring技术内幕:SpringIOC原理学习总结

    前一段时候我把Spring技术内幕的关于IOC原理一章看完,感觉代码太多,不好掌握,我特意又各方搜集了一些关于IOC原理的资料,特加深一下印象,以便真正掌握IOC的原理. IOC的思想是:Spring ...

  4. Hadoop入门进阶步步高(一)-环境准备

    前言 Hadoop从存储上来说,是相似于冗余磁盘阵列(RAID)的存储方式.将数据分散存储并提供以提供吞吐量,它的存储系统就是HDFS(Hadoop Distuibute Fils System).从 ...

  5. iOS音频播放之AudioQueue(一):播放本地音乐

    AudioQueue简单介绍 AudioStreamer说明 AudioQueue具体解释 AudioQueue工作原理 AudioQueue主要接口 AudioQueueNewOutput Audi ...

  6. Oracle 数据块损坏与恢复具体解释

    1.什么是块损坏: 所谓损坏的数据块,是指块没有採用可识别的 Oracle 格式,或者其内容在内部不一致. 通常情况下,损坏是由硬件故障或操作系统问题引起的.Oracle 数据库将损坏的块标识为&qu ...

  7. C C++每个头文件的功能说

    C/C++每个头文件的功能说明 传统 C++ #include <assert.h> //设定插入点 #include <ctype.h> //字符处理 #include &l ...

  8. [HDU 4261] Estimation

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4261 [算法] 首先,有一个结论 : | a[1] - k | + | a[2] - k | + ...

  9. Nginx实战系列之功能篇----后端节点健康检查

    目前,nginx对后端节点健康检查的方式主要有3种,这里列出:   1.ngx_http_proxy_module 模块和ngx_http_upstream_module模块(自带)    官网地址: ...

  10. Arduino-OLED-四度显示

    double Fahrenheit(double celsius) { ; } //摄氏温度度转化为华氏温度 double Kelvin(double celsius) { return celsiu ...