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. CentOS6.3安装Mysql-5.5.29

    转自:http://www.cnblogs.com/zhoulf/archive/2013/01/25/zhoulf.html 安装方式分为rpm和源码编译安装两种,本文是采用mysql源码编译方式, ...

  2. java editor template Eclipse中的快速Java\JavaScript代码模板使用

    java editor template Eclipse中的快速Java\JavaScript代码模板使用 学习了:http://technicalsearch.iteye.com/blog/2150 ...

  3. [Cypress] Test React’s Controlled Input with Cypress Selector Playground

    React based applications often use controlled inputs, meaning the input event leads to the applicati ...

  4. jQuery中的closest()和parents()的差别

    jQuery中的closest()和parents()的差别 jQuery中closest()和parents()的作用非常类似,都是向上寻找符合选择器条件的元素,可是他们之间有一些细微的差别,官网也 ...

  5. java5核心基础之泛型(3)-泛型作用于编译阶段-怎样将String对象传入Integer类型的泛型对象中?

    泛型作用于编译阶段: 泛型是作用于编译阶段,在编译阶段控制类型,以确保在编写代码的时候仅仅能传入指定类型数据到泛型集合对象中去. 怎样验证呢,贴代码例如以下: package highBasic.ge ...

  6. CentOS 7 安装Nginx做反向代理

    题记 须要使用nginx的反向代理功能,測试环境为centos+NGINX 1.8.0. 跳过一些繁琐的问题,直接记录核心 步骤 (1)centos 安装在VM中.因此须要注意网络连接问题 (2)安装 ...

  7. hdu1018--斯特灵公式

    斯特灵公式 Wiki http://zh.wikipedia.org/wiki/斯特林公式 /** \brief hdu 1018 * * \param date 2014/7/24 * \param ...

  8. jQuery高性能自己定义滚动栏美化插件

    malihu是一款高性能的滚动栏美化jQuery插件. 该滚动栏美化插件支持水平和垂直滚动栏,支持鼠标滚动,支持键盘滚动和支持移动触摸屏. 而且它能够和jQuery UI和Bootatrap完美的结合 ...

  9. Mail发送封装类

    代码实现: MailSmtp ms = ","xxxx"); //可选参数 ms.SetCC("610262374@qq.com");//抄送可以多个 ...

  10. Gym-101915B Ali and Wi-Fi 计算几何 求两圆交点

    题面 题意:给你n个圆,每个圆有一个权值,你可以选择一个点,可以获得覆盖这个点的圆中,权值最大的m个的权值,问最多权值是多少 题解:好像是叙利亚的题....我们画画图就知道,我们要找的就是圆与圆交的那 ...