*模板--数据结构

非递归线段树(未测试)

 1 const int maxn=1e5+10;
 2 int a[maxn],n;  //原数组,从1开始
 3 struct SegTree{
 4     int N;
 5     int sum[maxn<<2],add[maxn<<2];
 6
 7     //建树
 8     void build(){
 9         N=1;while(N<n+2) N<<=1;
10         for(int i=1;i<=n;i++) sum[i+N]=a[i]; //原数组下标+N=存储下标
11         for(int i=N-1;i>0;i--){
12             sum[i]=sum[i<<1]+sum[i<<1|1];
13             add[i]=0;
14         }
15     }
16
17     //点修改,A[p]+=x
18     void update(int p,int x){
19         for(int s=N+p;s;s>>=1){
20             sum[s]+=x;
21         }
22     }
23
24      //点修改下的区间查询,求A[L..R]的和(不考虑懒惰标记add)
25     int query(int L,int R){
26         int ans=0;
27         for(int s=N+L-1,t=N+R+1;s^t^1;s>>=1,t>>=1){
28             if(~s&1) ans+=sum[s^1];
29             if( t&1) ans+=sum[t^1];
30         }
31         return ans;
32     }
33
34     //区间修改,A[L..R]+=c
35     void update(int L,int R,int c){
36         int s,t,Ln=0,Rn=0,x=1;
37         for(s=N+L-1,t=N+R+1;s^t^1;s>>=1,t>>=1,x<<=1){
38             sum[s]+=c*Ln;
39             sum[t]+=c*Rn;
40             if(~s&1) add[s^1]+=c,sum[s^1]+=c*x,Ln+=x;
41             if( t&1) add[t61]+=c,sum[t^1]+=c*x,Rn+=x;
42         }
43         for(;s;s>>=1,t>>=1){
44             sum[s]+=c*Ln;
45             sum[t]+=c*Rn;
46         }
47     }
48
49     //区间修改下的区间查询,求A[L..R]的和
50     int query(int L,int R){
51         int s,t,Ln=1,Rn=0,x=1;
52         int ans=0;
53         for(s=N+L-1,t=N+R+1;s^t^1;s>>=1,t>>=1,x<<=1){
54             if(add[s]) ans+=Ln*add[s];
55             if(add[t]) ans+=Rn*add[t];
56             if(~s&1) ans+=sum[s^1],Ln+=x;
57             if( t&1) ans+=sum[t^1],Rn+=x;
58         }
59         //处理上层标记
60         for(;s;s>>=1;t>>=1){
61             ans+=add[s]*Ln;
62             ans+=add[t]*Rn;
63         }
64         return ans;
65     }
66 };

时间: 2024-08-06 16:04:57

*模板--数据结构的相关文章

模板 - 数据结构 - 线段树(单点修改)

这里是以区间最大值为例,要修改成其他的运算,注意修改每个函数的运算以及query中返回的无关值. 这里的区间最大值设置的最小元素为-1(在query中表示与当前区间不相交的区间的结果). 注意因为调用的方式传入l与r是(1,n),所以这个线段树(包括a)其实是从1开始计数的. 最后,小心爆MAXM. const int MAXM=200000; int a[MAXM+5],st[(MAXM<<2)+5]; void build(int o,int l,int r){ if(l==r) st[o

模板 - 数据结构 - ST表

区间最大值,nlogn预处理,1查询,不能动态修改. 令 $f[i][j]$ 表示 $[i,i+2^j-1]$ 的最大值. 显然, $f[i][0]=a[i]$ . 根据定义式,写出状态转移方程: $f[i][j]=max(f[i][j-1],f[i+2^{j-1}][j-1])$ . 我们可以这么理解:将区间 $[i,i+2^j-1]$ 分成相同的两部分 中点即为 $(i+(i+2^j-1))/2=i+2^{j-1}-1/2$ 所以 $[i,i+2^j-1]$ 可以分成 $[i,i+2^{j-

模板 - 数据结构 - 单调队列/单调栈

一道例题,给定一串数字,求每连续k个数字的最大.最小值. 思路:初始化一个初始长度为k的单调队列,按从左到右加入元素,同时满足这个队列中的元素是递减的(也就是假如某个数被两个距离不超过k的大于他的数夹着,他会被从队尾调出队列).得到最大值. 向右移动一格,假如队首离开范围,出队.往队尾加入元素前,把队尾的所有比它小的元素全部出队. 得到新的最大值. #include<bits/stdc++.h> using namespace std; struct Monotone_Queue{ deque

模板 - 数据结构 - 线段树/SegmentTree

struct SegmentTree { #define ls (o<<1) #define rs (o<<1|1) static const int MAXN = 100000; ll a[MAXN + 5]; ll st[(MAXN << 2) + 5]; void PushUp(int o) { st[o] = st[ls] + st[rs]; } void Build(int o, int l, int r) { if(l == r) st[o] = a[l];

模板 - 数据结构 - Treap

还有人把Treap叫做树堆的,但是常用名还是叫做Treap的比较多. 不进行任何封装的,带求和操作的,一个节点存放多个元素的最普通的Treap. #include<bits/stdc++.h> using namespace std; typedef long long ll; #define ls ch[id][0] #define rs ch[id][1] const int INF = 1e9; const int MAXN = 1000000 + 5; int ch[MAXN][2],

模板 - 数据结构 - 重链剖分

一般都是重链剖分的多,重链剖分在维护路径信息时比较优秀. 也可以使用长链剖分,使用深度最大的儿子作为"重儿子"即可,看了一下用于某种与深度有关的启发式合并比重链剖分好,等以后再研究吧. #include<bits/stdc++.h> #define lc (o<<1) #define rc (o<<1|1) typedef long long ll; using namespace std; const int MAXN = 100000 + 5;

模板 - 数据结构 - 无旋Treap / FHQ Treap

普通平衡树: #include<bits/stdc++.h> using namespace std; typedef long long ll; #define ls(p) ch[p][0] #define rs(p) ch[p][1] const int MAXN = 100000 + 5; int val[MAXN], ch[MAXN][2], rnd[MAXN], siz[MAXN], tot, root; void Init() { tot = root = 0; } void Pu

C/C++编程语言学习资料尽收眼底 电子书+视频教程

Visual C++(VC/MFC)学习电子书及开发工具下载请看这里 史无前例的网络最全最强C/C++资料索引: C/C++编程语言学习资料尽收眼底 电子书+视频教程 VC++/MFC(VC6)开发技术精品学习资料下载汇总 Visual C++/MFC数字图像处理学习参考资料下载大全 C++ Builder开发技术相关精品资料下载汇总 C/C++开发工具/集成开发环境 下载汇总 VC/MFC开发必备Visual C++.Visual Studio.MSDN等下载汇总 注意:本帖包含C++和C语言

opencv 高斯模糊

高斯模糊是一种图像模糊滤波器,它用正态分布计算图像中每个像素的变换.N 维空间正态分布方程为 在二维空间定义为 其中 r 是模糊半径 (r2 = u2 + v2),σ 是正态分布的标准偏差.在二维空间中,这个公式生成的曲面的等高线是从中心开始呈正态分布的同心圆.分布不为零的像素组成的卷积矩阵与原始图像做变换.每个像素的值都是周围相邻像素值的加权平均.原始像素的值有最大的高斯分布值,所以有最大的权重,相邻像素随着距离原始像素越来越远,其权重也越来越小.这样进行模糊处理比其它的均衡模糊滤波器更高地保