线段树整理
来源:互联网 发布:淘宝女装banner 编辑:程序博客网 时间:2024/06/03 18:39
主要是记录一下线段树的写法,包括建树、区间查询、单点更新
以后就统一用这个写法了,很清楚
HDU1754(线段树单点查询+单点更新)
#include <iostream>#include <cstring>#include <string>#include <algorithm>#include <cstdio>#include <cmath>#include <map>#include <set>#include <queue>#include <vector>#define mod 1000000007#define INF 0x3f3f3f3f#define fuck() (cout << "----------------------------------------" << endl)using namespace std;const int maxn = 2000000 + 5;int a[maxn];int sum[maxn * 4];void bulid(int o, int l, int r){ if(l == r) { sum[o] = a[l]; return; } int m = (l + r) / 2; bulid(o*2, l, m); bulid(o*2+1, m+1, r); sum[o] = max(sum[o*2], sum[o*2+1]);}int query(int o, int l, int r, int ql, int qr){ if(ql <= l && qr >= r) return sum[o]; int m = (l + r) / 2; int ans1 = 0, ans2 = 0; if(ql <= m) ans1 = query(o*2,l,m,ql,qr); if(qr > m) ans2 = query(o*2+1,m+1,r,ql,qr); return max(ans1, ans2);}void update(int o, int l, int r, int pos, int val){ if(l == pos && r == pos) { sum[o] = val; return; } int m = (l + r) / 2; if(pos <= m) update(2*o,l,m,pos,val); else update(2*o+1,m+1,r,pos,val); sum[o] = max(sum[o*2],sum[o*2+1]);}int main(){ int n,m; while(scanf("%d%d",&n,&m) == 2) { for(int i=1; i<=n; i++) scanf("%d",&a[i]); bulid(1,1,n); while(m--) { char op; getchar(); scanf("%c",&op); if(op == 'Q') { int l,r; scanf("%d%d",&l,&r); printf("%d\n",query(1,1,n,l,r)); } else { int x,y; scanf("%d%d",&x,&y); update(1,1,n,x,y); } } } return 0;}
hihocoder 1078(线段树区间更新+区间查询)
#include <iostream>#include <algorithm>#include <queue>#include <stack>#include <cstdio>#include <string>#include <cstring>#include <vector>#include <set>#define LL long long#define INF 0x3f3f3f3f#define MOD 1000000007const int maxn = 1e5 + 5;using namespace std;int sum[maxn * 4];int lazy[maxn * 4];int a[maxn];void pushdown(int l, int r, int o){ if(lazy[o]){ int m = (l + r) / 2; sum[o*2] = (m-l+1)*lazy[o]; sum[o*2+1] = (r-m)*lazy[o]; lazy[o*2] = lazy[o]; lazy[o*2+1] = lazy[o]; lazy[o] = 0; } return;}void build(int l, int r, int o){ lazy[o] = 0; if(l == r){ sum[o] = a[l]; return; } int m = (l + r) / 2; build(l,m,o*2); build(m+1,r,o*2+1); sum[o] = sum[o*2] + sum[o*2+1]; return ;}void update(int l, int r, int o, int ql, int qr, int c){ if(ql <= l && qr >= r){ sum[o] = (r - l + 1) * c; lazy[o] = c; return; } int m = (l + r) / 2; pushdown(l, r, o); if(ql <= m) update(l,m,o*2,ql,qr,c); if(qr > m) update(m+1,r,o*2+1,ql,qr,c); sum[o] = sum[o*2] + sum[o*2+1]; return;}int query(int l, int r, int o, int ql, int qr){ if(ql <= l && qr >= r){ return sum[o]; } int m = (l + r) / 2; pushdown(l, r, o); int ans = 0; if(ql <= m) ans += query(l,m,o*2,ql,qr); if(qr > m) ans += query(m+1,r,o*2+1,ql,qr); return ans;}int main(){ int n; scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",&a[i]); build(1,n,1); int q; scanf("%d",&q); while(q--){ int op; scanf("%d",&op); if(op == 1){ int l, r, c; scanf("%d%d%d",&l,&r,&c); update(1,n,1,l,r,c); } else{ int l, r; scanf("%d%d",&l,&r); printf("%d\n",query(1,n,1,l,r)); } }}
阅读全文
0 0
- 线段树整理
- 线段树整理
- 线段树题型整理
- 线段树整理
- 线段树代码整理
- 线段树模板整理
- 线段树整理
- 线段树整理
- 线段树+树状数组整理
- 大牛整理的线段树集锦
- 线段树&树状数组学习整理
- <6.21>数据结构整理(Treap,线段树,主席树)
- hust 5239 Doom(线段树 规律OR数论 待整理 )
- 周中记录--2017.9.7(线段树整理)
- czl的知识点整理4——线段树
- 线段树?线段树!
- 线段树?线段树!
- 线段_线段树
- 单链表的基本操作实现
- 在js里遇到prepend添加变量问题
- hadoop生成序列化文件(SequenceFile)的程序
- java 实现单链表节点的复制
- window属性学习
- 线段树整理
- JSP学习-page指令
- memtest86内存测试工具介绍
- MySQL LIKE 子句整理
- Postman用法简介-Http接口请求模拟工具
- Linux命令 用户
- angularjs依赖注入
- linux命令之文件权限设定
- event对象学习