/*
线段树学习:如果一个节点为i,那么他的左孩子为2I+1,右孩子为2i+2;
*/ #include<stdio.h>
#define min(a,b) a<b?a:b;
int tree[];
int a[] = {,,,,,};
//创建树
void create(int root, int c[], int start, int end) {//root表示当前线段树下标
//a表示用来构造线段树的数组
//star表示数组起始位置
//end表示数组末尾位置
if (start == end) {
//叶子节点
tree[root] = c[start];
}
else {
int mid = (start + end) / ;
create(root * + , a, start, mid);//构造左子树
create(root * + , a, mid+, end);//构造右子树
tree[root] = min(tree[root * + ], tree[root * + ]);//节点保存最小值
} } //线段树区间查询,查询最小值 int find(int root, int starti, int endi, int start, int end) {
if (starti > end || endi < start) {
return ;//无法查询到
}
if (starti <=start&&endi >= end) {
return tree[root];
}
int mid = (start + end) / ;
return min(find(root * + , starti, endi, start, mid),find(root*+,starti,endi,mid+,end)); } //节点更新,节点的更新势必会影响到其父节点的更新,所以更新了节点之后还得更新其父节点 void update(int root, int start, int end, int index, int num) {
//root表示树状数组根节点下标
//start区间其实下标
//end区间结尾下标
//index需要更新的结点在原数组中的的下标
//num更新的数值,假设加上num
if (start == end) {
//叶子节点
if (start == index) {
//判断是否是需要跟新的结点
tree[root] += num;
}
}
else {
int mid = (start + end) / ;
if (index <= mid) {
//二分,如果小于mid则只在左子树查找
update(root * + , start, mid, index, num);
}
else {
update(root * + , mid + , end, index, num);
}
tree[root] = min(tree[root * + ], tree[root * + ]);
}
} int main() {
create(, a, ,);
int x, y;
int index, number;
//情书如你要跟新的坐标和数值
scanf("%d %d", &index, &number);
update(, , , index, number);
while (~scanf("%d %d", &x, &y)) {
printf("%d\n", find(, x, y, ,));
} return ;
}

线段树学习----C语言的更多相关文章

  1. zkw线段树学习笔记

    zkw线段树学习笔记 今天模拟赛线段树被卡常了,由于我自带常数 \(buff\),所以学了下zkw线段树. 平常的线段树无论是修改还是查询,都是从根开始递归找到区间的,而zkw线段树直接从叶子结点开始 ...

  2. 线段树学习笔记(基础&进阶)(一) | P3372 【模板】线段树 1 题解

    什么是线段树 线段树是一棵二叉树,每个结点存储需维护的信息,一般用于处理区间最值.区间和等问题. 线段树的用处 对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是 O(log n). 基础 ...

  3. JSOI2008 Blue Mary开公司 | 李超线段树学习笔记

    题目链接:戳我 这相当于是一个李超线段树的模板qwqwq,题解就不多说了. 代码如下: #include<iostream> #include<cstdio> #include ...

  4. hdu 1542 线段树+扫描线 学习

    学习扫描线ing... 玄学的东西... 扫描线其实就是用一条假想的线去扫描一堆矩形,借以求出他们的面积或周长(这一篇是面积,下一篇是周长) 扫描线求面积的主要思想就是对一个二维的矩形的某一维上建立一 ...

  5. 【学习笔记】线段树—扫描线补充 (IC_QQQ)

    [学习笔记]线段树-扫描线补充 (IC_QQQ) (感谢 \(IC\)_\(QQQ\) 大佬授以本内容的著作权.此人超然于世外,仅有 \(Luogu\) 账号 尚可膜拜) [学习笔记]线段树详解(全) ...

  6. 线段树合并学习笔记(P4556)

    直入主题: 学习线段树合并..... 从名字就能看出,这个东西要合并线段树..... 线段树怎么能合并呢...... 暴力合就行了啊...... 一次从上往下的遍历,把所有的节点信息暴力合并,然后就没 ...

  7. UOJ#470. 【ZJOI2019】语言 虚树,线段树合并

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ470.html 前言 做完情报中心来看这个题突然发现两题有相似之处然后就会做了. 题解 首先,我们考虑将所有答案点对分为两 ...

  8. Luogu5327【ZJOI2019】语言【树上差分,线段树合并】

    题目大意 给定一棵$n$个节点的树,维护$n$个集合,一开始第$i$个集合只有节点$i$.有$m$个操作,每次操作输入一个$(u,v)$,表示将$(u,v)$这条链上所有点所属的集合合并.求有多少个无 ...

  9. 可持久化线段树的学习(区间第k大和查询历史版本的数据)(杭电多校赛第二场1011)

    以前我们学习了线段树可以知道,线段树的每一个节点都储存的是一段区间,所以线段树可以做简单的区间查询,更改等简单的操作. 而后面再做有些题目,就可能会碰到一种回退的操作.这里的回退是指回到未做各种操作之 ...

随机推荐

  1. Spring Boot 事务的使用

    Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactio ...

  2. 《C# 爬虫 破境之道》:第一境 爬虫原理 — 第四节:同步与异步请求方式

    前两节,我们对WebRequest和WebResponse这两个类做了介绍,但两者还相对独立.本节,我们来说说如何将两者结合起来,方式有哪些,有什么不同. 1.4.1 说结合,无非就是我们如何发送一个 ...

  3. Webpack实战(二):webpack-dev-server的介绍与用法

    为什么要用webpack-dev-server 在开发中,我们都可以发现仅仅使用Webpack以及它的命令行工具来进行开发调试的效率并不高,每次编写好代码之后,我们需要执行npm run build命 ...

  4. Java动态编译技术原理

    这里介绍Java动态编译技术原理! 编译,一般来说就是将源代码转换成机器码的过程,比如在C语言中中,将C语言源代码编译成a.out,,但是在Java中的理解可能有点不同,编译指的是将java 源代码转 ...

  5. python接口自动化中,注册接口随机生成手机号码

    如大家所知在注册接口中,手机号参数需要的是未注册的手机号,而在测试用例中,你写入的手机号不一定是未注册的.所以这时需要对注册接口中传入的手机号做处理.下面我就分享一个课程里面学到的一个处理手机号的py ...

  6. Markdown 标记 粘贴到 小书 匠 才知道 哦

    # 一级标题## 这是二级标题### 三级标题##### 五级 高阶== 低阶-- [TOC] > 这是一级引用>>这是二级引用>>> 这是三级引用 ```java ...

  7. 《编写高质量代码:改善C#程序的157个建议》是C#程序员进阶修炼的必读之作

  8. 使用属性创建区域 (Creating Areas with Attributes) | 使用区域 | 高级路由特性 | 精通ASP-NET-MVC-5-弗瑞曼

  9. Python学习,第六课 - 集合

    Python中集合的相关操作 集合是一个无序的,不重复的数据组合 它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 list_1 =set ...

  10. 简单实现Android手机“全局可调试”(ro.debuggable = 1)的方法【锤子坚果3】

    在Android真机上调试程序有一个前提,就是这个apk包必须有 debuggable=true 的属性才行.而除了自己开发的apk能够控制打包属性之外,其他的程序发行之后显然不会设这个值为 true ...