
数据结构
卡常带师
这个作者很懒,什么都没留下…
展开
-
复习计划——主席树
主席树三类经典应用:区间Mex区间种类数区间第K大一.区间Mex题目链接: https://www.luogu.com.cn/problem/P4137解题思路: 对于主席树,我们维护一颗权值线段树,并且用来记录每一个数最后出现的位置。为什么这样做呢?例如现在有序列[3,1,0,2,?,?][3,1,0,2,?,?][3,1,0,2,?,?],那么对于主席数来说我们维护[1,4][1,4][1,4]的序列,主席树内容为[3,2,4,1,0,0][3,2,4,1,0,0][3,2,4,1原创 2020-12-29 23:12:00 · 264 阅读 · 0 评论 -
学习计划——整体二分
整体二分一般适用与可离线询问的问题,属于离线算法可以使用整体二分解决的题目需要满足以下性质:询问的答案具有可二分性修改对判定答案的贡献互相独立 ,修改之间互不影响效果修改如果对判定答案有贡献,则贡献为一确定的与判定标准无关的值贡献满足交换律,结合律,具有可加性题目允许使用离线算法经典问题:P3834,区间第k大//#define LOCAL#include <bits/stdc++.h>using namespace std;#de.原创 2020-10-09 13:24:33 · 451 阅读 · 0 评论 -
学习计划——根号分治
根号分治根号分治是一种思想,一般根据一个数(可以是数组的数,也可以是答案的数)分类,分为大于sqrt(n)sqrt(n)sqrt(n)的部分和小于等于sqrt(n)sqrt(n)sqrt(n)的部分题目链接: luogu.com.cn/problem/P3396解题思路: 根号分治的经典题目。我们根据模数分类,模数大于等于sqrt(n)sqrt(n)sqrt(n)的部分我们暴力求解,小于等于的部分我们提前预处理出来就好了const int N = 2e5 + 5;int n , m原创 2020-12-14 14:22:29 · 822 阅读 · 0 评论 -
树链剖分——复习计划
树链剖分应用一.题目链接: https://codeforces.com/problemset/problem/1403/B解题思路: 该题需要考虑每条边给答案带来的贡献,通过简单的画图和思考我们可以发现,当一个节点下有偶数个叶子节点时,该节点到父亲节点的边的贡献为2,若为奇数则为1,那么最后的答案为N−2+sigma(du[i]mod2==0)N-2+sigma(du[i]mod 2==0)N−2+sigma(du[i]mod2==0),利用树链剖分维护即可int n, q, rt, sum原创 2020-11-30 11:16:59 · 155 阅读 · 0 评论 -
CDQ分治——学习笔记
CDQ分治cdq分治的原理基于以下事实:对于每个“查询”操作,其结果ans[i]=[1,i−1]ans[i] = [1,i-1]ans[i]=[1,i−1]中所有修改对其造成影响的叠加(这里的“叠加”需要能够比较方便的维护,例如sum/min/maxsum/min/maxsum/min/max等)定义solve(l,r)solve(l,r)solve(l,r)为:对于第kkk个操作,k∈[l,r]k∈[l,r]k∈[l,r],若其为查询操作,则计算[l,k−1][l,k-1][l,k−1]中的修改原创 2020-11-24 16:04:16 · 197 阅读 · 0 评论 -
二维偏序/数点——学习笔记
二维偏序/数点对于可离线的二维偏序问题一般都是先定一维的顺序,然后利用树状数组维护求解应用一.题目链接:https://www.luogu.com.cn/problem/P2163解题思路:二维数点的经典模板题,离线询问之后利用二维前缀和方法用树状数组维护即可//#define LOCAL#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(原创 2020-11-23 19:36:51 · 1359 阅读 · 0 评论 -
01Trie——学习笔记
01Trie01Trie01Trie01Trie与字典树几乎一样,只不过边的权值只有0或101Trie常用来解决异或问题例题:一.题目链接:https://www.luogu.com.cn/problem/P4551解题思路:首先意识到异或的前缀性质假设:S3=A1xorA2xorA3S3 = A1xorA2xorA3S3=A1xorA2xorA3,S1=A1S1 = A1S1=A1, 那么 S2=S3xorS1S2 = S3xorS1S2=S3xorS1那么我们将这条性质用在树上,我原创 2020-11-16 16:09:48 · 301 阅读 · 0 评论 -
启发式树上主席树合并、克鲁斯卡尔重构树 学习笔记
题目链接:https://www.luogu.com.cn/problem/P3302启发式主席树合并基础题目,和启发式并查集方法保持一致,按秩合并即可,该主席树维护的是根节点到树上任意节点的内容,和 count on tree这个题目维护的内容一样,只是在这个题目的基础上加上了启发式合并//#define LOCAL#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b).原创 2020-11-12 15:19:32 · 277 阅读 · 0 评论 -
CF1444C Team-Building 可撤销种类并查集
思路:该题很容易想到,暴力枚举子图,然后二分图判定,统计答案即可,但是复杂度太高。正难则反,我们考虑用所有方案减去不合法方案。不和法方案分为两种:- 如果一个环为奇环,并且只有一种颜色,那么所有和他构成的偏序集都是不合法的- 如果一个环奇幻,并且环内由两种颜色构成,那么由这两种颜色构成的偏序集是不合法的对于第一种情况,利用并查集可以很快的判断出来。第二种情况只需要先将图进行一些处理,先将所有相同颜色的边利用并查集构成连通块,这个时候利用的是连接相同颜色的边。然后再将连接不同颜色的边分组。.原创 2020-11-02 16:41:27 · 672 阅读 · 0 评论 -
P5787 线段树分治+可撤销并查集
题目链接:https://www.luogu.com.cn/problem/P5787解题技巧:1.对于此类在某一段时间**[L,R]**内产生贡献的非强制在线问题,我们都可以试着采用线段树分治解决//#define LOCAL#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define sz(a) (int)a.s.原创 2020-10-23 21:05:48 · 230 阅读 · 0 评论 -
复习计划-线段树
线段树原创 2020-09-11 10:42:05 · 181 阅读 · 0 评论 -
复习计划-单调栈
性质1针对每个数,寻找它和它左 / 右边第一个比它大 / 小的数的值,以及相距多少个数代表题:LuoGuP2866//#define LOCAL#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define sz(a) (int)a.size()#define INF 0x3f3f3f3f#define DNF 0x原创 2020-09-09 13:16:35 · 130 阅读 · 0 评论 -
树上启发式合并CF600E
#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define DBG printf("this is a input\n")#define fi first#defi...原创 2020-04-19 13:03:42 · 244 阅读 · 0 评论 -
牛客多校第七场 A National Pandemic
算是一个小技巧吧,所有题目在给定或者求出计算公式之后,都可以去朝着把恒定的值或者成对出现的值单独拿出来维护比如这个题 w - dis(x,y) = w - dep[x] - dep[y] + w * dep[LCA(x, y)] ,我们就会发现 w - dep[x] 为定值 , dep[y]可以通过维护次数那么重点在于dep[LCA(x,y)],这个地方是一个小技巧,我们可以通过修改根到x的路径上的每一条边,使得每条边权值+1,然后在维护答案的时候,query一下根到x的路径上的和就好了。具体.原创 2020-09-03 22:00:35 · 200 阅读 · 0 评论 -
牛客多校第四场 Ancient Distance
//#define LOCAL#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define sz(a) (int)a.size()#define INF 0x3f3f3f3f#define DNF 0x7f#define DBG printf("this is a input\n")#define fi first#.原创 2020-09-02 12:05:52 · 163 阅读 · 0 评论 -
牛客暑期多校训练营第一场 Infinite Tree
//#define LOCAL#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define sz(a) (int)a.size()#define INF 0x3f3f3f3f#define DNF 0x7f#define DBG printf("this is a input\n")#define fi first#.原创 2020-08-31 22:40:10 · 166 阅读 · 0 评论 -
CF1009 长链剖分优化树形DP或线段树合并
//#define LOCAL#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define sz(a) (int)a.size()#define INF 0x3f3f3f3f#define DNF 0x7f7f7f7f#define DBG printf("this is a input\n")#define fi f.原创 2020-08-30 09:54:48 · 241 阅读 · 0 评论 -
动态开点权值线段树
动态开点权值线段树其实不用离散化,也不用关注负数,因为和负数没关系了//#define LOCAL#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define sz(a) (int)a.size()#define INF 0x3f3f3f3f#define DNF 0x7f7f7f7f#define DBG prin原创 2020-08-24 13:09:58 · 387 阅读 · 0 评论 -
Splay普通平衡树模板
//#define LOCAL#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define sz(a) (int)a.size()#define INF 0x3f3f3f3f#define DNF 0x7f7f7f7f#define DBG printf("this is a input\n")#define fi ..原创 2020-08-22 22:14:05 · 204 阅读 · 0 评论 -
LCT标准模板---P3690
//#define LOCAL#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define sz(a) (int)a.size()#define INF 0x3f3f3f3f#define DNF 0x7f7f7f7f#define DBG printf("this is a input\n")#define fi f.原创 2020-08-17 20:57:25 · 189 阅读 · 0 评论 -
P3391 文艺平衡树Splay区间翻转模板
//#define LOCAL#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define sz(a) (int)a.size()#define INF 0x3f3f3f3f#define DNF 0x7f7f7f7f#define DBG printf("this is a input\n")#define fi f.原创 2020-08-17 17:24:59 · 129 阅读 · 0 评论 -
FHQ-Treap 模板 P3369
//#define LOCAL#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define sz(a) (int)a.size()#define INF 0x3f3f3f3f#define DNF 0x7f7f7f7f#define DBG printf("this is a input\n")#define fi f.原创 2020-08-16 20:02:23 · 152 阅读 · 0 评论 -
牛客练习赛67 牛妹的苹果树
题意:输出给定的点序号区间中两点间距离的最大值思路:考虑倍增思想,st[u][i] 代表从u号节点开始往后2^i个连续数中的直径的两个端点。st[u][i] 一定是由 st[u][i-1] 和 st[u + 2^(i-1)][i-1]转移过来的思考怎么转移,显然对应6种情况1.若两个块中的直径的端点俩俩之间不存在LCA,那么显然直径存在与两个块中的其中一个(2种)2.若两个块中的直径的端点俩俩之间存在LCA,那么显然对应四种情况,只需要选出其中最大的点对即可//#define原创 2020-08-15 18:00:56 · 186 阅读 · 0 评论 -
01Trie基础模板 P4551
//#define LOCAL#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define DNF 0x7f#define DBG printf("this is a input\n")#define fi first#define se second#define mk(.原创 2020-07-26 15:31:01 · 115 阅读 · 0 评论 -
可持久化数据结构(2) P4735 可持久化01Trie 解决与val的最大XOR问题
//#define LOCAL#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define DNF 0x7f#define DBG printf("this is a input\n")#define fi first#define se second#define mk(.原创 2020-07-24 21:21:02 · 122 阅读 · 0 评论 -
P2663 (标准LCA模板)树上可持久化权值线段树问题
//#define LOCAL#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define DNF 0x7f#define DBG printf("this is a input\n")#define fi first#define se second#define mk(.原创 2020-07-24 16:30:18 · 140 阅读 · 0 评论 -
可持久化数据结构(1) 可持久化线段树模板
//#define LOCAL#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define DNF 0x7f#define DBG printf("this is a input\n")#define fi first#define se second#define mk(.原创 2020-07-24 12:35:29 · 128 阅读 · 0 评论 -
P3038 区间修改,单调查询 , 边塞点-重链剖分
//#define LOCAL#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define DNF 0x7f#define DBG printf("this is a input\n")#define fi first#define se second#define mk(.原创 2020-07-22 14:50:08 · 184 阅读 · 0 评论 -
HDU 6756 暴力开点BIT+二分+启发式
此部分为转载:每次更新一个点x,其周围点y。每次只把更新x造成的影响,在deg[y]>deg[x]的点y中更新。而每次查询一个点x时,其周围点y。对于deg[y]<deg[x]的点y更新对x造成的影响已经被更新过了。所以只需要考虑所有deg[y]>=deg[x]的点y的更新对x造成的影响即可。这样每次更新与查询都是根号n。证明如下:然后对于维护mex,我们用BIT来处理:对每个点x,开一个大小为deg[x]的树状数组。BIT中C数组维护点x周围是否含有i的值。那原创 2020-07-21 23:00:48 · 357 阅读 · 0 评论 -
BIT+二分 求整体区间第k大 CF1354D
#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define p_queue priority_queue#define DBG printf("this is a input\n")#define fi first#define se second#define mk(a.原创 2020-05-30 21:33:44 · 263 阅读 · 0 评论 -
存一下单调队列模版
#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define DBG printf("this is a input\n")#define fi first#define se second#define mk(a, b) make_pair(a,b)#define p_queue priority_queue#de.原创 2020-05-15 16:35:46 · 147 阅读 · 0 评论 -
Hash模版
ull base = 127;ull pw[maxn];ull a[maxn];void hash_pre(){ a[0] = 0; pw[0] = 1; for(int i = 1 ; i <= n ; i ++) { a[i] = a[i - 1] * base + (s[i] - 'a'); pw[i] = pw...原创 2020-04-14 15:39:03 · 122 阅读 · 0 评论 -
单调队列数组模拟
#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define DBG printf("this is a input\n")#define fi first#def...原创 2020-04-12 21:24:46 · 175 阅读 · 0 评论 -
P3834 可持久化线段树(主席树)入门
#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define DBG printf("this is a input\n")#define fi first#defi...原创 2020-03-13 14:02:10 · 229 阅读 · 0 评论 -
权值线段树完整模版 P3369
#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define DBG printf("this is a input\n")#define fi first#defi...原创 2020-03-13 09:40:00 · 187 阅读 · 0 评论 -
P1908 权值线段树求逆序对
#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define DBG printf("this is a input\n")#define fi first#defi...原创 2020-03-11 20:23:14 · 213 阅读 · 0 评论 -
线段树区间合并P2894
#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define DBG printf("this is a input\n")#define fi first#defi...原创 2020-03-02 15:24:10 · 164 阅读 · 0 评论 -
RMQ求LCA
#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define DBG printf("this is a input\n")#define fi first#defi...原创 2020-02-29 17:36:18 · 201 阅读 · 0 评论 -
区间染色 ZOJ1610
#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define DBG printf("this is a input\n")#define fi first#defi...原创 2020-02-27 14:11:01 · 185 阅读 · 0 评论 -
线段树 (lazy完全版)
#include <bits/stdc++.h>using namespace std;#define ll long long#define mem(a, b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define DBG printf("this is a input\n")#define fi first#defi...原创 2020-02-22 15:49:36 · 274 阅读 · 0 评论