zkw线段树

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

code1:(有注释)

//By Menteur_Hxy
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std; const int MAX=100010;
const int INF=0x3f3f3f3f;
int n,m,M; long long rd() { //快读(*/ω\*)
long long x=0,fla=1;
char c=' ';
while(c>'9'|| c<'0') {if(c=='-') fla=-fla; c=getchar();}
while(c<='9'&&c>='0') x=x*10+c-'0',c=getchar();
return x*fla;
} struct zkw_Segment_Tree { //无需差分 支持单点修改和区间查询 (求和 和 最值 都可以)
long long a[MAX<<1]; void build() {
for(M=1;M<n;M<<=1); //强行开够(大于n) 方便二进制访问叶节点
for(int i=M+1;i<=M+n;i++) a[i]=rd();
/*这里要解释下。。
理论上从M开始都是叶节点那为什么不从M开始而是M+1呢
因为在区间查询时最大是[1,n]而这个线段树区间查询需要变成开区间
即变为(0,n+1) 所以当然要给0的位置留个空 区间查询才能 */
for(int i=M-1;i;i--) a[i]=a[i<<1]+a[i<<1|1];
} void point_change(long long x,long long k) {
a[x=x+M]+=k;
while(x) a[x>>=1]=a[x<<1]+a[x<<1|1];
} long long query_interval (long long l,long long r) {
long long ans=0;
for(l=l+M-1,r=r+M+1;l^r^1;l>>=1,r>>=1) {
if(~l&1) ans+=a[l^1];
if(r&1) ans+=a[r^1];
}
return ans;
}
}tr; int main() {
n=rd(),m=rd();
tr.build();
for(int i=1;i<=m;i++) {
int opt=rd();
if(opt==1) {
int x=rd(),k=rd();
tr.point_change(x,k);
}
else {
int l=rd(),r=rd();
if(l>r) swap(l,r);
printf("%d",tr.query_interval(l,r));
}
}
return 0;
}

code1:(无注释)

//By Menteur_Hxy
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std; const int MAX=100010;
const int INF=0x3f3f3f3f;
int n,m,M; long long rd() {
long long x=0,fla=1;
char c=' ';
while(c>'9'|| c<'0') {if(c=='-') fla=-fla; c=getchar();}
while(c<='9'&&c>='0') x=x*10+c-'0',c=getchar();
return x*fla;
} struct zkw_Segment_Tree {
long long a[MAX<<1]; void build() {
for(M=1;M<n;M<<=1);
for(int i=M+1;i<=M+n;i++) a[i]=rd();
for(int i=M-1;i;i--) a[i]=a[i<<1]+a[i<<1|1];
} void point_change(long long x,long long k) {
a[x=x+M]+=k;
while(x) a[x>>=1]=a[x<<1]+a[x<<1|1];
} long long query_interval (long long l,long long r) {
long long ans=0;
for(l=l+M-1,r=r+M+1;l^r^1;l>>=1,r>>=1) {
if(~l&1) ans+=a[l^1];
if(r&1) ans+=a[r^1];
}
return ans;
}
}tr; int main() {
n=rd(),m=rd();
tr.build();
for(int i=1;i<=m;i++) {
int opt=rd();
if(opt==1) {
int x=rd(),k=rd();
tr.point_change(x,k);
}
else {
int l=rd(),r=rd();
if(l>r) swap(l,r);
printf("%d",tr.query_interval(l,r));
}
}
return 0;
}

[模板] 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. junit4单元测试基础

    导入方法看如下截图就明白了:   新建测试用例 右击包名,点击新建,或者新建里的others,选择JUnit test case,如下图所示:   接下来,给测试类起名字和选择要测试的类,如下图所示: ...

  2. Go语言net/http 解读.

    Http包提供实现HTTP客户端和服务端的方法与函数. Get.Head.Post.PostForm配合使用实现HTTP请求: resp, err := http.Get("http://e ...

  3. HDU 4510

    省一等,保研. #include <iostream> #include <cstdio> #include <cstring> #include <algo ...

  4. C++开发人脸性别识别教程(9)——搭建MFC框架之显示图片

    在之前的博客中我们已经实现读取用户选定的目录.并将其路径保存在对应的变量中.在这篇博文中我们将介绍怎样借助CvvImage类将图片显示在picture控件中,并自己主动读取目录下的其它图片. 一.加入 ...

  5. Zookeeper体系结构

    上面我们已经讨论了zookeeper在应用程序中的一些操作,以下我们须要理解一下服务端的工作的原理.client是怎样通过一个client的类库与服务端进行通信的,然后服务端又是怎样回应client的 ...

  6. HDU 1754 I Hate it (线段树最大值模板)

    思路:与我发表的上一遍求和的思想一样   仅仅是如今变成求最大值而已 AC代码: #include<iostream> #include<cstdio> #include< ...

  7. Date and time types

    https://docs.microsoft.com/en-us/sql/t-sql/data-types/date-and-time-types date (Transact-SQL)datetim ...

  8. hdoj--1150--Machine Schedule(最小点覆盖)

    Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. B1237 [SCOI2008]配对 贪心 + dp

    我刚开始,我打眼一看:哇!网络流大水题,直接费用流板子,建边跟zz一样.结果看了一眼数据范围...gg,luogu上只能得30,直接建边就是n^2,1e5根本过不了.咋办,只能另谋出路.想不出来,看题 ...

  10. VUEJS2.0源码理解--优

    VUEJS2.0源码理解 http://jiongks.name/blog/vue-code-review/#pingback-112428