
基本算法
文章平均质量分 67
尺取法,倍增···
SHOHOKUKU
这个作者很懒,什么都没留下…
展开
-
AtCoder ABC 365G 凸包 + 二分
则这两种操作对应点的连线都可以被取到。拓展到两个点以上的情况,则可以任取这些点构成的凸包内的任一点。的节点,二分满足约束条件的节点,最后再二分该节点与凸包上次一节点的线性组合。,若此节点不满足约束条件,则任一节点都不满足条件。对于最小化时间,则转化为最大化。,那么将其看作二维平面的点,即。,则他们的任意组合可以表示为。满足约束条件,则单位为。其余情况,我们考虑凸包。原创 2024-06-19 14:41:08 · 1017 阅读 · 0 评论 -
Codeforces 1858 E1/E2 树 / 前缀和
此版本允许离线,则根据查询构造出一棵树。这棵树满足性质:每一个查询都对应树上的一条从根节点自顶向下的路径。对于 ‘+’ 及其撤销操作,只用修改一个数字的至多两个位置的信息。使用 std::set 维护数字位置,使用 BIT 维护前缀和。对于撤销操作,维护一个栈即可。一个直观的做法是,维护一个足够大的数组。则 ‘-’ 及其撤销操作转化为不同前缀的。的索引是对应数字在数组最小的,则。、前缀和),像维护栈一样,不断维护。中所有元素的信息,只需要维护前缀。的信息(各个数字出现的位置以及。其实上不必动态地更新。原创 2024-02-07 20:31:54 · 902 阅读 · 0 评论 -
AtCoder ABC324G 启发式合并
个联通分量不断合并的过程,此时使用启发式合并,即规模较小的连通分量向规模较大的连通分量合并,以单个元素合并为基本运算,则基本运算次数为。使用 std::set 分别维护以索引和值为关键字的集合,每次分裂出较小的分量即可。逆则操作顺序考虑,可以看作至多。原创 2023-10-14 22:12:27 · 512 阅读 · 0 评论 -
AtCoder ABC322G 数学 + 暴力
根据 $1\leq X$,以及 $f(S,a)$ 关于 $a$ 的递增性,可以得到 $b原创 2023-10-13 16:38:07 · 244 阅读 · 0 评论 -
Codeforces 1878G 枚举 + 树上倍增
答案依赖于查询的路径上的所有点。按位与具备单调性,可以仅枚举路径上各个数位上的。预处理出树上倍增的信息,枚举中间位置更新答案。考虑答案的最大性,容易观察到,仅枚举。出现的深度最大的节点,此时可以处理出。第一次出现的位置,这样的位置规模为。自顶而下维护各个数位上。原创 2023-10-07 17:00:49 · 149 阅读 · 0 评论 -
AtCoder ABC260 G 累积和
的累积和做法,可以不断根据某一维度做差分,直到差分需要处理的规模适当的小;甚至可以按照不同维度分别处理贡献后再累计求和。对每一行计算前缀和,处理每一个询问时暴力枚举每一行进行累加。原创 2023-09-22 16:49:26 · 123 阅读 · 0 评论 -
AtCoder ARC106 E Hall 定理 + 二分 + 容斥原理 + 高维前后缀和
因为每一个职工的休息日之前总是对应唯一的工作日。预处理出每一天可以选择的用户集合。二分确定工作时长之后,可以统计出对于每一个确定的用户集合。的并集的规模,使用容斥原理,求高维前缀和即可。但二分图规模过大,直接求解最大匹配显然难以胜任。问题可以转化为每一天与职员之间的匹配问题,思路与。,与其存在连边的二分图另一侧节点的数量要大于等于。根据 Hall 定理,若二分图一侧点集。都能被匹配的充要条件是,对于。被选择的日子的集合。做高维后缀和,就能求出。的交集的规模,为了求出。,其恰好能被选择的天数。原创 2023-09-19 11:41:23 · 245 阅读 · 0 评论 -
AtCoder ABC320 G 二分 + 二分图匹配
答案满足单调性,二分求解。将问题转化为字符串与时间点的匹配问题,单个字符串代表的节点至多向。,仅从字符串节点一侧寻找增广路,匈牙利算法可以做到。段时间至少能匹配一个字符串,故二分上界为。字符串代表的二分图的一侧节点个数为。个时间点连边即可,因为剩余。原创 2023-09-19 11:23:43 · 254 阅读 · 0 评论 -
Codeforces 1619H 分块
若排列保持不变,可以预处理后倍增求解,但对于会改变排列的操作 1,则难以胜任。考虑分块,对每个位置。同理),那么只需要重新计算这些位置的。单次操作 2 查询复杂度。,单次操作 1 复杂度。原创 2023-08-07 09:20:49 · 148 阅读 · 0 评论 -
Codeforces 1579G DP / 二分 + bitset
用 std::bitset 维护当前的可能位置,初始位置可能位于。时,覆盖区域的最小值。枚举左右方向递推即可。次移动后所在位置与覆盖区域最左侧位置相差。中的任一个位置,递推即可。原创 2023-07-29 17:42:07 · 299 阅读 · 0 评论 -
LeeCode 770 后缀表达式
将中缀表达式转换为后缀表达式并同时计算。带变量的项当作多项式计算,方便起见,实现上加减法不对同类项合并系数,而是最后输出答案时同一合并。原创 2023-07-29 09:44:39 · 231 阅读 · 0 评论 -
P1175 后缀表达式
编码运算符的优先级,线性复杂度将中缀表达式转换为后缀表达式。为了方便输出,可以用类似对顶栈的结构,初始时右侧栈为后缀表达式;对于每一步计算,右侧栈不断弹出数字到左侧栈,直到扫描到第一个运算符。原创 2023-07-28 19:54:11 · 194 阅读 · 0 评论 -
AtCoder practice contest B 归并排序 + 二分 / 贪心 + 信息熵
对于 $n = 26$ 的情况,归并排序最坏情况下需要 $99$ 次比较。对于 $n=5$ 的情况,比较 $c_1,c_2$,再比较 $c_3,c_4$,接着比较两组数据的最小者(不妨假设为 $c_1$),此时得到了一个有序的三元组 $c_1,c_3,c_4$,二分求解 $c_5$ 的位置并插入,此时 $c_1$ 右侧的元素至多为 $3$,再次二分插入 $c_2$ 即可。由于插入一个有序三元组需要二分比较的次数为 $2$,故总比较次数 $3+2+2=7$ 满足条件。原创 2023-07-02 17:28:11 · 319 阅读 · 0 评论 -
Codeforces 1828D2 枚举
先考虑简单情况,即 $n\leq 5\cdot 10^3$,可以直接枚举 $O(n^2)$ 个子区间。固定左端点,拓展右端点的同时维护需要排序的段(可以通过求解新增元素在有序区间的插入位置做到)。总时间复杂度 $O(n^2\log n)$。原创 2023-06-28 12:05:13 · 140 阅读 · 0 评论 -
Codeforces 1611G 贪心 + 二分 / Dilworth 定理 + DP
根据 Dilworth 定理,最小链划分等于最长反链。,维护一个已使用的 Robot 集合,对于任一个有物品的节点。,二分求解恰好能走到此节点的 Robot,安排其走到。,DP 求解最长反链即可。此处反链上任一对节点。奇偶性不变,故可以根据奇偶性分别求解。反之,新增 Robot。原创 2023-05-29 22:33:45 · 545 阅读 · 0 评论 -
Codeforcs 1732C2 暴力
方便起见,区间表示为左闭右开。观察到 $f(l,r)\geq f(l',r'),[l',r')\in [l,r)$,满足单调性,则 $[l,r)$ 子区间最大 $f$ 等于 $f(l,r)$。当同一数位出现大于一次 $1$ 时,这一数对 $f$ 的贡献大于 $0$,那么暴力枚举左右边界即可。时间复杂度 $O\Big(q\log^2(\max a_i)\Big)$。原创 2023-05-30 22:59:56 · 644 阅读 · 0 评论 -
CodeChef - COVERING 高维前后缀和 + 容斥原理
令 $$T(S) = \sum\limits_{(A\cup B\cup C) = S} F(A)G(B)H(C)$$ 二进制状态压缩表示 $S$,则 $R(S)$ 是关于 $T(S)$ 的高维后缀和,即 $$R(S)=\sum\limits_{A\in S}T(A)$$ 问题转换为如何求解 $T(S)$。考虑每一个元素是否存在,即二进制表示下每一位是否为零,可以应用容斥原理得到原创 2022-10-28 17:57:56 · 749 阅读 · 1 评论 -
Codeforces 1535F 字符串 + 倍增 + BIT
若字符串 $a,b$ 的字符多重集合不相等,则 $f(a,b) = 1337$。反之,将 $a,b$ 整个串做排序必然相等,则 $f(a,b)\leq 2$。此时只用考虑 $f(a,b)=1$ 的情况。若仅对 $a$ 进行一次子串 $[l,r)$ 排序使 $a = b$,则字典序意义下 $a>b$;且 $a,b$ 在 $l$ 左侧的前缀与 $r$ 右侧的后缀相等,则字典序意义下 $a,b$ 的反串 $a^{\prime},b^{\prime}$ 满足 $a^{\prime}原创 2022-10-27 20:37:53 · 476 阅读 · 0 评论 -
P8193 [USACO22FEB] 高维前缀和
令 $s = \sum a_i$,$presum_i = \sum_{j\leq i}a_j$。对于第 $i$ 个询问,存在满足条件操作的充要条件是 $q_i\vert s$。令 $x = \sum [presum_i \mod q_i = 0]$。 至少需要合并的次数为 $n-x$,至少需要分裂的次数为 $s/q_i-x$,且这样的操作可以满足条件。答案为 $n + s/q_i -2x$。原创 2022-10-20 19:34:55 · 388 阅读 · 0 评论 -
Codeforces 1654F 倍增
题意传送门 Codeforces 1654F Minimal String Xoration题解考虑对以 j=[0,2n)j = [0,2^n)j=[0,2n) 的字符串进行排序。排序思路与倍增求后缀数组类似。倍增正确性证明如下:[k⊕i,(k+1)⊕i,⋯ )=[0⊕(k⊕i),1⊕(k⊕i),⋯ ),k=2n,序列长度小于k[k\oplus i, (k + 1)\oplus i,\cdots) = [0\oplus(k\oplus i), 1\oplus(k\oplus i),\cdots),原创 2022-04-11 22:29:27 · 246 阅读 · 0 评论 -
计蒜客 A1607 贪心 + 线性基
题意传送门 计蒜客 A1607 XOR题解不考虑 kkk 时,查询区间子序列异或最大值,即 Codeforces 1100F ,枚举右界,贪心地使位数高的线性基出现的位置尽可能地晚,最后处理包含在查询区间的线性基即可。本题目标是最大化 kkk 与区间某个子序列异或和的按位或。考虑按位或的性质,若 kkk 第 iii 位为 111,那么不论异或和是什么,结果的第 iii 位都是 111。那么将所有 aia_iai 按位与上 kkk 的按位反转,问题就转换为求解最大化不考虑 kkk 的最大异或值。#原创 2022-04-03 15:45:32 · 1435 阅读 · 0 评论 -
SGU 148 枚举
题意传送门 SGU 148 B-Station题解自顶而下枚举层 iii,计算摧毁 i→ni\rightarrow ni→n 需要的最小花费。暴力计算 O(n2)O(n^2)O(n2)。令 sum[i+1]sum[i+1]sum[i+1] 代表 0⋯i0\cdots i0⋯i 关于 LLL 的前缀和。那么枚举 iii 时,实际上需要花钱摧毁的位置 jjj 满足 sum[j+1]−sum[i]≤L[i]sum[j+1]-sum[i]\leq L[i]sum[j+1]−sum[i]≤L[i]。前缀和单调原创 2022-04-02 21:17:59 · 645 阅读 · 0 评论 -
计蒜客 A1617 Hall 定理 + 尺取法 + 线段树
题意传送门 计蒜客 A1617 LOVER II题解先不考虑区间查询。对于 bbb 与 aaa,令其升序排序。令 c[i]c[i]c[i] 等于满足 a[i]+b[j]≥ka[i] + b[j] \geq ka[i]+b[j]≥k 的 jjj 的数量。c[i]c[i]c[i] 单调不减,且满足条件的 jjj 是 aaa 的后缀。满足条件当且仅当 c[i]≥ic[i]\geq ic[i]≥i。可以通过 Hall 定理证明,满足上述条件时存在 aaa 的完备匹配。对于 bbb,若 lll 增加,满足条件原创 2022-04-02 16:58:12 · 1130 阅读 · 0 评论 -
P3292 [SCOI2016] 贪心 + 线性基 + LCA
题意传送门 P3292 [SCOI2016]幸运数字题解求树上两点间路径任意数字的异或最大值。求出线性基即可。不妨设 O(logG)O(\log G)O(logG) 与 O(logn)O(\log n)O(logn) 同一量级。考虑倍增,由于涉及两段路径的线性基合并,预处理 O(nlog3n)O(n\log^3n)O(nlog3n),查询 O(qlog3n)O(q\log^3 n)O(qlog3n)。显然难以胜任。考虑点分治,维护任一节点到重心路径上的线性基,此时只用考虑单个节点点值的插入原创 2022-03-24 21:31:55 · 630 阅读 · 0 评论 -
P4301 [CQOI2013] 贪心 + 线性基
题意传送门 P4301 [CQOI2013] 新Nim游戏题解Nim 游戏中,所有堆异或和非零则先手必胜,反之先手必败。若第一次取走 k−1k-1k−1 堆,则可以保证按原始 Nim 游戏规则开始游戏时,所有堆异或和非零。故一定可以保证取胜。当且仅当第一回合结束时,剩下的堆的数字在异或运算下线性无关,保证取胜。还要最小化第一回合取的数,那么问题转换为求一组异或运算下线性无关的数字,使其数字和最大。根据贪心策略,应该取一组线性基,即异或运算下的极大无关组,且每个主元对应的基的数字要尽可能大。若在当前原创 2022-03-24 17:05:11 · 4302 阅读 · 0 评论 -
Codeforces 786C 分块 + 二分 / 可持久化线段树
题意传送门 Codeforces 786C Till I Collapse题解朴素的做法是从左边界开始贪心地取元素,直到当前维护的区间颜色数量大于 kkk,则新增一个区间。总时间复杂度 O(n2)O(n^2)O(n2)。分块 + 二分若区间颜色的最大数量为 kkk,则区间数的上界为 n/kn/kn/k,当 kkk 较大时,存在多个连续的 kkk 满足区间数相同,此时可以二分求解。设边界值为 ttt,则 k<tk<tk<t 时朴素的求解,反之二分答案,总时间复杂度 O(tn+n2/原创 2022-03-11 20:16:54 · 533 阅读 · 0 评论 -
Codeforces 1045C DFS 树 + 贪心 + 倍增
题意传送门 Codeforces 1045C Hyperspace Highways题解图中任一简单环节点构成的子图一定是完全图。构造 DFSDFSDFS 树,由于非树边仅可能为返祖边,所以,若任一节点位于任一简单环中,那么环上的节点是这个节点的祖先节点或孙子节点。LCA(u,v)LCA(u,v)LCA(u,v) 一定是路径 (u,v)(u,v)(u,v) 的必经点(否则会出现非返祖边的非树边),故分别考虑 u−LCA(u,v)u-LCA(u,v)u−LCA(u,v) 与 v−LCA(u,v)v-L原创 2022-02-19 11:33:20 · 274 阅读 · 0 评论 -
Codeforces 769C 贪心 + BFS + DFS
题意传送门 Code forces 769C Cycle In Maze题解采用贪心策略尽可能地取字典序最小的方向。问题在于如何判断能否最终 kkk 步后返回起点,容易发现这个条件在时间序上具备单调性。那么 BFSBFSBFS 求起点至各点的最短路,同时记录逆向返回前驱节点的字典序最小的方向。最后 DFSDFSDFS 求解即可。总时间复杂度 O(NM+K)O(NM+K)O(NM+K)。#include <bits/stdc++.h>using namespace std;#defi原创 2022-02-17 22:47:22 · 360 阅读 · 0 评论 -
POJ 3643 SA
大致题意已知不等式 ax + by + cz + d >0 。求参数 a, b, c, d 使,所有 Alliance systems 中的点都不满足不等式,且所有 Empire systems 中的点都满足不等式。看完题目一脸懵逼…然后在 Discuss 见到了模拟退火法,学习了一下,Emmmm 真神奇,能 ac 是数据真的弱,整数内解决战斗。思路是不满足条件就简单地跳到下一个状态。...原创 2020-02-28 16:16:15 · 135 阅读 · 0 评论 -
POJ 2420 模拟退火
大致题意坐标轴内有 N 个坐标 x, y 为整数的点,选择某个点使它与其他 N 个点的距离和最小。输出最短距离和,向下取整。 N <= 100, 0 <= x, y <= 10000随机选取初始点(数量越多搜索到全局最优解的概率越大),初始温度 T(两点间可能最大值),退火结束温度 eps(考虑输出精度设置即可)以及收缩因子 delta 。随机选取转移的矢量,进行状态转移。设...原创 2020-02-28 22:26:12 · 124 阅读 · 0 评论 -
POJ 1379 模拟退火
大致题意X * Y 的地图上有 M 个陷阱,求地图上某一点的坐标,使离它最近陷阱的距离最大。1 <= X,Y <=10000, 1 <= M <= 1000直接模拟退火,状态转移要足够随机,这里的做法是,以当前温度作为转移向量的模值,每一模值随机选取多个角度。初始结果选取较多的点,可以跳过局部最优化概率转移这一步。然后是调参,初始温度和收缩因子决定了退火过程的耗时。初...原创 2020-02-29 11:09:44 · 220 阅读 · 0 评论 -
LeeCode 1515 模拟退火
题意传送门 LeeCode 1515. 服务中心的最佳位置题解二维区域上求到所有客户的欧几里得距离的总和最小位置的服务中心的位置,可以使用模拟退火法求解。在客户区域随机初始化较多的点,那么模拟退火时可以简单地当答案更优时进行转移,而不用依概率转移。class Solution{#define maxn 50#define maxl 100public: struct P { double x, y, d; } ct[maxn], sv[maxn];原创 2020-11-28 22:41:23 · 309 阅读 · 0 评论 -
Codeforces 1582F2 暴力
题意传送门 Codeforces 1582F2 Korney Korneevich and XOR (hard version)题解比较直接的想法是动态规划。dp[i][j]dp[i][j]dp[i][j] 代表 [0,i)[0,i)[0,i) 中子序列异或和为 iii 时,序列末尾元素的最小值。顺序遍历元素,对每个元素枚举异或和可能的值,判断加入当前元素后是否满足子序列的单调递增性即可。总时间复杂度 O(N×max{ai})O(N\times\max\{a_i\})O(N×max{ai})。显然原创 2021-10-31 22:58:57 · 196 阅读 · 0 评论 -
Codeforces 1535E 树上倍增 + 贪心
题意传送门 Codeforces 1535E old Transfer题解节点 uuu 的单位黄金花费严格大于祖先节点。那么根据贪心策略,对任意花费最小的购买,一定从祖先节点开始。问题转化为如何高效求解任一节点至根节点路径上剩余黄金数量非零且深度最小的节点。参考倍增 LCALCALCA 的思路,预处理出节点 uuu 的 2k2^k2k 辈祖先,即可 O(logq)O(\log q)O(logq) 求出这样的节点。总时间复杂度 O(qlogq)O(q\log q)O(qlogq)。#includ原创 2021-09-25 08:54:55 · 103 阅读 · 0 评论 -
P6826「EZEC-4」顶的和式
题意传送门 P6826「EZEC-4」月下轻花舞题解先处理右侧的和式,依据个人习惯,将 iii 用 xxx 表示 。设 m=⌊logxn⌋m=\lfloor \log_{x}^{n}\rfloorm=⌊logxn⌋,则有∑j=1n⌈logxj⌉=∑j=1nk[k=⌈logxj⌉][logxj≤k<logxj+1]=∑j,kk[1≤k≤m][xk−1<j≤xk]+∑j(m+1)[xm<j≤n]=∑k=1mk(xk−xk−1)+(m+1)(n−xm)=1x−1[1−(m+1原创 2021-09-08 23:31:06 · 98 阅读 · 0 评论 -
P6830 [IOI2020] 构造
题意传送门 P6830 [IOI2020]连接擎天树题解若出现 p[i][j]=3p[i][j]=3p[i][j]=3 的情况,由于没有重边,则至少存在两条 i→ji\rightarrow ji→j 的路径,满足路径上存在非 i,ji,ji,j 的节点;对于这样的两个分别属于不同路径的节点 u,vu,vu,v,它们之间至少存在四条路径,即 u→i→v,u→i→j→v,u→j→v,u→j→i→vu\rightarrow i\rightarrow v,u\rightarrow i\rightarrow原创 2021-09-05 21:48:31 · 119 阅读 · 0 评论 -
P6748『MdOI R3』树形 DP + 贪心
题解传送门 P6748 『MdOI R3』Fallen Lord题解构造的树的任一边的权值上界都为 MMM。设节点 uuu 的度为 dud_udu,则与 uuu 相连的边中,uuu 对 ⌊du/2⌋+1\lfloor d_u/2\rfloor+1⌊du/2⌋+1 条边有边权上界为 AuA_uAu 的约束,对其余 du−(⌊du/2⌋+1)d_u-(\lfloor d_u/2\rfloor+1)du−(⌊du/2⌋+1) 条边无边权上界的约束。考虑任意节点 uuu,若其非根节点,则仅存在一条原创 2021-09-04 14:46:41 · 105 阅读 · 0 评论 -
LeeCode 1982 构造
题意传送门 LeeCode 1982 从子集的和还原数组题解若数组元素非负,根据其元素求和的单调不减性,可以如下构造。取可重集 sumssumssums 中除了代表空集的 000 的最小值添加至答案集合,将答案集合可构成的子集和从 sumssumssums 中删去,递归求解即可。若包含负元素,则 sumssumssums 的最小值为负元素之和,设其为 ddd。设 SSS 为原数组构成的可重集,S−S^-S− 为负元素构成的可重集。则对子集 A∈SA\in SA∈S,将其子集和减去 ddd 得到值 s原创 2021-08-30 22:12:37 · 120 阅读 · 0 评论 -
P6524「Wdoi-1」贪心
题意传送门 P6524「Wdoi-1」托卡马克题解使选取的方案按照坐标有序 x0,x1,⋯ ,xM−1x_0,x_1,\cdots,x_{M-1}x0,x1,⋯,xM−1,索引为 iii 的位置对总距离的贡献为 i−(M−1−i)i-(M-1-i)i−(M−1−i)。已知 2∣M2\vert M2∣M,则各位置对总距离的贡献的绝对值为奇数,即贡献非零且互不相同。使 XXX 有序,按照贪心策略,贡献为正的位置,依据贡献值从小到大取 XN−M/2,⋯ ,XM−1X_{N-M/2},\cdots,X_原创 2021-08-30 20:10:44 · 157 阅读 · 0 评论 -
LeeCode 1984 Trie + 序列化
题意传送门 LeeCode 1948 删除系统中的重复文件夹题解将文件系统建为 TrieTrieTrie,设根节点深度为 000,此时有 ∑u∈Trieu(depth[u]+1)≤2×105\sum_{u\in Trie}u(depth[u]+1)\leq 2\times 10^5∑u∈Trieu(depth[u]+1)≤2×105。考虑将子文件夹,即某棵子树序列化。具体而言,后序遍历 TrieTrieTrie,设以 uuu 为根节点的子树,按照与孩子节点 chchch 连边所代表的字符串 sch原创 2021-08-21 12:01:04 · 240 阅读 · 0 评论