ACM数据结构-线段树
1.维护区间最大最小值模板(以维护最小值为例)
#include<iostream>
#include<stdio.h> #define LEN 11
#define MAX 1<<30 using namespace std; int arr[LEN]={,,,,,,,,,,};
int st[LEN*]; //segment tree
int n; void init(int len){
n=;
while(n<len) n*=; //不断乘以2,知道>=len
for(int i=;i<n;i++) st[i]=MAX;
} void update(int p,int v){ //我们有n(len的二次幂扩增)个叶子作为线段元素
p+=n-; //地址重定向,变为叶子节点所在地址
st[p]=v;
while(p>){
p=(p-)/; //向上跳转到父节点
st[p]=min(st[p*+],st[p*+]); //更新父节点
}
} // 查询[a,b)的最小值,当前函数的查询是[l,r) 。当前根节点为p
int query(int a,int b,int p,int l,int r){//外部调用: query(a,b,0,0,n)
//如果[a,b)与[l,r)不相交
if(a>=r || b<=l)
return MAX;
//如果[a,b)包裹住了[l,r)
if(a<=l && b>=r)
return st[p];
//其他情况,二分进行查询
int v1=query(a,b,p*+,l,(l+r)/);
int v2=query(a,b,p*+,(l+r)/,r);
return min(v1,v2);
} int main(){
init(LEN);
int i,a,b;
for(i=;i<LEN;i++)
update(i,arr[i]);
while(){
scanf("%d%d",&a,&b);
printf("%d\n",query(a,b,,,n));
}
return ;
}
2.维护区间和的模板
数据结构:
struct node
{
int left,right;
int num;
}tree[];
建树:
void build(int left,int right,int index) //build(1,n,1);
{
he++;
tree[index].left=left;
tree[index].right=right;
if(left==right)
return ;
int mid=(right+left)/;
build(left,mid,index*);
build(mid+,right,index*+);
}
单点修改:
void my_plus(int index,int dis,int k) //将索引为p的元素增加k
{ // my_plus(1,p,k)
tree[index].num+=k;
if(tree[index].left==tree[index].right) //没有叶子节点
return ;
if(dis<=tree[index*].right)
my_plus(index*,dis,k);
if(dis>=tree[index*+].left)
my_plus(index*+,dis,k);
}
单点查询:
int search(int index,int dis) //调用方法:查找索引为p的元素:search(1,p)
{
if(tree[index].left==tree[index].right && tree[index].left==dis)
return tree[index].num;
if(dis<=tree[index*].right)
search(index*,dis);
if(dis>=tree[index*+].left)
search(index*+,dis);
}
区间修改:
void pls(int index,int l,int r,int k)
{
if(tree[index].left>=l && tree[index].right<=r)
{
tree[index].num+=k;
return ;
}
if(tree[index*].right>=l)
pls(index*,l,r,k);
if(tree[index*+].left<=r)
pls(index*+,l,r,k);
}
区间查询:
void search(int index,int l,int r)
{
//cout<<index<<" ";
if(tree[index].left>=l && tree[index].right<=r)
{
ans+=tree[index].num;
return ;
}
if(tree[index*].right>=l)
search(index*,l,r);
if(tree[index*+].left<=r)
search(index*+,l,r);
}
3.模板编写练习:
ACM数据结构-线段树的更多相关文章
- ACM/ICPC 之 数据结构-线段树+区间离散化(POJ2528)
这道题用线段树做更方便更新和查询,但是其数据范围很大,因此要将离散化和线段树结合起来,算是一道比较经典的线段树+离散化的例题. 线段树的离散化有很多方法,在这里,我先用一次结点离散化,间接将源左右端点 ...
- ACM/ICPC 之 数据结构-线段树思想(POJ2182,含O(n^2)插入式解法)
这道题在一定程度上体现了线段树的一种用法,解决的问题是:对于总计n个元素的第i个元素,已知其在[1,i]上部分序列的排名,求第i个元素在所有n个元素中的排名. 当然这道题数据比较水,所以用O(n^2) ...
- 算法手记 之 数据结构(线段树详解)(POJ 3468)
依然延续第一篇读书笔记,这一篇是基于<ACM/ICPC 算法训练教程>上关于线段树的讲解的总结和修改(这本书在线段树这里Error非常多),但是总体来说这本书关于具体算法的讲解和案例都是不 ...
- 模板 - 数据结构 - 线段树/SegmentTree
区间求加法和: 单点修改的,普通线段树. struct SegmentTree { #define ls (o<<1) #define rs (o<<1|1) static c ...
- 第二十九篇 玩转数据结构——线段树(Segment Tree)
1.. 线段树引入 线段树也称为区间树 为什么要使用线段树:对于某些问题,我们只关心区间(线段) 经典的线段树问题:区间染色,有一面长度为n的墙,每次选择一段墙进行染色(染色允许覆盖),问 ...
- hiho1079 - 数据结构 线段树(入门题,离散化)
题目链接 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho所在的学校举办社团文化节,各大社团都在宣传栏上贴起了海报,但是贴来贴去 ...
- 数据结构--线段树--lazy延迟操作
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 53749 ...
- 数据结构(线段树):BZOJ 3126: [Usaco2013 Open]Photo
3126: [Usaco2013 Open]Photo Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 222 Solved: 116 Descrip ...
- 数据结构(线段树):HDU 5649 DZY Loves Sorting
DZY Loves Sorting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Oth ...
随机推荐
- ABP 执行sql语句
由于业务繁琐,用EF比较麻烦,需要用到sql语句,然后网上找了很久,找到的例子都是老版本的,新版本有先声明已经去掉,不能用了 在这里做个小记 首先注入实例 private readonly IDbCo ...
- Shadowmap简易实现
之前一直没有自己实现过阴影,只是概念上有所了解,这次通过Demo进行实际编写操作. 总的来说没有什么可以优化的,倒是对于窗户这种可用面片代替的物体似乎能优化到贴图上,之前arm有个象棋屋的demo做过 ...
- 浏览器解析js
网页加载js步骤 1.浏览器一边下载html网页,一边开始解析(不等下载完就解析)2.遇到<script>标签,暂停解析,网页渲染的控制权交给javascript引擎3.如果<scr ...
- 2019 头条java面试笔试总结 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条等公司offer,岗位是Java后端开发,因为发展原因最终选择去了头条,入职一年时间了,也成为了面试官,之前面 ...
- Android四大组件——Activity跳转动画、淡出淡入、滑出滑入、自定义退出进入
Activity跳转动画.淡入淡出.滑入滑出.自定义退出进入 前言: 系统中有两个定义好的Activity跳转动画:fade_in.fade_out.slide_in_left.slide_out_r ...
- 上传文件至Github仓库
Github的使用 创建一个本地的版本库(也就是一个文件夹) 新建文件夹,或使用Git bash命令行窗口创建 $ mkdir test $ cd test 在命令行中输入 git init把这个文件 ...
- APS系统的现状以及与MES系统的关联
MES是智能工厂的核心,将前端产品设计.工艺定义阶段的产品数据管理与后端制造阶段的生产数据管理融合,实现产品设计.生产过程.维修服务闭环协同全生命周期管理. APS就是高级计划排程 应该说APS本来是 ...
- AI金融:LSTM预测股票
第一部分:从RNN到LSTM 1.什么是RNN RNN全称循环神经网络(Recurrent Neural Networks),是用来处理序列数据的.在传统的神经网络模型中,从输入层到隐含层再到输出层, ...
- android中fragment卡顿的原因
首页的ViewPager有十几个Fragment,在快速切换的时候,容易产生卡顿现象. 二.分析当ViewPager切换到当前的Fragment时,Fragment会加载布局并显示内容,如果用户这时快 ...
- Python学习日记(三十八) Mysql数据库篇 六
Mysql视图 假设执行100条SQL语句时,里面都存在一条相同的语句,那我们可以把这条语句单独拿出来变成一个'临时表',也就是视图可以用来查询. 创建视图: CREATE VIEW passtvie ...