线段树(1)——点修改&建树
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAX 10000
#define INF 2147000047
int n,m;
int minv[MAX],sumv[MAX];//附加信息
//温馨提示:这的附加信息最好开n*4的,原因自己画图推吧
int ql, qr;//查询区间
//查询[ql, qr]中的最小值
int query_min(int o, int L, int R) {
int M = (L + R) >> 1, ans = INF;
if(ql <= L && R <= qr) return minv[o]; //递归出口(当前节点完全在查询区间内)
if(ql <= M) ans = min(ans, query_min(o*2, L, M) );//往左走(查询区间在左儿子节点中有元素)
if(M < qr) ans = min(ans, query_min(o*2+1, M+1, R) );//往右走(同理
return ans;
}
//查询[ql, qr]元素和
int query_sum(int o, int L, int R) {
int M = (L + R) >> 1 , ans = 0;
if(ql <= L && R <= qr) return sumv[o];//出口
if(ql <= M) ans += query_sum(o*2, L, M);
if(qr > M) ans += query_sum(o*2+1, M+1, R);
return ans;
}
int p,v;//修改A[p] = v
void update(int o, int L, int R) {
int M = (L + R) >> 1;
if(L == R) {
minv[o] = v;
sumv[o] = v;
//....
}
else {// L < R
//先递归更新左子树 或 右子树
if(p <= M) update(o*2, L, M); else update(o*2+1, M+1, R);
//然后计算本节点的附加值
minv[o] = min(minv[o*2], minv[o*2+1]);
sumv[o] = sumv[o*2] + sumv[o*2+1];
}
}
int main() {
scanf("%d%d",&n,&m);
for(p = 1; p <= n; p++) {
scanf("%d", &v);
update(1, 1, n);//建树
}
//注:可以换一种建树的方法,写一个build_tree()之后一次性访问完所有节点,O(n)
//别忘了push_up
for(int i = 1; i <= 15; i++) {
printf("sumv[%d] = %d, minv[%d] = %d\n", i, sumv[i], i, minv[i]);
}
int cmd;
for(int i = 1; i <= m; i++) {
scanf("%d",&cmd);
if(cmd == 1) {
scanf("%d%d",&ql,&qr);
printf("[%d, %d]之间最小值为 %d\n",ql, qr, query_min(1, 1, n));
}
else {
scanf("%d%d",&ql, &qr);
printf("[%d, %d]之间的元素和为 %d\n",ql, qr, query_sum(1, 1, n));
}
}
return 0;
}
/*
5 5
1 2 3 4 5
2 1 3
2 1 5
1 1 5
2 1 5
2 1 4
*/
线段树(1)——点修改&建树的更多相关文章
- hiho一下20周 线段树的区间修改
线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了 ...
- poj 3468:A Simple Problem with Integers(线段树,区间修改求和)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 58269 ...
- hihoCode 1078 : 线段树的区间修改
#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...
- hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)
#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...
- hdu 1754 线段树(Max+单点修改)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 1166 线段树(sum+单点修改)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 12:Challenge 5(线段树区间直接修改)
总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 262144kB 描述 给一个长为N的数列,有M次操作,每次操作是以下两种之一: (1)将某连续一段同时改成一个数 ...
- UVa 11992 Fast Matrix Operations (线段树,区间修改)
题意:给出一个row*col的全0矩阵,有三种操作 1 x1 y1 x2 y2 v:将x1 <= row <= x2, y1 <= col <= y2里面的点全部增加v: 2 ...
- hiho一下21周 线段树的区间修改 离散化
离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho ...
- HDU 5316 Magician (线段树,单值修改,微变形)
题意:给一个初始序列A[1,n],第j个数字代表精灵j的power值,有两种操作:(1)查询区间[L,R] (2)修改某个精灵的power值. 但,查询的是区间[L,R]中一个美丽子序列sub[l,r ...
随机推荐
- node post和get请求原理
重要:GET和POST请求他们都是上行请求,都是把数据从浏览器带向服务器的方式, GET 请求实际上就是识别URL中的querystring部分POST请求,一般用来发送大量的内容,此时node非常害 ...
- 设置Hadoop的 dataNode的单个Map的内存配置
1.进入hadoop的配置目录 ,找到 环境变量的 $HADOOP_HOME cd $HADOOP_HOME 2.修改dataNode 节点的 单个map的能使用的内存配置 找到配置的文件: /opt ...
- ROS:ubuntuKylin17.04-Ros使用OrbSLAM2
忙于图像处理和DCNN,很长时间不使用ROS,重新安装系统后,再次使用ORB-SLAM2(ROS)进行三维重建和实时追踪的演示. 参考以前的文章:ROS:ubuntu-Ros使用OrbSLAM ORB ...
- swift里 as、as!、as?区别 T.Type与动态类型
as 1.编译器进行类型转换合法性检查:静态 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: shoppingLi ...
- vue 上滑加载更多
移动端网页的上滑加载更多,其实就是滑动+分页的实现. <template> <div> <p class="footer-text">--{{f ...
- Tomcat的几种部署方式
1. 直接把项目的根目录放在: apache-tomcat-*.*\webapps\ROOT 这样即可以通过http://127.0.0.1:8080 来访问 2. 把项目根目录放在: apach ...
- Lua的函数的定义、math数学函数、lua字符串的处理、lua支持的字符串类、模式串中的特殊字符_学习笔记04
Lua的函数的定义.math数学函数 定义函数 function [function name] (param1,param2) [function code] --定义一个函数用来求的两个数字的和 ...
- js-2018-11-09 关于Array中的srot()方法和compare()方法
Array中的srot()方法 sort()方法是用来重排序的方法.在默认情况下,sort()方法按升序排列数组项----即最小的值位于最前面,最大的值排在最后面. 我们看看官方是怎么说的: arra ...
- STL源码分析之第一级配置器
前言 上一节我们分析了空间配置器对new的配置, 而STL将空间配置器分为了两级, 第一级是直接调用malloc分配空间, 调用free释放空间, 第二级三就是建立一个内存池, 小于128字节的申请都 ...
- 网络安全web部分
Web安全 一. SQL注入 1) 原理 通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序 ...