随笔分类 - 数据结构
摘要:二分中位数 在一个序列中,小于等于 \(x\) 的元素个数如果大于等于 \(\frac{n+1}{2}\),那么中位数一定小于等于 \(x\)。 Check 的判出条件为小于等于 \(x\) 的元素个数。 const int N = 1e5 + 32; ll n; ll a[N]; bool Che
阅读全文
摘要:对顶堆 用于维护中位数。 维护两个 multiset,分别为 \(s1\) 与 \(s2\)。 \(s1\) 中存小于等于中位数的权值,\(s2\) 中存大于等于中位数的权值,且钦定 \(\text{size}(s1)≥\text{size}(s2),|\text{size}(s1)−\text{s
阅读全文
摘要:不断插入元素,询问某元素出现次数。 struct node{ int nxt, key, cnt; } t[N]; ll head[mod + 20], tot; void add(ll x) { for(int i = head[x % mod]; i; i = t[i].nxt) // Alre
阅读全文
摘要:线段树 P3373 【模板】线段树 2 注:本线段树使用链表形式(指针),每个结点都是左闭右闭区间。 操作为加或乘,最后答案模 \(mod\)。 打两个标记,分别为 add 和 mul 。 ll n, m, mod; struct node{ ll L, R, add, mul, sum; node
阅读全文
摘要:\(n\) 个点, \(m\) 个操作数, 根结点为 \(R\), 取模数为 \(mod\)。 输入一颗树。 支持的操作: 把 \(x\) 点的点权增加(或修改)\(y\)。 将树从 \(x\) 到 \(y\) 结点最短路径上所有节点的值都加上 \(z\)。 询问某个节点 \(x\) 到 \(y\)
阅读全文
摘要:P3834 【模板】可持久化线段树 2(主席树) 这是个非常经典的主席树入门题——静态区间第 \(k\) 小。 对于指定的闭区间 \([l, r]\) 查询其区间内的第 \(k\) 小值. 代码采用指针形式,区间为左闭右闭。 const ll M = 2e5 + 3; int n, N, m, to
阅读全文
摘要:学会动态开点很重要。 本代码采用指针形式,点区间为左闭右开。 #include <iostream> #include <cstdio> #include <algorithm> #define ll long long using namespace std; inline ll read() {
阅读全文
摘要:前言 这篇博客我自认为写的非常清楚,不需要任何基础,只要会 \(\text{C++}\) 语言基础即可学懂。 任何一个地方我都没有默认已经学过了,完全从 \(0\) 开始的 \(\text{FHQ−Treap}\) 教学! 好耶!我们开始吧!ヽ(✿゚▽゚)ノ 哒哒哒哒哒! FHQ-Treap \(\
阅读全文
摘要:介绍 我们遇到一些有 \(n\) 个元素的集合应用问题中,当给出两个元素的一个无序对 \((a,b)\) 时,需要快速合并 \(a\) 和 \(b\) 分别所在的集合,并查集就是这样的用于处理分离集合的抽象数据类型。它的作用就是动态地维护和处理集合元素之间的复杂关系。 ### 操作 使用并查集应首先
阅读全文
摘要:珂朵莉树 神奇的暴力数据结构 例题 \(n\) 个数,\(m\) 次操作 \((n,m≤105)\) 操作: 区间加 区间赋值 区间第k小 求区间幂次和 数据随机,时限 \(2s\)。 关键操作:推平一段区间,使一整段区间内的东西变得一样。保证数据随机 #include <set> #include
阅读全文
摘要:Treap 您需要写一种数据结构,来维护一些数,其中需要提供以下操作: 插入 \(x\) 数 删除 \(x\) 数(若有多个相同的数,因只删除一个) 查询 \(x\) 数的排名(排名定义为比当前数小的数的个数 \(+1\) ) 查询排名为 \(x\) 的数 求 \(x\) 的前驱(前驱定义为小于 \
阅读全文
摘要:左偏树 一开始有 \(n\) 个小根堆,每个堆包含且仅包含一个数。接下来需要支持两种操作: 1 x y:将第 \(x\) 个数和第 \(y\) 个数所在的小根堆合并(若第 \(x\) 或第 \(y\) 个数已经被删除或第 \(x\) 和第 \(y\) 个数在用一个堆内,则无视此操作)。 2 x:输出
阅读全文
摘要:树状数组 支持单点修改,区间查询。 ll lowbit(ll x) { return x & (-x); } ll c[500002], n, m; void add(ll x, ll y) //单点修改 { for (; x <= n; x += lowbit(x)) c[x] += y; } l
阅读全文
摘要:单调队列 例题1 有一个长为 \(n\) 的序列 \(a\),以及一个大小为 \(k\) 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。 ll n, k, cnt = 0; ll ans[2][1000005]; struct node { ll sum
阅读全文
摘要:ST表 静态查询区间最值。 P3865 【模板】ST 表 ll f[100001][20]; ll n, m, a[100001]; void ST_make() { for (int i = 1; i <= n; ++i) f[i][0] = a[i]; ll t = log(n) / log(2
阅读全文

浙公网安备 33010602011771号