线段树学习----C语言
/*
线段树学习:如果一个节点为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语言的更多相关文章
- zkw线段树学习笔记
zkw线段树学习笔记 今天模拟赛线段树被卡常了,由于我自带常数 \(buff\),所以学了下zkw线段树. 平常的线段树无论是修改还是查询,都是从根开始递归找到区间的,而zkw线段树直接从叶子结点开始 ...
- 线段树学习笔记(基础&进阶)(一) | P3372 【模板】线段树 1 题解
什么是线段树 线段树是一棵二叉树,每个结点存储需维护的信息,一般用于处理区间最值.区间和等问题. 线段树的用处 对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是 O(log n). 基础 ...
- JSOI2008 Blue Mary开公司 | 李超线段树学习笔记
题目链接:戳我 这相当于是一个李超线段树的模板qwqwq,题解就不多说了. 代码如下: #include<iostream> #include<cstdio> #include ...
- hdu 1542 线段树+扫描线 学习
学习扫描线ing... 玄学的东西... 扫描线其实就是用一条假想的线去扫描一堆矩形,借以求出他们的面积或周长(这一篇是面积,下一篇是周长) 扫描线求面积的主要思想就是对一个二维的矩形的某一维上建立一 ...
- 【学习笔记】线段树—扫描线补充 (IC_QQQ)
[学习笔记]线段树-扫描线补充 (IC_QQQ) (感谢 \(IC\)_\(QQQ\) 大佬授以本内容的著作权.此人超然于世外,仅有 \(Luogu\) 账号 尚可膜拜) [学习笔记]线段树详解(全) ...
- 线段树合并学习笔记(P4556)
直入主题: 学习线段树合并..... 从名字就能看出,这个东西要合并线段树..... 线段树怎么能合并呢...... 暴力合就行了啊...... 一次从上往下的遍历,把所有的节点信息暴力合并,然后就没 ...
- UOJ#470. 【ZJOI2019】语言 虚树,线段树合并
原文链接www.cnblogs.com/zhouzhendong/p/UOJ470.html 前言 做完情报中心来看这个题突然发现两题有相似之处然后就会做了. 题解 首先,我们考虑将所有答案点对分为两 ...
- Luogu5327【ZJOI2019】语言【树上差分,线段树合并】
题目大意 给定一棵$n$个节点的树,维护$n$个集合,一开始第$i$个集合只有节点$i$.有$m$个操作,每次操作输入一个$(u,v)$,表示将$(u,v)$这条链上所有点所属的集合合并.求有多少个无 ...
- 可持久化线段树的学习(区间第k大和查询历史版本的数据)(杭电多校赛第二场1011)
以前我们学习了线段树可以知道,线段树的每一个节点都储存的是一段区间,所以线段树可以做简单的区间查询,更改等简单的操作. 而后面再做有些题目,就可能会碰到一种回退的操作.这里的回退是指回到未做各种操作之 ...
随机推荐
- 《Java核心技术》 JVM指令集
https://www.jianshu.com/p/bc91c6b46d7b
- Selenium的简单使用
selenium的使用对于新手来说十分友好,因为他避开了如今网络中的异步加载抓取的困扰,使得我们大部分的时间可以用于提取信息和存储中,下面就简单的列一些使用的代码,希望给同样初学的你有一定的参考价值. ...
- Java入门 - 高级教程 - 08.Applet
原文地址:http://www.work100.net/training/java-applet.html 更多教程:光束云 - 免费课程 Applet 序号 文内章节 视频 1 概述 2 Apple ...
- Linux上部署web服务器并发布web项目
近在学习如何在linux上搭建web服务器来发布web项目,由于本人是linux新手,所以中间入了不少坑,搞了好久才搞出点成果.以下是具体的详细步骤以及我对此做的一些总结和个人的一些见解,希望对跟我一 ...
- Java容器解析系列(15) HashTable Dictionary & Properties
HashTable的实现原理与HashMap没有什么区别; 其与HashMap的主要区别如下: 添加进入jdk时间:HashTable在jdk1.0时添加,HashMap在jdk1.2时添加; 类签名 ...
- tomcat梳理
tomcat梳理 Tomcat的缺省端口是多少,怎么修改? 默认接口是8080 修改 1)找到Tomcat目录下的conf文件夹 2)进入conf文件夹里面找到server.xml文件 3)打开ser ...
- larabel Artisan Command 使用总结
larabel Artisan Command 使用总结 定义命令 在routes/console.php下定义命令 Artisan::command('ltf', function () { (ne ...
- A novel multi-swarm particle swarm optimization with dynamic learning strategy(一种新颖的具有动态学习策略的多种群粒子群优化算法)
1.核心 在每个子种群的粒子被划分为普通粒子(ordinary particles)和交流粒子(communication particles),在每次迭代过程中,不同的粒子执行不同的进化操作.普通粒 ...
- DjangoBBS项目功能拆分
目录 1.随机验证码 2.注册功能 3.登录功能 4.登录认证装饰器配置 5.修改密码模态框方法 6.修改头像 7.修改签名模态框方法 8.注销功能模态框 9.用户上传静态文件配置 10.图片防盗链 ...
- centos7安装lnmp
一.配置CentOS 第三方yum源(CentOS默认的标准源里没有nginx软件包) [root@localhost ~]# yum install wget #安装下载工具wget [root@l ...