题解 P2068 【统计和】
这是一道单点修改,区间查询的线段树。
需要实现的操作有三个:建树,更新与查询。
首先,线段树用结构体维护,如下:
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 【统计和】的更多相关文章
- 洛谷——P2068 统计和
P2068 统计和 题目描述 给定一个长度为n(n<=100000),初始值都为0的序列,x(x<=10000)次的修改某些位置上的数字,每次加上一个数,然后提出y (y<=1000 ...
- P2068 统计和
P2068 统计和 这题真的非常水了 如果不会 右转[模板]树状数组 2 基本上是一模一样的 #include <bits/stdc++.h> #define lowbit(x) x&am ...
- Luogu P2068 统计和
P2068 统计和 题目描述 给定一个长度为n(n<=100000),初始值都为0的序列,x(x<=10000)次的修改某些位置上的数字,每次加上一个数,然后提出y (y<=1000 ...
- 洛谷P2068 统计和题解
题目描述 给定一个长度为n(n<=100000),初始值都为0的序列,x(x<=10000)次的修改某些位置上的数字,每次加上一个数,然后提出y (y<=10000)个问题,求每段区 ...
- P2068 统计和(树状数组模板)
这是一道树状数组题 #include<iostream> using namespace std; ; int tree[maxn], n, m; char h; int x, y; vo ...
- 洛谷P2068 统计和
题目描述 给定一个长度为\(n(n \leq 100000)\),初始值都为\(0\)的序列,\(x(x \leq 10000)\)次的修改某些位置上的数字,每次加上一个数,然后提出\(y (y \l ...
- 洛谷 P2068 统计和
题目描述 给定一个长度为n(n<=100000),初始值都为0的序列,x(x<=10000)次的修改某些位置上的数字,每次加上一个数,然后提出y (y<=10000)个问题,求每段区 ...
- 线段tree~讲解+例题
最近学习了线段树这一重要的数据结构,有些许感触.所以写一篇博客来解释一下线段树,既是对自己学习成果的检验,也希望可以给刚入门线段树的同学们一点点建议. 首先声明一点,本人是个蒟蒻,如果在博客中有什么不 ...
- [Luogu] 树状数组
https://www.luogu.org/problemnew/show/P3374 单点修改,区间查询 #include <iostream> #include <cstdio& ...
随机推荐
- sql 分割日期
datename(Year,CreateTime) ==2017 datename(Month,CreateTime) 7 1.获取星期(显示中文如:星期一) Select DateName( ...
- ASP调用WebService转化成JSON数据,附json.min.asp
首先定义SOAP数据,然后创建HTTP对象,然后使用POST提交,获取状态码为200,就说明调用成功,再进行下一步操作…… <!--#Include virtual="/Include ...
- HDU 3584 Cube 【 三维树状数组 】
题意:还是那篇论文里面讲到的,三维树状数组http://wenku.baidu.com/view/1e51750abb68a98271fefaa8画个立方体出来对照一下好想一点 #include< ...
- 初识Git(一)
以前经常听到Git,作为一个菜鸟级自学选手从没有真正去了解Git,借刘铁猛老师在油管上的<对答如刘>初步认识了git,作以下记录. 1.初始化一个git管理的文件夹 首先我在我的电脑C盘P ...
- php查询字符串是否存在 strpos
/*** 查询字符是否存在于某字符串** @param $haystack 字符串* @param $needle 要查找的字符* @return bool*/function str_exists( ...
- sass的用法小结(四)进阶篇
Sass 的数据类型 Sass 既然有了类似编程语言的功能,自然也就有了简单的数据类型.这里简单的介绍一些 Sass 中的数据类型,因为在后面的讨论中要用到有关的内容. Sass 中主要有六种数据类型 ...
- ztree连接数据库,实现下拉菜单
$(document).ready(function(){ var treeObj = $("#treeDemo"); $.fn.zTree.init(treeObj, setti ...
- python学习笔记:第五天
day05: 1.字符串格式化输出: 1.占位符:%s (字符串) %d(整型) %f (浮点型) 打印格式:print("字符串为%s" %s) 2.字符串:判断是否是 ...
- window下搭建Python3.7+selenium3.1.1+pycharm环境
1.安装Python3.7 1.1 下载 Python并安装 Python3.5 (勾选上 Add Python3.7 to PATH) 点击 Install Now,安装完成后将python路径加 ...
- Python+Appium来写app自动化脚本
1...........................我有空再补