![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
浇糖玛奇朵
会了,但完全没有会
展开
-
洛谷P3373线段树
这题挺难受的,又加又乘还得取模主要是维护懒标记的时候先乘后加细节过两天再补#include <bits/stdc++.h>using namespace std;typedef long long ll;#define putln putchar('\n')#define rep(i,a,b) for(int i=a;i<=b;++i)#define per(i,a,b) for(int i=a;i>=b;--i)const int MXN=1e5+5;int原创 2021-10-06 19:09:35 · 78 阅读 · 0 评论 -
线段树模板+一些自己的理解
#include <bits/stdc++.h>using namespace std;#define rg register#define putln putchar('\n')#define debug(x) cout<<"@ "<<(x)<<endl#define rep(i,a,b) for(rg int i=a;i<=b;++i)#define per(i,a,b) for(rg int i=a;i>=b;--i)typ原创 2021-09-24 20:00:15 · 68 阅读 · 0 评论 -
线段树单点修改,维护区间最大值
以hdoj1754为例:#include <bits/stdc++.h>using namespace std;#define rg register#define putln putchar('\n')#define debug(x) cout<<"@ "<<(x)<<endl#define rep(i,a,b) for(rg int i=a;i<=b;++i)#define per(i,a,b) for(rg int i=a;i>原创 2021-09-23 20:28:23 · 212 阅读 · 0 评论 -
线段树模板
区间修改,区间查询#include <bits/stdc++.h>using namespace std;inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();原创 2021-08-12 20:07:02 · 86 阅读 · 0 评论 -
利用树状数组求逆序对
逆序对:ai>aj 且 i<j 。说白了就是一个序列中前面比后面大的对,举个例子:序列2 1 4 3 2 , (2 1)就是一个逆序对,(4 3)、(4 2)也是。暴力做法:遍历这个序列,数一下每个元素前面比他大的元素的个数,累加就是最后的结果,举个例子:序列2 1 4 3 2第一个元素 2,前面没有元素,结果 = 0第二个元素 1,前面比他大的是 2,结果 = 1第三个元素 4,前面没有比他大的,结果 = 0第四个元素 3,前面比他大的是 4,结果 = 1第五个元素 2原创 2021-08-01 16:10:53 · 229 阅读 · 0 评论 -
树状数组(三)【区间修改,区间查询】
【区间修改,区间查询】同样利用到了差分数组。求区间和可以是求两个前缀和再相减,比如求l~r的和,可以是s( r)-s(l-1),所以问题就是求前缀和。原数组为a,他的差分数组为x,(a1=x1=0)则a1=x1,a2=x1+x2,… ,an=x1+x2+…+xn那么前缀和s(n)=a1+a2+…+an=(x1)+(x1+x2)+…+(x1+x2+…+xn)=n(x1+x2+…+xn)-(0* x1+1* x2+…+(n-1)* xn)所以维护x1, x2, … ,xn和 (0)*x1, (原创 2021-07-28 09:52:32 · 468 阅读 · 0 评论 -
树状数组(二)【区间修改,单点查询】
【区间修改,单点查询】区间修改考虑一个数组,频繁的进行区间(l~r)修改,这时候我们会利用差分数组,关于差分数组 因为只需要修改 l 和r+1就可以,复杂度O(1),最后求个前缀和即可。树状数组进行区间修改也一样可以用差分数组来实现。我们维护一个差分数组,这个差分数组不需要是原数组的差分数组,可以当做是当前变化量的差分数组。显然在初始阶段,没有对任何区间做任何操作,所以这个差分数组全部是0。这样也是方便单点查询,因为这个差分数组的前缀和就是当前值的变化量。举个例子: 原数组a: 4原创 2021-07-27 14:29:48 · 573 阅读 · 0 评论 -
树状数组(一) 【单点修改,区间查询】
【单点修改,区间查询】这是树状数组的基本用法,修改和查询的复杂度都是O(logn)。个人认为树状数组是巧妙的利用二进制实现了二分,所以他查询的时候很快。单点修改是要把与这个点所有有关的点都进行修改,是一个从下往上的过程,通过一个点+lowbit(这个点)来更新所有管辖这个点的点,直到最上面区间查询时就是求两个前缀和,一相减就是区间和。求前缀和的过程与单点修改的操作相反,是不断通过一个点 - lowbit(这个点) 来覆盖所有小的区间以上是个人理解。树状数组就不放图了,关于lowbit的内容可以看一原创 2021-07-27 14:10:46 · 406 阅读 · 0 评论 -
静态RMQ问题:ST表
ST表,用于解决静态区间最值查询问题,预处理O(nlogn),查询O(1)!详解推荐视频:树状数组与ST表用到三个数组a[ ] , lg[ ] , st[ ][ ]数组a[ ],原数组数组lg[ ],lg[i]表示log(i)数组st[ ][ ],st[i][j]表示左端点为i,长度为2^j的一段区间的最值,也就是(i…i+2^j-1)这段区间初始化过程用了dp思想,二重循环,第一层枚举区间长度,第二层枚举左端点。洛谷模板题:ST表代码:#include <bits/stdc++.h原创 2021-08-08 22:01:00 · 93 阅读 · 0 评论