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

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

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

 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. Android 那些年,处理getActivity()为null的日子

    在日常开发中的时候,我们经常会使用ViewPager+Fragment进行视图滑动,在某些部分逻辑也许我们需要利用上下文Context(例如基本的Toast),但是由于Fragment只是衣服在Act ...

  2. Net Core链接数据库

    原文 在Windows下,相信大家分分钟都可以搞定.而初次接触.net core + mysql可能需要注意些细节.首先打开vs2017新建一个asp.net core项目(选Web应用程序), 然后 ...

  3. 解决maven 无法下载java-memcached的依赖问题

    1.进入https://github.com/gwhalin/Memcached-Java-Client/downloads 下载java-memcached的jar包. 2.使用cmd进入maven ...

  4. [洛谷P1580]yyy loves Easter_Egg I

    题目大意:很多人@一个人,如果那个人忍不住说话了,就轰炸成功,如果那个人没说话或者别的人没有@他或@很多个人,则轰炸失败.(具体见原题) 解题思路:字符串处理,好好用sscanf即可(细节见代码). ...

  5. 【jQuery03】简单的选项卡切换

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Linux 程序包管理-RPM

    程序简介:  POSIX(Portable Openratin System)跨平台系统:不同操作系统平台的标准C库(glibc)都是遵循POSIX规范的,这样基于标准库开发程序的源代码可以夸平台编译 ...

  7. camke 参数

    cmake -DCMAKE_INSTALL_PREFIX=/application/mysql-5.5.32 \   -DMYSQL_DATADIR=/application/mysql-5.5.32 ...

  8. 开源 PHP 项目找队友、顾问、指导、贡献者等等

    介绍站点还没做,先直接甩代码链接了 https://github.com/litphp/litphp Lit是什么? Lit是我一直在撸的个人框架,按第一次上传代码来说历史 超过4年 了,从还能支持P ...

  9. ZOJ 3365 Integer Numbers

    Integer Numbers Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on ZJU. Origina ...

  10. LaTeX 矩阵

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50054363 LaTeX 写矩阵,需要 ...