随笔分类 - 数据结构
数据结构
摘要:[NOIP 2024 模拟12]序列 题意 给出长度为 \(n\) 的序列 \(a\),每次操作给出 \(l,r,k\),把 \([l,r]\) 进行 \(k\) 次循环位移。 每次操作结束后查询整个序列是否存在三元上升子序列,即是否存在 \(i<j<k,a_i<a_j<a_k\)。 思路 区间循环
阅读全文
摘要:Educational Codeforces Round 80 (CF1288) A. Deadline 题意 给出正整数 \(n,d\),求不等式 \(x+\lceil \frac{d}{x+1}\rceil \le n\) 是否有非负整数解。 思路 先不考虑上取整, \[x+ \frac{d}{
阅读全文
摘要:区间推平,区间查询循环节 题意 给定一个字符串 \(s\) , 请你支持两种操作: \(1, l, r, c\):将 \([l,r]\) 之间的字符改为 \(c\)。 \(2, l, r, d\):询问 \([l,r]\) 之间是否有长度为 \(d\) 的循环节,有输出 YES,否则输出 NO。 思
阅读全文
摘要:观景房 题意 给出若干个矩形,所有矩形组合形成的图形包含了若干条水平线。 你可以选出若干条水平线,必须满足高度先上升后下降,求选出的水平线长度和的最大值。 思路 先考虑如何求出所有水平线的高度和长度,观察下面的图片。 每个位置的水平高度就是覆盖这个位置的矩形高度最大值。 我们就需要一个数据结构支持以
阅读全文
摘要:移动 题意 有一个 \(n\times m\) 的网格图,有 \(k\) 个点不能走。 每次移动可以向右或向下走,只能走两次。 求能走到的点的个数。 思路 可以发现只能是从第一排向下走或从第一列向右走。 统计上下走能到的点和左右走能到的点,减去重复的即可。 扫描 \(x\),使用线段树维护 \(y\
阅读全文
摘要:楼房重建 题意 小 A 在平面上 \((0,0)\) 点的位置,第 \(i\) 栋楼房可以用一条连接 \((i,0)\) 和 \((i,H_i)\) 的线段表示,其中 \(H_i\) 为第 \(i\) 栋楼房的高度。如果这栋楼房上任何一个高度大于 \(0\) 的点与 \((0,0)\) 的连线没有与
阅读全文
摘要:[HNOI2009] 梦幻布丁 题意 给出一个序列 \(a\),有 \(q\) 次操作,每次修改把序列中一种数全部改为另一种数。 每次询问,查询序列 \(a\) 的颜色段个数。 思路 颜色段只有同一种颜色才有贡献,我们考虑每种颜色开一棵平衡树维护。 每种颜色维护其在原序列中的下标,下标连续的一段区间
阅读全文
摘要:[2023四校联考3]sakuya 题意 给出一棵 \(n\) 个点的树,有 \(m\) 个特殊点 \(a\),求将 \(a\) 随机打乱后 \[\sum_{i=2}^m d(a_{i-1},a_i) \bmod 998244353 \]的期望。有 \(q\) 次修改,每次将一个点连接的所有边权值增
阅读全文
摘要:[COCI2015-2016#2] VUDU 题意 求一个序列中有多少个子段平均数大于 \(P\)。 思路 区间和相关的问题可以考虑前缀和。 对于原序列前缀和序列 \(a\),询问等价于求数对 \((l,r)(l\le r)\) 的个数,满足: \[\frac{a_r - a_{l-1}}{r-l+
阅读全文
摘要:Atcoder Beginner Contest 372 A - delete . 模拟即可。 #include <bits/stdc++.h> using namespace std; using ll = long long; void solve() { char ch; while (cin
阅读全文
摘要:[NOIP 2024 模拟2]矩阵学说 题意 给出 \(n\) 行 \(m\) 列的矩阵,第 \(i\) 行第 \(j\) 列的元素为 \(a_{i,j}\),找出满足以下条件的三元组 \((i, j, x)\) 的 数量: \(1 ≤ i ≤ n\), \(1 ≤ j \le m\), \(1 ≤
阅读全文
摘要:洛谷 P9912 Zatopljenje 题意 给出长度为 \(n\) 的序列 \(a\),有 \(q\) 次询问。 每次给出 \(l,r,x\),询问区间 \([l,r]\) 中有多少段极长的,\(a\) 都大于 \(x\) 的段。 思路 离线后扫描线。 先把询问和 \(a\) 离散化,然后扫描
阅读全文
摘要:洛谷 P5618 堵塞的交通 题意 有一个 \(2\times C\) 的网格图,需要维护 \(3\) 种操作。 连接相邻的两个格子。 将相邻的两个格子断开连接。 询问两个格子是否联通。 思路1 考虑分块。 连边时块内使用并查集维护,块与块之间用数组标记。 删边块内的边时暴力重构并查集,块之间的边清
阅读全文
摘要:洛谷 P3224 永无乡 题意 给出 \(n\) 个点。有两种操作: 在点 \(x\) 和点 \(y\) 之间连一条边。 询问与 \(x\) 联通的点中点权第 \(k\) 小的点。 思路 使用并查集维护连通性。每个联通块用一棵平衡树维护点权,合并时启发式合并。 时间复杂度:\(O(n \log^2n
阅读全文
摘要:Atcoder Beginner Contest 369 C-Count Arithmetic Subarrays 题意 给出一个长度为 \(n\) 的序列 \(A\),求有多少个 \(A\) 的连续子序列为等差数列。 思路 对于递增的右端点,左端点不减。 使用双指针,枚举右端点,扫描左端点。 时间
阅读全文
摘要:洛谷 P11012 颜料 题意 给出长度为 \(n\) 的序列 \(a\)。定义一段区间 \([l,r]\) 的绚丽程度 \(X_{l,r}\) 为 \(\sum_{i=1}^{W}\sum_{j=i+1}^W\min(c_i,c_j)\),其中 \(W\) 是值域,\(c_i\) 表示 \(a\)
阅读全文
摘要:边权树链剖分 一般的树链剖分都是维护的点权,而如果要维护边权怎么办呢? 思路 我们可以把边权转换为点权。一个点有很多个儿子,但只有一个父亲。如果一个节点的点权记录到其儿子的边权就显然不行了,只能记录这个点到其父亲的边权。 如果要修改查询 $\text{x y}$ 的所有边权,通过维护点权的思路,先修
阅读全文
摘要:树链剖分学习笔记 简介 树链剖分是一种可以把树丢到线段树上维护的一种算法,时间复杂度为 $O(n \log^2 n)$。 思路 一、一些概念 1.重儿子:如果一个点有儿子,那么所有儿子中儿子最多的一个儿子就是这个点的重儿子。有点绕,可以看图理解。图中标红的点就是重儿子。 2.轻儿子:不是重儿子的点就
阅读全文
摘要:[SCOI2014]方伯伯的玉米田 题目描述 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美。这排玉米一共有 $N$ 株,它们的高度参差不齐。方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列。方伯伯可以选择一
阅读全文
摘要:树状数组学习笔记 简介 树状数组是一个可以在 $O(\log n)$ 的时间复杂度内支持单点修改和查询前缀和的操作的数据结构。 原理 观察发现线段树中有很多的冗余的部分。 红色部分为冗余部分。 把冗余部分去掉。 把每个节点编个号。 把每个节点的子节点个数和父结点编号列表出来。 | 1 | 2 | 3
阅读全文