线段树
来源:互联网 发布:淘宝童装平铺拍照技巧 编辑:程序博客网 时间:2024/06/06 15:39
线段树是很强大的数据结构,但本人感觉线段树不如树状数组好用。
线段树的基本用途:求和,max,min等,关键是搞清楚要维护的是什么。
下面是一段代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define N 50005using namespace std;int tree[4*N];int n;void add(int l,int r,int pos,int p,int v){ tree[pos]+=v; if(l==r)return; int mid=(l+r)>>1; if(p<=mid) add(l,mid,pos<<1,p,v); else add(mid+1,r,(pos<<1)+1,p,v);}int query(int l,int r,int pos,int L,int R){ if(L==l&&r==R) return tree[pos]; int mid=(l+r)>>1; if(R<=mid) return query(l,mid,pos<<1,L,R); else if(L>mid) return query(mid+1,r,(pos<<1)+1,L,R); else if(R>mid) return query(l,mid,pos<<1,L,mid)+query(mid+1,r,(pos<<1)+1,mid+1,R);}int main(){ // freopen("in.txt","r",stdin); int T,test=1; int a,b; char s[10]; scanf("%d",&T); while(T--) { memset(tree,0,sizeof(tree)); scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&a); add(1,n,1,i,a); } printf("Case %d:\n",test++); scanf("%s",s); while(s[0]!='E') { scanf("%d %d",&a,&b); getchar(); if(s[0]=='Q') printf("%d\n",query(1,n,1,a,b)); else if(s[0]=='S') add(1,n,1,a,-b); else if(s[0]=='A') add(1,n,1,a,b); scanf("%s",s); } } return 0;} Download as text
- 线段树?线段树!
- 线段树?线段树!
- 线段_线段树
- 线段_线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- linux 内存释放调试经验积累
- MFC自定义消息
- Android编程实现文本文件下载
- 【Unity开发】Unity3d学习笔记记录
- dfs.balance.bandwidthPerSec 参数
- 线段树
- java设计模式———适配器模式
- list
- 2013.08.09(2)
- 一种极快速去模糊效应图像细节增强及其应用
- build.prop参数详解和部分修改
- oracle 多行信息转成一行显示
- POI3.8和jxl读取Excel例子
- java设计模式