08 2022 档案
摘要:King Graffs Defense tarjan 割边 显然如果是割边的话,边两边的边双连通分量就不能连通 因此考虑 搜索树中,计算出所有边双连通分量的大小,然后每个边双连通分量与其他点的乘积之和,就是所有答案情况的 总情况数就是 $\frac{n*(n-
阅读全文
摘要:Untangling Chain 构造 显然对于一条线段来说,走到头只有左右两边可以选择,换句话说,第一次是横着走,第二次是竖着走,因此可以构造一个走法,让他每次都突破自身走过路径的四个边(矩形),使得每次走到头的时候,他的左右两边必然不存在直线 构造的合法性: 每次只突破长度 ,因此对于横向
阅读全文
摘要:Even-Odd XOR 构造 这题对于数字大小的要求非常宽松,意味着会有大量的高位不会被使用到 考虑对于任意的 , , 如何异或上一些值,使得 , 相等,显然直接异或上 就可以让其相等, 但是 可能之前用过,于是考虑利用
阅读全文
摘要:Counting Rectangles 思维 把所有的矩形左上角都叠在一起,就会发现是一个二维前缀和的求解问题: 这个显然就是一个二维前缀和的问题,直接算就好了 #include
阅读全文
摘要:Slot Machines 求字符串后缀的最小循环节(可截断) 只能在 预处理后 询问最小循环节,因此考虑直接把数组反转,然后询问即可 注意不可以把所有数字省略 #include <iostream> #include <cstdio> #incl
阅读全文
摘要:How Many to Be Happy? 最小割 因为是最小生成树,因此可以考虑对于一条边来说,他的左右两端的点视为处于两个不同的集合,然后只通过该边进行连接,这样最小生成树就必然会利用这条边 比该边大的边显然不用考虑,就考虑比该边边权小的边,然后进行最小割,边流量为 (分割成两个集合,且割
阅读全文
摘要:Philosopher's Walk 递归分治 判断一下当前走的位置是属于 个块中的第几个块,然后递归计算一下在边长变小一倍后,他应该所处的位置,然后再对原位置进行旋转或平移的操作 #include <iostream> #include <cstdio> #include <vector>
阅读全文
摘要:Anya's gifts 将数字分成两个集合,使得两个集合的异或和之和最大 线性基 因为必然是要分成两个部分,所以一个数位出现了奇数次 ,不管怎么分,必然能变成 的情况 所以只考虑偶数次的数位,让一个集合尽可能的大(凑 ),则另外一个集合的相同数位也会是 因此就是对
阅读全文
摘要:Candies median 二分 直接二分答案,每次 的时候就遍历一次 算前缀和就好了 这题太具欺骗性了,之前一直以为是什么线段树,结果常数真的大 #include <iostream> #include <cstdio> #include <vector> using n
阅读全文
摘要:Erudite of words 组合数学 + 容斥 定义 :表示由 个字母组成的长度为 的单词数(每个字母必须在单词中出现) 显然答案就是 关于 的递推式: $$ F_i = i^n - \sum_{j=1}^{k-1}(C
阅读全文
摘要:Froginald the frog 矩阵快速幂 如果没有分隔的话,这就是一个矩阵快速幂求斐波那契的问题 因为有分隔,因此考虑他们分成若干个块,每个块的方案数之积就是答案,显然分隔的长度如果大于 ,则答案为 有点小卡常,所以如果是比较小的斐波那契询问,直接打表 或者是加个记忆化 #in
阅读全文
摘要:Different Pass a Ports 矩阵快速幂 模板 图的邻接矩阵的 次幂就是从图上所有点走 步的方案数 #include <iostream> #include <cstdio> using namespace std; typedef long long ll; con
阅读全文
摘要:Building 5G antennas dfs 剪枝 要字典序最小,显然第一个点就是 ,后面考虑走 步后能到达的点集中选一个字典序最小的,重复该过程 考虑 表示第 号点当前能走 步所包含的点的集合,我们可以发现对于相同的点,如果 $j_1 >
阅读全文
摘要:Critical Edges tarjan 割边模板 #include <iostream> #include <cstdio> #include <algorithm> #include <vector> using namespace std; #define pii pair<int, int
阅读全文
摘要:嗅探器 tarjan 割点 考虑以 作为根进行一次 的搜索,会发现只有到 的路径上的割点才有可能是最终的答案 因此考虑一边标记这个路径,一边在这个路径上找割点即可 #include <iostream> #include <cstdio> #include <alg
阅读全文
摘要:Electricity 计算割去某个点后,最大的连通块数量 tarjan 割点 跑一次 记录一下每个点删去后会产生多少个新的连通块,相当于找 的数量 如果为根节点,那么多出来的连通块数量要减一,因为本身没有父节点方向的连通块 #inc
阅读全文
摘要:【模板】割点(割顶) tarjan 学了一下割点,发现就是找 的点,同时根的话要求有两个分支才能作为割点 搜索的时候如果 没有被访问过,则直接继续搜,如果访问过,则尝试通过 来松弛自己的 ,因为只考
阅读全文
摘要:Mr. Kitayuta's Technology tarjan + 思维 先缩点,然后考虑如何建边 如果其中一个 图中出现一个缩点后大小大于 的连通块(环),则考虑直接将这个 图变成一个环,代价显然都是相同的,即点的数量 因此延伸,考虑多个缩点前都有环的
阅读全文
摘要:最大半连通子图 tarjan 缩点后计算弱连通图,相当于 图中点最多的路径,计算最大弱连通子图的时候就检查每个子节点的最长路径数量 注意该题的答案计算与边有关,要去重边 #include <iostream> #include <cstdio> #include <vector> #in
阅读全文
摘要:2+ doors 贪心 位与位之间互不影响,因此考虑每个位进行考虑就行 因为是或的关系,先考虑 的情况,如果出现 ,则两个数字的该位必然是 如果是 的情况,就考虑贪心,从第一个数字开始往后考虑: 如果另一个数字的当前位是 ,则将当前数字的当前位置为 ,剩下的
阅读全文
摘要:Burenka and Traditions 贪心 由于代价是向上取整的,因此可以直接考虑成两种方式: 选择两个相邻的数,让他们同时异或上一个值 选择一个数字,让他变成 由此可见,最多的次数就是,全部都选择操作 ,因此我们考虑让操作 使得两个相邻的数字一样的情况尽量的多次出现,
阅读全文
摘要:Plus and AND 贪心 从高位开始判断,判断每个数字当前位如果置为 需要多少步,如果当前位原本就是 ,则不消耗,如果原本不是,则消耗低位后,需要将低位全部置 然后排序,选消耗最少的 个,如果满足其消耗小于 ,直接默认该为置为 ,并保留之前的修改和消耗
阅读全文
摘要:Connections 思维 真没看出来 由于给的是强连通图,直接保留从 开始深搜,保证 能访问到其他所有点的,然后反向建图,保证所有点能够到达 #include <iostream> #include <cstdio> #include <algorithm> #inclu
阅读全文
摘要:Frog Traveler dp + bfs 感觉又像搜索 从后往前进行状态转移,像 一样保证当前搜索的是消耗次数最少的 状态转移因为是一个连续的区间,因此考虑当前能上升到的最大距离,只有能更新这个最大值,才进行状态转,保证每个位置只被访问一次 时间复杂度 #include
阅读全文
摘要:Preorder 树型 dp + 思维 表示以 为根的子树通过变换有多少种不同的先序遍历 状态转移方程: 当左右子树不同,两个子树交换位置之后,没有重复的出现: 当左右子树相同时,两个子树交换位置后,会有相同的
阅读全文
摘要:Capital City tarjan 缩点 缩点之后,找到 DAG 图中唯一一个出度为 的点,如果有多个,说明不成立 #include <iostream> #include <cstdio> #include <algorithm> #include <stack> #include <
阅读全文
摘要:Building a Fence dp 模拟? 维护好可摆放的区间即可,我用的区间是指当前位置可摆放的东西的下边界 区间下限:,表示尽量往下放,以及在地面之上 区间上限:$r_i = min(r_{i-1} - 1, h_i + k - 1)
阅读全文
摘要:New Year's Puzzle 模拟 如果尝试从左到右放,就会发现其实放的基本是唯一的,因此考虑直接模拟就好了 针对当前列,分成三种状态: 状态 :上下都不能放 状态 :下面不能放 状态 :上面不能放、 状态 :上下都能放 考虑不同的状态相互遇到会变成另一个什么状态,即可
阅读全文
摘要:LCA 基本定义:最近公共祖先简称 LCA(Lowest Common Ancestor)。两个结点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。 简单来讲,就是两个点到根的路径上,深度最深的重合点 常用的求解方法: 朴素方法 每次选择深度较深的那个结点,往上走一步,直到两个结点重合,
阅读全文
摘要:染色 树链剖分 考虑如果在数列上的话,就是用线段树处理这个问题 线段树记录答案,并且处理区间和并的问题:如果区间合并的地方颜色相同,则加和后的答案要减一 因此维护所有线段树区间两端的颜色 染色的过程可以加入 然后再在树上跑一个树链剖分 时间复杂度为 #i
阅读全文
摘要:Passable Paths LCA 在树上找到形容一条链,只用找到链的两个端点即可,因此这题的初始想法就是找端点 第一个端点:深度最深的地方 第二个端点:离第一个端点最远的那个点 找到两个端点之后,就判断一下其他点是否在这个链上:最快的方法就是判断两个端点到这个点 p 的距离之和,是不是和链长相等
阅读全文
摘要:Cow Ski Area 把一个图变成一个强连通图 考虑 缩点之后形成若干个 图,接下来就是将这若干个 图连接起来 不难发现我们先让所有的图首尾相连(入度为 和 出度为 ),使得所有的 图可以互相到达(环) 接着如
阅读全文
摘要:可达性 缩点 如果是 图,则答案就是入度为 的强连通分量中字典序最小的点组成的点集 因此直接缩点,然后维护每个强连通分量的最小字典序的点 #include <iostream> #include <cstdio> #include <stack> #includ
阅读全文
摘要:Checkposts 如果是 图,则只用找入度为 的点即可 因此考虑缩点后,找所有入度为 的点 最小值则为,缩点后所有入度为 的强连通块中,每个都拿一个代价最小的点 方案数为,在上述的强连通块,记录一下代价最小的点有多少个,全部相乘即可 因此 $
阅读全文
摘要:上白泽慧音 找一个点数量最大,且字典序最小的强连通块 在跑的时候顺便维护一个连通块的数量 #include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <
阅读全文
摘要:Coin Collector 典中典题了属于是 缩点 + 记忆化搜索 或 如果是 图,直接记忆化搜索或者 跑一边 考虑图中有强连通分量,先缩点后记忆化搜索 每个点的硬币最大值 为,其他能到该点的 最大值转移过来 #include
阅读全文
摘要:Going from u to v or from v to u? 判断是不是弱连通图 缩点 + 拓扑 弱联通说明必须要有唯一的拓扑序,也就是拓扑的队列里始终只有一个 拓扑需要 图,因此考虑 缩点后跑拓扑 #include <iostream> #in
阅读全文
摘要:True Friends 判断所有强连通块的数量 tarjan 模板 #include <iostream> #include <cstdio> #include <algorithm> #include <stack> #include <vector> #include <string> usi
阅读全文
摘要:Planets and Kingdoms 找出所有的点所属的强连通块编号 tarjan 模板 #include <iostream> #include <vector> #include <algorithm> #include <stack> using namespace std; const
阅读全文
摘要:Flight Routes Check 判断是不是一个强连通图,如果不是,就找出不能到达的单程 tarjan 模板 判断不能到达的,直接从 开始走一次搜索,如果与 不同强连通块上的点,且 能够到达那个点,显然答案就是从那个点到 记得考虑整个图不连通的情况 #inclu
阅读全文
摘要:I Hate Non-integer Number dp 如果能平均分,说明选了 个数字,且其和在 的意义下为 因此考虑用 跑 次,第 次代表选择 个数字 代表前 个数字,选择 个数字,模意义下为
阅读全文
摘要:Red and Blue Graph 思维 + 组合数 从点上想,一直找不到突破口,考虑从边的角度开始想 如果一条边两个端点都是红点,则说明这个边消耗红点的度数为 如果一条边有一个端点是红点,则消耗红点度数为 我们可以从这里开始突破,假设红色点的总度数为 ,两个端点都是红色的边
阅读全文
摘要:Erase and Rotate 思维 + 单调栈 考虑只能删除的情况: 由于我们要求字典序最小,因此考虑在前 个数字中,我们选取最小的,然后把在他前面的所有数字全部删掉,每删掉一个都让 减小 然后保留那个最小的数字,往后继续上述过程 如果跑到最后仍有
阅读全文
摘要:传送门 A - World Cup 判断一下模 #include <iostream> #include <cstdio> #include <algorithm> #include <string> using namespace std; int main() { int x; cin >> x
阅读全文
摘要:传送门 A - Everyone Loves to Sleep 判断一下哪个时间离得最近,如果时间比当前时间还前的话,就加上一天的时间 #include <iostream> #include <vector> #include <array> using namespace std; int ma
阅读全文
摘要:Checkers 思维 + 倍增LCA 隐式建图 考虑排序好的大小 , , 如果 :只有两种情况转移,中间的往左边或者右边跳 如果 :除了上述的情况,还有两边通过中间跳 第二种情况显然可以被认为是其上一个状态,通过中
阅读全文