简介

zkw线段树虽然是线段树的另一种写法,但是本质上已经和普通的递归版线段树不一样了,是一种介于树状数组和线段树中间的存在,一些功能上的实现比树状数组多,而且比线段树好写且常数小。

普通线段树采用从上到下逐层递归的方式。zkw线段树则是从底层开始,目标直接明确,不需要线段树在确定区间的分治过程。

一些基础题

COGS264 数列操作

树状数组的题,据说模拟也能过hhhh。

单点修改,区间查询。各种数据结构都可搞,用最基本的zkw线段树实现。

  1. //zkw segment tree
  2. //by Cydiater
  3. //2016.12.11
  4. #include <iostream>
  5. #include <iomanip>
  6. #include <cstdio>
  7. #include <cstdlib>
  8. #include <iomanip>
  9. #include <cmath>
  10. #include <ctime>
  11. #include <cstring>
  12. #include <string>
  13. #include <queue>
  14. #include <map>
  15. #include <bitset>
  16. #include <set>
  17. #include <vector>
  18. using namespace std;
  19. #define ll long long
  20. #define up(i,j,n) for(int i=j;i<=n;i++)
  21. #define down(i,j,n) for(int i=j;i>=n;i--)
  22. #define cmax(a,b) a=max(a,b)
  23. #define cmin(a,b) a=min(a,b)
  24. #define FILE "shulie"
  25. const int MAXN=1<<19;
  26. const int LIM=1<<18;
  27. const int M=1<<17;
  28. const int oo=0x3f3f3f3f;
  29. inline int read(){
  30. char ch=getchar();int x=0,f=1;
  31. while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  32. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  33. return x*f;
  34. }
  35. int N,arr[MAXN],MM;
  36. char s[15];
  37. struct zkw_Segment_Tree{
  38. int t[MAXN];
  39. void build(){
  40. up(i,M,LIM-1)t[i]=arr[i-M+1];
  41. down(dep,16,0)up(i,1<<dep,(1<<(dep+1))-1)t[i]=t[i<<1]+t[i<<1|1];
  42. }
  43. int Query(int L,int R){
  44. L-=1;R+=1;int ans=0;
  45. for(int S=L+M,T=R+M;S^T^1;S>>=1,T>>=1){
  46. if(~S&1) ans+=t[S^1];
  47. if(T&1) ans+=t[T^1];
  48. }
  49. return ans;
  50. }
  51. void Change(int pos,int d){
  52. for(pos+=M;pos;pos>>=1)t[pos]+=d;
  53. }
  54. }Tree;
  55. namespace solution{
  56. void Slove(){
  57. N=read();
  58. up(i,1,N)arr[i+1]=read();
  59. Tree.build();
  60. MM=read();
  61. while(MM--){
  62. scanf("%s",s);
  63. if(s[0]=='S'){
  64. int L=read(),R=read();
  65. printf("%d\n",Tree.Query(L,R));
  66. }
  67. else{
  68. int pos=read(),d=read();
  69. Tree.Change(pos,d);
  70. }
  71. }
  72. }
  73. }
  74. int main(){
  75. freopen(FILE".in","r",stdin);
  76. freopen(FILE".out","w",stdout);
  77. using namespace solution;
  78. Slove();
  79. return 0;
  80. }

ZKW线段树的更多相关文章

  1. zkw线段树详解

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

  2. BZOJ3173 TJOI2013最长上升子序列(Treap+ZKW线段树)

    传送门 Description 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? Input ...

  3. 【POJ3468】【zkw线段树】A Simple Problem with Integers

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  4. HDU 4366 Successor(树链剖分+zkw线段树+扫描线)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4366 [题目大意] 有一个公司,每个员工都有一个上司,所有的人呈树状关系,现在给出每个人的忠诚值和 ...

  5. [SinGuLaRiTy] ZKW线段树

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

  6. 数据结构3——浅谈zkw线段树

    线段树是所有数据结构中,最常用的之一.线段树的功能多样,既可以代替树状数组完成"区间和"查询,也可以完成一些所谓"动态RMQ"(可修改的区间最值问题)的操作.其 ...

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

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

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

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

  9. zkw线段树学习笔记

    zkw线段树学习笔记 今天模拟赛线段树被卡常了,由于我自带常数 \(buff\),所以学了下zkw线段树. 平常的线段树无论是修改还是查询,都是从根开始递归找到区间的,而zkw线段树直接从叶子结点开始 ...

随机推荐

  1. Ubantu【第一篇】:Ubantu中openssh连接

    h3 { color: rgb(255, 255, 255); background-color: rgb(30,144,255); padding: 3px; margin: 10px 0px } ...

  2. arcgis api for js入门开发系列二不同地图服务展示(含源代码)

    上一篇介绍了arcgis api离线部署,这篇开始正式介绍arcgis api for js开发:想要学习webgis开发,首先得熟悉了解前端技术,比如界面布局设计的html+css,核心的是java ...

  3. 关于从Activity A跳转到Activity B ,其中Activity A中有一个VideoView,Activity B中有一个MediaPlayer。

    两个不同的视频的跳转, 前面我是在onStop()方法中销毁VideoView(因为MediaPlayer是全局共用的,而VideoView内包含MediaPlayer),但是每次进入Activity ...

  4. 安开发卓之Notification(一)代码直接能用

    Notification是Android中很理想的一种显示提示信息的方法,它可以将应用程序的信息传递到我们的Android桌面状态栏,采用这种消息传递方式不会影响到用户对手机的正常使用.而且Notif ...

  5. 表单中Readonly和Disabled的区别

    1.readonly是要锁定这个控件,通过在界面上无法修改他(但是通过javascript可以修改他). 2.disabled和readonly有相同的地方也是可以锁定这个控件用户不能改变他的值,但是 ...

  6. 2015-12-01 SQL查询语句基础

    1.查询全体学生的学号与姓名select sno,snamefrom student;3.查询全体学生的详细信息select *from student;4.查询全体学生的姓名及其出生年份select ...

  7. Arduino 1602液晶屏实验和程序

    在Arduino IDE中, 项目->加载库->管理库中搜索LiquidCrystal,然后安装即可 1.接线图 2.引脚图 3.最简单程序 #include <LiquidCrys ...

  8. python安装numpy、scipy和matplotlib等whl包的方法

    最近装了python和PyCharm开发环境,但是在安装numpy和matplotlib等包时出现了问题,现总结一下在windows平台下的安装方法. 由于现在找不到了工具包新版本的exe文件,所以采 ...

  9. Servlet入门笔记

    一.一个简单的Servlet 在servlet 3.0之前,下面是基本步骤: 1.新建一个class名为FirstServlet,让它继承javax.servlet.http.HttpServlet: ...

  10. 【原】移动web资源整理

    2013年初接触移动端,简单做下总结,首先了解下移动web带来的问题 设备更新换代快——低端机遗留下问题.高端机带来新挑战 浏览器厂商不统一——兼容问题多 网络更复杂——弱网络,页面打开慢 低端机性能 ...