题解 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& ...
随机推荐
- 如何解决bib的一些问题
胡老师留的大作业要求综述,因而有很多文献引用.但是当使用bibtex的方法,特别是中文文献的引用会遇到一些问题. 网上相关的解答有: http://blog.sciencenet.cn/blog-10 ...
- 51nod 1572 宝岛地图 (预处理四个方向的最大步数优化时间,时间复杂度O(n*m+k))
题目: 这题如果没有时间限制的话暴力可以解,暴力的话时间复杂度大概是O(k*n),1s的话非常悬. 所以我们需要换个思路,我们对每个点预处理四个方向最多能走的步数,这个预处理时间复杂度是O(n*m). ...
- POJ 1990 MooFest【 树状数组 】
题意:给出n头牛,每头牛有一个听力v,坐标x,两头牛之间的能量为max(v1,v2)*dist(v1,v2),求总的能量值 先将每头牛按照v排序,排完顺序之后,会发现有坐标比当前的x小的,会有坐标比当 ...
- 《Unix环境高级编程》读书笔记 第3章-文件I/O
1. 引言 Unix系统的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close 本章描述的函数经常被称为不带缓冲的I/O.术语不带缓冲指的是在用户的进程中对其不会 ...
- js的调试和优化
一.常见的错误和异常 1.拼写错误 拼写错误,可以有代码的高亮来发现. 2.访问不存在的变量 3.括号不匹配 养成规范的编写习惯,适当应用Tab.空行等. 4.字符串和变量链接错误 采用多加括号来进行 ...
- oracle根据成绩排名查询某个名次段的人员
先说一下表结构 名字name 分数fenshu 表名test1,以下查询的是成绩排名为第三名和第四名,这个模板让你查随意排名段的人 select name,fenshu,mc from (se ...
- vuejs--递归组件(树型表格分享)
前言 前段时间使用vue做了一套后台管理系统,其中使用最多就是递归组件,也因为自己对官方文档的不熟悉使得自己踩了不少坑,今天写出来和大家一起分享. 递归组件 组件在它的模板内可以递归地调用 ...
- Vue组件通信之Bus
关于组件通信我相信小伙伴们肯定也都很熟悉,就不多说了,对组件通信还不熟悉的小伙伴移步这里. 在vue2.0中 $dispatch 和 $broadcast 已经被弃用.官方文档中给出的解释是: 因为基 ...
- 优秀Swift开源项目推荐
工具类 SwiftyJSON:GitHub上最为开发者认可的JSON解析类 Safe.ijaimi:源码漏洞分析检测工具,一键完成 Dollar.swift:Swift版Lo-Dash(或unders ...
- Ubuntu ctrl+alt会导致窗口还原的问题
Ubuntu ctrl+alt会导致窗口还原的问题 本来以为是compizConfig的问题,后来在系统config中找到键盘>快捷键:恢复窗口,删除这个快捷键,就好了: 原来这里写的是ctrl ...