这是一道单点修改,区间查询的线段树。

需要实现的操作有三个:建树,更新与查询。

首先,线段树用结构体维护,如下:

 struct node {
int l, r;
int val;
} tree[maxn * ];

其中l, r表示节点所表示区间左右端点,而val则是区间和。

Build函数如下:

 void Build(int l, int r, int pos) {
tree[pos].l = l;
tree[pos].r = r;
tree[pos].val = ;
if(l == r) return ;
int mid = (l + r) / ;
Build(l, mid, pos * );
Build(mid + , r, pos * + );
}

这个函数就是初始化整棵线段树,没有什么特别需要解释的。

Update函数如下:

 void Update(int x, int val, int pos) {
if(tree[pos].r == tree[pos].l) {
tree[pos].val += val;
return ;
} int mid = (tree[pos].l + tree[pos].r) / ;
if(x <= mid) Update(x, val, pos * );
else Update(x, val, pos * + );
tree[pos].val = tree[pos * ].val + tree[pos * + ].val;
}

x表示需要修改的节点,val表示需要增加的值,pos表示当前节点。

如果走到了叶节点上,直接修改,然后结束。

否则,判断x在当前节点的哪一个儿子上,向下。

最后更新当前节点的值。

Query函数如下:

 int Query(int l, int r, int pos) {
if(tree[pos].l >= l && tree[pos].r <= r) {
return tree[pos].val;
}
int mid = (tree[pos].l + tree[pos].r) / ;
int ans = ;
if(l <= mid) ans += Query(l, r, pos * );
if(mid < r) ans += Query(l, r, pos * + );
return ans;
}

如果当前节点的整个区间都已经被包含在所求的区间内了,那么不用再进行划分,返回区间值即可。

否则分三种情况讨论:

1. 若所求区间只与左儿子有交集,移到左儿子。

2. 若只与右儿子有交集,移到右儿子。

3. 若被当前节点覆盖,左儿子右儿子都算。

以上就是思路及关键代码。

顺便推荐两道经典的单点修改题目(反正我是做了的):

1. HDU1166 敌兵布阵

2. HDU1754 I hate it

(注:第二道题是求区间最值,和模板稍有不同。)

题解 P2068 【统计和】的更多相关文章

  1. 洛谷——P2068 统计和

    P2068 统计和 题目描述 给定一个长度为n(n<=100000),初始值都为0的序列,x(x<=10000)次的修改某些位置上的数字,每次加上一个数,然后提出y (y<=1000 ...

  2. P2068 统计和

    P2068 统计和 这题真的非常水了 如果不会 右转[模板]树状数组 2 基本上是一模一样的 #include <bits/stdc++.h> #define lowbit(x) x&am ...

  3. Luogu P2068 统计和

    P2068 统计和 题目描述 给定一个长度为n(n<=100000),初始值都为0的序列,x(x<=10000)次的修改某些位置上的数字,每次加上一个数,然后提出y (y<=1000 ...

  4. 洛谷P2068 统计和题解

    题目描述 给定一个长度为n(n<=100000),初始值都为0的序列,x(x<=10000)次的修改某些位置上的数字,每次加上一个数,然后提出y (y<=10000)个问题,求每段区 ...

  5. P2068 统计和(树状数组模板)

    这是一道树状数组题 #include<iostream> using namespace std; ; int tree[maxn], n, m; char h; int x, y; vo ...

  6. 洛谷P2068 统计和

    题目描述 给定一个长度为\(n(n \leq 100000)\),初始值都为\(0\)的序列,\(x(x \leq 10000)\)次的修改某些位置上的数字,每次加上一个数,然后提出\(y (y \l ...

  7. 洛谷 P2068 统计和

    题目描述 给定一个长度为n(n<=100000),初始值都为0的序列,x(x<=10000)次的修改某些位置上的数字,每次加上一个数,然后提出y (y<=10000)个问题,求每段区 ...

  8. 线段tree~讲解+例题

    最近学习了线段树这一重要的数据结构,有些许感触.所以写一篇博客来解释一下线段树,既是对自己学习成果的检验,也希望可以给刚入门线段树的同学们一点点建议. 首先声明一点,本人是个蒟蒻,如果在博客中有什么不 ...

  9. [Luogu] 树状数组

    https://www.luogu.org/problemnew/show/P3374 单点修改,区间查询 #include <iostream> #include <cstdio& ...

随机推荐

  1. 51nod 1402 最大值 3级算法题 排序后修改限制点 时间复杂度O(m^2)

    代码: 题意,第一个数为0,相邻的数相差0或者1,有一些点有限制,不大于给定值,求这组数中可能的最大的那个数. 这题我们看一个例子:第5个数的限制为2 1 2 3 4 5 6 7 8 9 0 1 2 ...

  2. Oracle查询当前用户下的所有表及sqlplus 设置 列宽

    如果oracle服务器中装有多个数据库实例,则在用户名处输入:用户名/密码@数据库名称.如果数据库服务器不在本机上,还需要加上数据库服务器的地址:用户名/密码@IP地址/数据库名称. [oracle@ ...

  3. jq不懂的地方

    在循环列表中,获取input标签的值,不能用id获取,用class获取值,通过父级属性找到class,this 指当前点击的位置var UID = $(this).parents("tr&q ...

  4. 监控RMAN操作进度的脚本

    REM ------------------------------- REM Script to monitor rman backup/restore operations REM To run ...

  5. Js中遇到的坑点汇总

    一.Android 手机下输入框获取焦点时, 输入法挡住输入框的 bug 解决思路: 1.去掉overflow属性 2. Android 手机下, input 或 textarea 元素聚焦时, 主动 ...

  6. eclipse的springMVC环境搭建并输出HelloWorld

    spring简单介绍:https://www.cnblogs.com/package-java/p/10368672.html 1.创建一个Maven Project项目 点击下一步 点击下一步 2. ...

  7. JVM内存管理简单剖析

    Java是一个跨平台语言,屏蔽操作系统的差异,无需关心复杂内存管理,做到编写一次到处运行.其强大的能力源于Java Virtual Machine (虚拟机)默默的付出.代码运行在虚拟机之上,虚拟机运 ...

  8. 项目集成Hudson+SonarQube出现的一个问题

    [ERROR] No plugin found for prefix 'sonar' in the current project and in the plugin groups [org.mort ...

  9. JAVA:从public static void main(String args[])開始

    我们都知道当你要执行一个JAVA文件的时候必需要有一个main函数. 这是为什么呢? 跟C语言的道理一样,当你执行一个文件的时候.你必需要有一个入口函数或者入口地址,在C里面是main函数.相同的在J ...

  10. CSS中关于vertical-align垂直对齐

    一向以来,我对vertical-align的属性都搞的不是太清楚,今天刚好碰到有朋友问我相关的问题,于是自己潜心研究了一番,发现这玩意还真不是个简单的东西,在此我分享的东西都是抛弃脑残的IE的,如果你 ...