题解 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& ...
随机推荐
- 消息总线VS消息队列
前段时间实现了一个基于RabbitMQ的消息总线,实现的过程中自己也在不断得思考.总结以及修正.需要考虑各个维度:效率.性能.网络.吞吐量.甚至需要自己去设想API可能的使用场景.模式.不过能有一件事 ...
- 配置 centos apache 的日志文件为每天保存,在home分区
/usr/local/apache/bin/rotatelogs 这个执行程序会根据安装方式不同的位置也不同,yum安装的话,路径为:/usr/sbin/rotatelogs 改为: ErrorLog ...
- php查询字符串是否存在 strpos
/*** 查询字符是否存在于某字符串** @param $haystack 字符串* @param $needle 要查找的字符* @return bool*/function str_exists( ...
- SpringCloud学习笔记(13)----Spring Cloud Netflix之Hystrix断路器的隔离策略
说明 : 1.Hystrix通过舱壁模式来隔离限制依赖的并发量和阻塞扩散 2. Hystrix提供了两种隔离策略:线程池(THREAD)和信号量隔离SEMAPHORE). 1. 线程池隔离(默认策略模 ...
- SpringBoot学习笔记(3)----SpringBoot的profile多环境配置
在实际的应用开发中,可能会需要不同配置文件来支撑程序的运行,如开发,测试,预生产,生产环境等,程序在不同的环境下可能需要不同的配置,如不同数据源等,如果每次在不同的环境下都要去修改配置文件就会闲得不合 ...
- 死锁,线程协作(同步,阻塞队列,Condition,管道流)
synchronized死锁 package com.thread.demo.deadlock; public class DeadLock { private static Object lock1 ...
- Ubuntu 16.04 Chrome浏览器安装flash player插件
1:官网下载插件 flash palyer lash_player_npapi_linux_debug.x86_64.tar.gz 2:解压 提取 libpepflashplayer.so 3:手动 ...
- POJ——T1860 Currency Exchange
http://poj.org/problem?id=1860 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 29874 ...
- Qt之图形(简笔画-绘制漂亮的西瓜)
简述 Summer is coming-我们呢,为大家准备了丰盛的佳果-西瓜,清爽解渴,甘味多汁. 一笔一划学简笔画,分分钟让你掌握一门新技能,下面我们来绘制一个"盛夏之王"-西瓜 ...
- spark一些入门资料
spark一些入门资料 A Scala Tutorial for Java Programmers http://docs.scala-lang.org/tutorials/scala-for-jav ...