线段树(裸题)
来源:互联网 发布:软件synthesia 编辑:程序博客网 时间:2024/06/07 10:27
线段树是什么,先来看道题。
codevs1082 线段树练习3
题目描述 Description
给你N个数,有两种操作:
1:给区间[a,b]的所有数增加X
2:询问区间[a,b]的数的和。
这样一看直接乱搞,然后AC掉......如果这道题数据水可以。但是如果我们要解决数据大的就GG。
其实这是到线段树的裸题,所以我们要使用线段树(其实树状数组也可以,只是我不太擅长)。
那么线段树是一棵二叉树,树中的每一个结点表示了一个区间[a,b]。每一个叶子节点表示了一个单位区间。对于每一个非叶结点所表示的结点[a,b],其左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。
线段树的看家本领就是区间修改查询,单点修改查询,etc。
那么我们先来看看线段树
1.建树
void build(int i, int a, int b){ t[i].left = a; t[i].right = b; t[i].ad = 0; if(a == b) { t[i].sum = aa[a]; return;} int mid = (a + b) >> 1; if(b > a) { build(2*i, a, mid); build(2*i+1, mid+1, b); } t[i].sum = t[2*i].sum + t[2*i+1].sum; return ;}2.更新
void updata(int i, int a, int b, int k){ if(t[i].left == a && t[i].right == b) {t[i].ad += k;return ;} t[i].sum += (b-a+1) * k; int mid = (t[i].left + t[i].right) >> 1; if(b <= mid) updata(2*i, a, b, k); if(a > mid) updata(2*i+1, a, b, k); if(b>mid &&a <= mid) { updata(2*i, a, mid, k); updata(2*i+1, mid+1, b, k);} return ;}3.查询
long long query(int i,int a,int b){ int mid = (t[i].left + t[i].right) >> 1; if(t[i].ad && t[i].right != t[i].left) {updata(2*i, t[i].left, mid, t[i].ad);updata(2*i+1, mid+1, t[i].right, t[i].ad);} t[i].sum += (t[i].right - t[i].left + 1) * t[i].ad; t[i].ad = 0; if(t[i].left == a && t[i].right == b)return t[i].sum; t[i].ad = 0; if(b <= mid)return query(2*i, a, b); if(a > mid)return query(2*i+1, a, b); if(b > mid && a <= mid)return query(2*i, a, mid) + qq(2*i+1, mid+1, b);}
看完之后不难发现线段树其实优在它的更新可以延时,我们只对要用的部分更新,对要用的部分查询。
最后祝您身体健康,再见。
0 0
- 线段树(裸题)
- hdu1754(线段树)(裸题)
- 初识线段树(线段树总结)
- codevs1080线段树练习(线段树)
- poj2777-线段树应用(线段覆盖)
- 线段树(poj2528)
- 线段树(1)
- poj2823(线段树)
- 线段树(1)
- 线段树(2)
- 线段树(4)
- poj2352-------------线段树------------(*)
- hdu2795Billboard(线段树)
- hdu1166(线段树)
- hdu1754(线段树)
- 线段树(SOJ4122)
- 线段树(SOJ2436)
- poj3468(线段树)
- void指针(void *的用法)
- iOS UIMenuController的使用
- ACdream 1084-数论训练B题--寒假安排
- ThinkPHP5快速入门
- Anaconda的安装和简单使用
- 线段树(裸题)
- 最长公共子序列
- 从广义线性模型到逻辑回归
- 向MySQL数据库插入中文时乱码
- Github Pages + Jekyll 独立博客一小时快速搭建&上线指南
- linux curl命令
- proto
- 通知:首届CISM大赛华东赛区决赛将于30日在马鞍山举行
- git版本回退