刷题记录
2024.8.13
-
洛谷P2391 白雪皑皑
并查集维护序列连通性的一道好题。
倒序操作,用并查集维护下一个未被染色的位置来染色。 -
洛谷P3295 [SCOI2016] 萌萌哒
并查集维护区间相等的限制
使用类似ST表的结构,同一层内建并查集,把一段区间限制拆成log段限制直接维护
下传时将本节点的左右儿子分别和本层并查集上自己的根节点的左右儿子在下一层的并查集里面直接合并
最后下传至最下面统计答案
2024.8.14
-
洛谷P2221 [HAOI2012] 高速公路
线段树根据询问的式子维护需要的信息 -
洛谷P6619 [省选联考 2020 A/B 卷] 冰火战士
树状数组上二分经典题
维护两个序列A、B,要找一个分界点,满足A的前缀和和B的后缀和的最小值最大
发现把两个序列的前缀和/后缀和画出来,则A的前缀和递增,B的后缀和递减,答案就在交点附近
树状数组维护两个序列,A直接维护,B记一下总和,再把错开一位的前缀和减去总和,实现两个序列下标的对齐
查询时从头开始,每次在树状数组上往前跳 \(2^k\) 步,k递减,每一次检查跳的下一位两个序列的大小关系,判断是否越过交点,最终找到交点
复杂度 \(O(Q \log Q)\),树状数组小常数可过
要注意最优解不一定在交点上,可能在附近,最大能量值不在交点就在交点+1,但是可能更高的温度也对应相同的答案,要多扫一次
2024.8.15
-
洛谷P5679 [GZOI2017] 等差子序列
bitset 维护数是否出现过,并利用与操作加快check
记得左移是往高位移,这个左右和一般画数组的左右是反过来的 -
洛谷P3293 [SCOI2016] 美味
给定长为n的序列a,m次询问,每次给定b,x,l,r,在 l 到 r 中找 i,s.t. $b \oplus (a_i+x) $ 最大,\(n \leq 2 \times 10^5,m \leq 10^5,0 \leq a_i,b,x < 10^5\)
不考虑 x 则非常容易,可持久化trie板子题
但是有 x,发现数据范围在 1e5量级,尝试两只log的做法
转换思路,查询操作可以理解成在一个节点区间全部向左平移x的trie上查
故使用可持久化权值线段树,在这棵树上面查询trie的区间
相当于把每个trie上的节点拆成线段树上log个节点
其他部分直接维护即可
2024.8.16
-
CF1221F Choose a Square
给定第一象限内的 n 个点(\(n \leq 5 \times 10^5\)),选一个对角线在 y=x 上的正方形,使得它包住的点的权值和减去它的边长最大.。
容易发现点的横纵坐标顺序无所谓,只要都在正方形坐标范围内就行了
所以我们把一个点转换成 \([min(x,y),max(x,y)]\) 的线段,正方形变成选择一段区间,左右端点都在区间内的贡献权值
然后就变成经典扫描线题了,按照L从右到左加线段,固定左端点扫右端点max,线段树维护区间加(其实是后缀加)区间max即可,记得初值赋成坐标的相反数,最终加上L,注意离散化过程中的处理 -
洛谷P4121 [WC2005] 双面棋盘
维护 \(n \times n(n \leq 200)\) 大小的黑白矩阵里黑色和白色的四连通连通块个数,支持单点颜色翻转,操作次数 \(m\leq10^4\)
连通性相关,考虑并查集
直接做显然不可取,换一个点就要全局重构
考虑使用线段树,每一行建一个叶子节点,线段树节点合并时发现只有第一行和最后一行会参与合并
故考虑每个节点记录第一行和最后一行节点的并查集情况,每次枚举两个子节点分界线上的情况进行合并
问题是怎么维护“情况”,我们考虑合并之后将每个点的id整理为它在并查集上的根节点以正确记录连通性,然后合并开始前只把涉及到的点拎出来建并查集。
每次修改之后重建这一行的并查集然后一路合并
总复杂度 \(O(nm \log n)\)
2024.8.17
-
CF438D The Child and Sequence
维护一个序列,支持区间取模,单点修改,询问区间和
注意到取模一次后值至少减半,每个数最多被取 \(\log_2 V\) 次,而且 \(n \leq 10^5\)
考虑维护区间max,如果max小于模数就不再递归,否则递归到底进行取模(简称:暴力)
复杂度 \(O(m \log_2 n \log_2 V )\),不会证,反正够快 -
洛谷P4556 [Vani有约会] 雨天的尾巴 /【模板】线段树合并
线段树合并经典题
每个节点记一个动态开点权值线段树,树上差分+线段树合并即可
树上差分为 u处+1, v处+1, lca(u,v)处-1, fa[lca(u,v)]处-1
2024.8.18
2024.8.20
- 洛谷P2261 [CQOI2007] 余数求和
数论分块板子,略
2024.8.21
-
YZOJ P6195
六维偏序,KDT 板子,略 -
洛谷P7561 [JOISC 2021 Day2] 道路の建設案 (Road Construction)
求平面上曼哈顿距离前k小值
时限10s,非常吓人,考虑乱搞
首先按套路肯定要拿一个堆维护前k小值
接着考虑建一棵 KDT,枚举每一个点,在 KDT 上面 dfs
利用 KDT 一个节点对应一个矩阵的特征,如果当前矩阵到点的最短距离都大于当前的第 k 小值就直接跳过
复杂度未知,但是跑得飞快,用时最长的点 1.64s
注意check最短距离的时候要判断当前点是否在矩形内,而且点到矩形的最短距离不是到四角的距离的min,而是要对每一维求距离加起来(鬼知道我写前一种写法的时候在想什么)
2024.8.22
-
洛谷P3810 【模板】三维偏序(陌上花开)
如题。
拿来练CDQ分治 -
洛谷P9869 [NOIP2023] 三值逻辑
先化简,处理出每一个值最后对应初始哪个变量
然后拓展域并查集做完了
2024.8.23
2024.8.24
2024.8.25
-
CF2003B Turtle and Piggy Are Playing a Game 2
转化之后的题意是:给一个序列,AB 两人轮流操作,A先手,每次每人可以选择相邻的两个数,A 会删掉较小的那个,B 则删较大的,最后序列剩一个数,A 希望它最大,B 希望它最小,问会剩哪个数。
中位数秒了
2024.8.26
- 洛谷P3332 [ZJOI2013] K大数查询
整体二分板子
2024.8.27
-
洛谷P1471 方差
展开方差式子后发现需要维护区间和和区间平方和
线段树即可 -
洛谷P4149 [IOI2011] Race
给一棵树,每条边有权。求一条简单路径,权值和等于 \(k\),且边的数量最小。
点分治板子
调红温了,一定要 check dfs 到的当前点是否已经被标记
if(!isGot[ed[i].to])getdis(ed[i].to,now,ed[i].val,1);
2024.8.28
- CF512E Fox And Polygon
构造题。
给一个有 n-3 条对角线的 n 边形,对角线两两不相交,即这个 n 边形被划分成 n-2 个三角形
每次操作可以选择一条对角线翻转,对于一条对角线AB,假设它的两边分别是三角形ABC和三角形ABD。“翻转”对角线AB,就是删除对角线AB,并添加对角线CD。
给定 n 边形的初始局面和目标局面,构造操作序列以从初始局面转为目标局面,\(n \leq 1000\)
我们尝试确定一个容易到达的中间状态,起点终点分别构造往中间状态转移的操作序列,然后将终点的序列反向(序列倒转,操作对换)即可得到操作序列
这里选择所有对角线都有一个端点为 1 的情况,每次找一条翻转后能有一个顶点连到 1 上的对角线进行翻转,复杂度 \(O(n^2)\)
2024.8.30
-
洛谷P3402 可持久化并查集
板子。
主席树记得算清楚节点数,开够节点。 -
洛谷P11012 「ALFR Round 4」B 颜料
给一个序列,对于一个区间,定义其权值为 \(\sum_{i=1}^W\sum_{j=i+1}^W\min(c_i,c_j)\),其中 \(c_i\) 表示颜色 \(i\) 的出现次数,\(W\) 为所有颜色种类的值域,求最短区间使得其权值大于 \(k\),输出长度。
考虑双指针,固定左端点找最近的右端点,这样只需要维护一个数的加入和删除操作
计算出每个数的贡献,直接更新即可
2024.8.31
-
梦熊 炼石计划 8.31 A. 北极星
简单构造
注意到可以以前面的数全部 -1 为代价实现最后一个数的+1或$\times$2
提前预留出后续操作需要的 -1 余量,然后直接构造即可 -
洛谷P2742 [USACO5.1] 圈奶牛Fencing the Cows /【模板】二维凸包
凸包板子
我怎么没写过这道题/jy -
洛谷P3829 [SHOI2012] 信用卡凸包
同上
注意a是竖直方向的长度,b是水平方向长度
ab打反有70,忍俊不禁
八月结算:共 35 题
2024.9.1
- YZOJ P4692
二维 dp 是容易的,但是发展潜力有限
我们考虑直接计数,枚举最后一个数是什么
我们把原序列 a 相邻项做商,相当于“差分”,得到序列 b
发现最后一个数确定后,每一种合法的 a 对应一个把最后一个数的所有质因数放到 b 中的方案
利用线性筛求出每个数的最小质因数,然后枚举质因数,假设当前质因数次数为 p
问题转化为 k 个有标号盒子放 p 个无标号球,插板即可
好写而且跑得飞快

浙公网安备 33010602011771号