[模板] zkw线段树
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线段树的更多相关文章
- zkw线段树模板题
学了zkw线段树,觉得没什么必要刷专题的吧(切不动啊).. 那先放一个模板题吧(我绝不会和你说搬了一道树状数组模板题的!!!) 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加 ...
- 题解 P3372 【【模板】线段树1 】(zkw)
看了一下题解里的zkw线段树,感觉讲的不是很清楚啊(可能有清楚的但是我没翻到,望大佬勿怪). 决定自己写一篇...希望大家能看明白... zkw线段树是一种优秀的非递归线段树,速度比普通线段树快两道三 ...
- zkw线段树详解
转载自:http://blog.csdn.net/qq_18455665/article/details/50989113 前言 首先说说出处: 清华大学 张昆玮(zkw) - ppt <统计的 ...
- [SinGuLaRiTy] ZKW线段树
[SinGuLaRiTy-1007] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. 关于ZKW线段树 Zkw线段树是清华大学张昆玮发明非递 ...
- 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题
“队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄> 线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...
- 『zkw线段树及其简单运用』
阅读本文前,请确保已经阅读并理解了如下两篇文章: 『线段树 Segment Tree』 『线段树简单运用』 引入 这是一种由\(THU-zkw\)大佬发明的数据结构,本质上是经典的线段树区间划分思想, ...
- 有趣的 zkw 线段树(超全详解)
zkw segment-tree 真是太棒了(真的重口味)!写篇博客纪念入门 emmm...首先我们来介绍一下 zkw 线段树这个东西(俗称 "重口味" ,与 KMP 类似,咳咳. ...
- ZKW线段树入门
Part 1 来说说它的构造 线段树的堆式储存 我们来转成二进制看看 小学生问题:找规律 规律是很显然的 一个节点的父节点是这个数左移1,这个位运算就是低位舍弃,所有数字左移一位 一个节点的子节点是这 ...
- HDU 1166 - 敌兵布阵 - [单点修改、区间查询zkw线段树]
题还是那个题:http://www.cnblogs.com/dilthey/p/6827959.html 不过我们今天换一种线段树实现来做这道题: 关于zkw线段树的讲解:https://zhuanl ...
随机推荐
- SCVMM-VMWARE ACE虚拟机管理工具
SCVMM是微软的虚拟化管理工具 VMWARE ACE是另一套虚拟化的工具 这两套工具都是用来管理虚拟机的,可以直接将物理机虚拟化为虚拟机 企业一旦发展到了一定阶段,并然需要自己的服务器和虚拟化环境, ...
- mysqldump中使用flush tables with read lock的风险分析
http://blog.csdn.net/wireless_tech/article/details/7332906 我们使用mysqldump --single-transaction -- ...
- 【函数式】Monads模式初探——Endofunctor
自函子 自函子(Endofunctor)是一个将范畴映射到自身的函子(A functor that maps a category to itself). 函子是将一个范畴转换到另一个范畴.所以自函子 ...
- webbench压力測试工具
apache的測试工具ab 在并发100个以上后会出现错误.网上也有非常多改ab源代码来解禁的. 只是还是推荐一款比較好用的压力測试工具webbench wget http://blog.zyan.c ...
- 聚类k-means/k-means++/fcm学习笔记
聚类主要是一种无监督学习.用来发现未标注数据的隐藏结构,主要是用来给数据分组.聚类算法一般有硬聚类(k-means,k-means++)和软聚类FCM(fuzzy c-means).聚类眼下广泛应用于 ...
- linux下Oracle11g RAC搭建(七)
linux下Oracle11g RAC搭建(七) 六.安装Grid 启动GRID安装界面 方式一:redhat下调整分辨率 [root@node1 ~]# xhost + //授权 [ro ...
- luogu2754 星际转移问题 网络流
题目大意:地球与月球间有可容纳无限人的太空站,还有在太空站与星球间按周期行驶的.有固定容量的太空船,每一艘太空船从一个太空站驶往任一太空站耗时均为 1.地球上有一定数量的人,问所有人到月球最少需要多少 ...
- Java 异步转同步 ListenableFuture in Guava
ListenableFuture的说明 并发编程是一个难题,但是一个强大而简单的抽象可以显著的简化并发的编写.出于这样的考虑,Guava 定义了 ListenableFuture接口并继承了JDK c ...
- div向右偏移设置 css让div靠右移一定距离
转自:https://www.thinkcss.com/shili/1372.shtml div对象盒子向右偏移设置,使用css让div靠右一定距离-div向右移教程实例篇 div向右偏移一定距离,可 ...
- [专辑] 也晒晒我的RBAC系统 ——行一山人的博客
也晒晒我的RBAC系统(一):概述 也晒晒我的RBAC系统(二):系统实现原理简介 也晒晒我的RBAC系统(三):后台管理程序源码及使用演示 也晒晒我的RBAC系统(四):框架源代码(超值奉献,请勿拍 ...