[模板] 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 ...
随机推荐
- F - Count the Colors
F - Count the Colors ZOJ - 1610 思路:调了一个小时,但是发现自己线段树木有写错,颜色统计出了错误.但是不明白自己颜色统计为什么错了. 求大佬指点迷津.思路很简单,就 ...
- Kafka中文文档学习笔记
文档位置: /Users/baidu/Documents/Data/Interview/机器学习-数据挖掘/Kafka 据说是目前见到的最好的 Kafka 中文文章 . Kafka 是一个消息系统,原 ...
- AutoReplace in pl/sql developer
AutoReplace in pl/sql developer SL=SELECT S*=SELECT * FROM 2D=TO_DATE('2017-01-01 01:01:00','YYYY-MM ...
- [React Native] Reduce Long Import Statements in React Native with Absolute Imports
In large React Native projects, it’s common to have long relative import paths like: import MyCompon ...
- Create and Call HttpHandler in SharePoint
Create and Call HttpHandler in SharePoint Requirement: 1. Create a httphandler, and reture json data ...
- Could not read from remote repository.
今天换新电脑,忘了配置git环境,就去gitserver上代替码.然后一直报错,后来就又一次配置了git环境.步骤例如以下 damingwuage:Desktop damingwuage$ ssh-k ...
- 谷歌浏览器(chrome) —— 扩展应用程序
工具的使用--谷歌浏览器(chrome) (二) 1. 设置和下载方法 右上角菜单按钮 ⇒ 更多工具(more tools) ⇒ 扩展(Extensions) 打开该页面之后,会首先进入扩展(已安装应 ...
- php word转pdf
我们知道,PHP语言的合理运用可以帮助我们实现导出Word文档的功能.今天我们将为大家介绍PHP处理Word转PDF的相关实现方法. PHP关键字this指向当前对象指针 PHP self关键字指向类 ...
- BZOJ 2140 Tarjan
思路: 跟POJ有一道时限挺长的题一模一样 哦 POJ 1904 题解可以看这个(捂脸) http://blog.csdn.net/qq_31785871/article/details/52963 ...
- java异常处理和自定义异常利用try和catch让程序继续下去(回来自己再写个例子试运行下)
注意:想在catch的参数里使用自定义的异常,则必须先将这个异常抛出才行.(throws是具有抛出异常的能力,并未抛出,throw new MyException是抛出异常,catch是捕获异常,只有 ...