复习线段树
来源:互联网 发布:商务中国域名转出 编辑:程序博客网 时间:2024/06/15 14:40
回归的第一天就听大姐姐的LCT
发现还要先懂WT大哥哥的SPLAY
发现还要先复习一下线段树
发现要复习一下二叉树
发现......
好吧其实没这么多发现
总之线段树又打了一遍
线段树
一、建树
二、查询
三、点修改
四、区间修改
(还要注意一个lazy-tag,还是迷迷糊糊的)
自己好好理解吧~
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>//eg.找最小数 using namespace std;#define maxn (1000+10)#define INF 0x7f7f7f7fint a[maxn];struct node{ int val; int lazy;}seg[maxn*4];void built(int node, int be, int en){seg[node].lazy = 0;if(be == en) seg[node].val = a[be];else{int mid = be+((en-be)>>1);built(node*2, be, mid);built(node*2+1, mid+1, en);seg[node].val = min(seg[node*2].val, seg[node*2+1].val);}}void update_point(int node, int be, int en, int ind, int add){ if(be == en && ind == be){ seg[node].val += add; return;}int mid = be+((en-be)>>1);if(ind <= mid)update_point(node*2, be, mid, ind, add);else update_point(node*2+1, mid+1, en, ind, add);seg[node].val = min(seg[node*2].val, seg[node*2+1].val);}void pushdown(int node){ if(seg[node].lazy != 0){ seg[node*2].lazy += seg[node].lazy; seg[node*2+1].lazy += seg[node].lazy; seg[node*2].val += seg[node].lazy; seg[node*2+1].val += seg[node].lazy; seg[node].lazy = 0;}}int query(int node, int be, int en, int le, int ri){if(be > ri || en < le) return INF;if(be >= le && en <= ri) return seg[node].val;pushdown(node);int mid = be+((en-be)>>1);return min(query(node*2, be, mid, le, ri), query(node*2+1, mid+1, en, le, ri));}void update_interval(int node, int be, int en, int le, int ri, int add){if(be > ri || en < le) return;if(be >= le && en <= ri){ seg[node].lazy += add; seg[node].val += add; return;}pushdown(node);int mid = be+((en-be)>>1);update_interval(node*2, be, mid, le, ri, add);update_interval(node*2+1, mid+1, en, le, ri, add);seg[node].val = min(seg[node*2].val, seg[node*2+1].val);}int main(){freopen("segtree.in", "r", stdin);freopen("segtree.out","w",stdout); int n;scanf("%d", &n);for(int i = 1; i <= n; i++) scanf("%d", &a[i]);built(1, 1, n);int p, q, ans = 0;scanf("%d", &p);for(int i = 1; i <= p; i++){scanf("%d", &q);int x, y, z;if(!q){scanf("%d%d", &x, &y);ans = query(1, 1, n, x, y);printf("%d\n", ans);}else if(q == 1){//point update scanf("%d%d", &x, &y); update_point(1, 1, n, x, y);}else if(q == 2){//interval updatescanf("%d%d%d", &x, &y, &z);update_interval(1, 1, n, x, y, z);}}return 0;}
1 0
- 线段树复习
- 复习线段树
- 复习线段树
- 线段树模板复习
- 【线段树】线段树及其相关 复习
- POJ 3468 【线段树复习】
- 【NOIp复习】数据结构之线段树
- [复习]线段树 系列操作I
- 线段树复习--[kuangbin带你飞] 线段树
- 数据结构与算法复习(3)—— 线段树
- hihocoder算法复习之 线段树单点更新
- HDU1166 敌兵布阵 线段树||树状数组 入门题复习
- HDU1754 I Hate It 线段树入门题复习
- HDU1698 Just a Hook 线段树入门题复习
- HDOJ 1156 - Color the ball 水题复习线段树..线段树与树状数组的对比..
- 上半学期数据结构(线段树,树状数组,二叉搜索树,大(小)堆根堆,树堆)复习
- poj3468 A Simple Problem with Integers 线段树入门题复习
- 写一个线段树的复习吧,撑撑门面感觉blog里东西好水,,,过几天写几道省选-的题。。
- Android 解决因未捕获异常而崩溃的问题
- 最小距离分类法
- UIFragment的简单使用
- 【jzoj3870】【单词检索】【后缀数组】
- JavaScript中常用的20种正则校验(值得收藏)
- 复习线段树
- 如何做到 jQuery-free?
- 记一次 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock’(2) 排错流程
- iOS 之单例 代理 通知
- Android 5.0、6.0的那(xin)些(kong)事(jian)
- openwrt单独编译package包
- APT Hash sum mismatch错误的常见解决方法总结
- redis消息模式
- Android ListView性能提升小技巧