07 2022 档案
摘要:Network 树上差分 + 倍增LCA 树上添加一条边,会形成一个环,环上的边如果随便断开一条,仍然是属于同一个集合里 因此我们可以计算一下每一条边在多少个环内,最后再对每一条边进行判断,有多少种删除边的方法,计算的话可以用树上差分 解决 假设一条边处在 个环内 $x = 0
阅读全文
摘要:Distance Queries 树上距离板题 #include <iostream> #include <cstdio> #include <algorithm> #include <vector> using namespace std; const int maxn = 4e4 + 10; t
阅读全文
摘要:1-Trees and Queries LCA 倍增 + 思维 因为这里的路径不是简单路径,因此只要符合最短路径长度 不大于 ,且最短路径长度与 的奇偶性相同,就必定有路径可以到(反复走一步,退一步) 加入一条边之后,可能会产生另一条路径的奇偶性与最短路径的奇偶性不同,因此我们考虑检测
阅读全文
摘要:Tree Queries LCA 倍增 + 思维 所有的点到一条链的距离至多为 ,代表他们的父节点一定都在同一条链上 根据这个,找到最深的点,然后判断所有的点和它是不是在同一个链:它与其他点的 LCA 都是等于其他点 #include <iostream> #include <cstdio>
阅读全文
摘要:Connections between cities LCA 倍增板子 求距离维护一个前缀和, #include <iostream> #include <cstdio> #include
阅读全文
摘要:Caesar's Legions 记忆化搜索 表示当前有 个步兵, 个骑兵,同时当前的兵种(第 个)是步兵(0) 或 骑兵(1) 假设当前兵种是步兵,则可以进行记忆化搜索 $dp[i][j][0] = \sum_{x=1}^{min(k_2, j
阅读全文
摘要:传送门 A - Intersection 区间标记一下 #include <iostream> #include <vector> using namespace std; const int maxn = 110; int main() { vector<int>vis(110, 0); for(
阅读全文
摘要:传送门 最近没进入状态,好久没更新博客了,有点开摆的感觉,不过集训期间肯定会认认真真打的 多校的题目是真的难顶 A - Three Doors 模拟一下 #include <iostream> #include <cstdio> #include <algorithm> #include <vect
阅读全文
摘要:瑰丽华尔兹 + 单调队列优化 表示在第 次倾斜后 且 的位置上,能够滑动的最长距离,第一纬可以直接用滚动数组消除 显然每次倾斜都要对所有的状态进行更新,分四个方向进行更新,以向右滑动为例,有状态转移方程: $$ dp[i]
阅读全文
摘要:Watching Fireworks is Fun dp 表示在第 个烟花,且此时位于第 个位置的最大快乐值 对于第 个烟花,此时处于第 个位置,可以从第 个位置走过来,因此有 的范围: $$ max(1, j - (t_i -
阅读全文
摘要:传送门 A. YES or YES? 统一一下大小写 #include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <string> #include <queue> #include <f
阅读全文
摘要:传送门 第一次赛中 AK div3,值得纪念! 赛后发现有很多题想的不是很周到,所以晚发了这么久 A - Round Down the Price 找到一个不大于当前数字的 10 的次幂 #include <iostream> #include <cstdio> #include <algorith
阅读全文
摘要:Tree 树链剖分 + 线段树 除去区间修改的难点,其他都是树链剖分基础 线段树维护异或区间和,用且、或修改区间单点,如果单考虑一个值的话似乎很难修改,因此考虑将一个数字分割成 32 位,硬跑 32 次 #include <iostream> #include <cstdio> #include <
阅读全文
摘要:Circumferences 并查集 找到点所在的两个圆,然后将所有的圆互相判断一下是否相交,如果相交则并查集连起来,注意同心圆的情况 最后判断所在的两个圆是否连通 #include <iostream> #include <cstdio> #include <algorithm> #include
阅读全文
摘要:传送门 A - Growth Record 看题直接算,就出生之后 X 岁以下的身高增速为 D,给出 N 岁时身高为 T,求 M 岁时身高是多少 #include <iostream> #include <cstdio> #include <algorithm> #include <vector>
阅读全文
摘要:Permutation Restoration 贪心 很类似于调度问题,考虑好贪心优先级即可 显然对于每个位置 我们可以根据现有的 和 来推算出可行的 的范围,是一段连续的区间,我们假设为 题目说了答案必有解,因此从贪心的考虑来讲,只
阅读全文
摘要:Schedule Management 二分答案 显然答案具备单调性,直接二分, 的时候,优先让工人自己先干自己的活 如果有时间溢出,则能多干 的工作 如果不够时间,则记录还有多少活要干 如果 wa4 记得开 long long(悲 #include <ios
阅读全文
摘要:传送门 A - Grass Field 每次清除一行一列,最多也就清除 2 次,判断一下就好了 #include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <string> #includ
阅读全文
摘要:树上操作 树链剖分模板 - 子树区间加和 考虑到树链剖分的时候,一颗子树内的 dfn 序一定是连续的一段区间,因此只要找到子树内最大的 dfn 序即可,也就是树链剖分 dfs 的时候回到当前结点时,记录一下当前分配 dfn 序分配到了哪个值 然后直接线段树区间加和即可 #include <iostr
阅读全文
摘要:松鼠的新家 树上差分模板题 - 点差分 #include <iostream> #include <cstdio> #include <algorithm> #include <vector> using namespace std; const int maxn = 3e5 + 10; int v
阅读全文
摘要:运输计划 倍增 LCA + 二分 + 树上差分 显然二分答案是可行的,因为具有单调性,问题在于 check 函数如何写 考虑当前值 mid 是否可行:我们只需要考虑比 mid 大的所有运输计划,将这些计划经过的边进行标记,如果某个边被标记的次数等于所有大于 mid 的运输计划数量,则说明这些运输计划
阅读全文
摘要:Query on a tree again! 树链剖分 + 二分 通过树链剖分查找,判断一下路径上,最后一个黑点出现在哪一条链上,然后在链上进行二分 dfn 查找第一个黑点所在位置 #include <iostream> #include <cstdio> #include <vector> #in
阅读全文
摘要:Query on a tree II 倍增 LCA 或 树链剖分 找路径上第 k 个结点 先找到 LCA,然后再根据深度判断第几个结点 #include <iostream> #include <vector> #include <cstdio> #include <algorithm> using
阅读全文
摘要:Aladdin and the Return Journey 树链剖分模板题 结点单点修改 #include <iostream> #include <cstdio> #include <algorithm> #include <vector> using namespace std; const
阅读全文
摘要:Tree 树链剖分 树的路径边权最大值询问,其中还能使一整条路径上的值取反(正负数) 线段树维护最大值和最小值就能做到取反的时候交换,再加多一个懒标记维护一下 码量很大,但是感觉挺重复的,线段树太久没写各种崩,中途还跑去聚餐,结果回来更是崩 #include <iostream> #include
阅读全文
摘要:Housewife Wind 树链剖分 利用树中每个点都只有一个父节点的性质,将边权化为点权,然后树链剖分 LCA,套一个线段树维护权值 注意在同一链的时候,LCA 的点权是不计算在内的 这题卡时间卡的很紧,如果 TLE,尝试改成 scanf printf #include <iostream> #
阅读全文
摘要:Main Street 模拟 基本的思路就是,点到点的最短路径只能是两种方式: 直接走,不走通道 走通道 走通道的做法就考虑必经点,即起点对 4 个方向各发出一条射线,与会最近的通道分别产生 个交点,走通道的最短路必然会经过这四个点的其中一个 同理,终点也能产生四个必经点 走通道的最短路,必
阅读全文
摘要:Packing Potatoes 二分 + 循环 无限多的物品,模拟是不现实的,考虑从 种物品下手 在第 种物品中,我们可以计算,装满盒子之后需要连续放多少个物品,而且还能知道装完之后是在哪种物品停下来 因此我们考虑建立一条有向边, 代表如果当前盒子第一个放入的是第
阅读全文
摘要:Trophy 贪心 打游戏的时候都知道,解锁前置关卡,直到打到收益最高的关卡就一直刷副本 因此答案肯定是解锁完前置关卡就不断刷,找到最小值就行 巨大坑:初始值一定要很大很大(不会有人因此 wa 了 3 发吧) #include <iostream> #include <cstdio> #includ
阅读全文
摘要:传送门 这场打的有一种我又行了的感觉 A - When? 向下取整 + 取余 #include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <string> #include <queue>
阅读全文
摘要:Aragorn's Story 树链剖分模板 维护两个点之间路径的值,剖分之后用线段树 区间修改 单点查询 注意初始化(不会有人没初始化边,然后 MLE 了半个小时吧) (为什么是 MLE 而不是 RE!!小编也不太清楚,小编也很想知道,[狗头]) #include <iostream> #incl
阅读全文
摘要:【模板】最近公共祖先(LCA) 倍增 lca 模板 真心觉得二进制太奇妙了 #include <iostream> #include <cstdio> #include <algorithm> #include <vector> using namespace std; #define endl '
阅读全文
摘要:Jumping Takahashi 2 dijkstra 或 Floyd 或 二分 dijkstra 枚举从每个点出发到所有点的最大代价的最小值 同理,Floyd 跑完之后再找这个最小值 二分答案,通过 bfs 判断是否有个点能跑遍历所有的点 #include <iostream> #include
阅读全文
摘要:Teleporter Setting bfs 先构建一个 0 号虚拟点,最后再遍历这个点是其他的点 答案有两种来源: 本身从 1 直接到达 n(可经过 0 号虚拟点) 经过 0 号虚拟点和当前假设的点 i 之间的代价为 0 的特殊边 对于第一种情况,只用计算最短路即可 对于第二种情况,则为 min(
阅读全文
摘要:传送门 vp 了一场之前的 ABC,不知道是水平下降还是真的难,就很多要想很久,寄了 A - A to Z String 2 向下取整考虑一下是在哪个组就好 #include <iostream> using namespace std; int main() { int n, x; cin >>
阅读全文
摘要:Fixed Point Guessing 二分 考虑利用奇偶性 如果在一个区间 内,若有一组数交换后,有一个数字在该区间,则说明另一个数也在该区间里 因此考虑对询问后给出的被交换数字 进行检查,如果 ,则说明有两个数在这个区间内,cnt +=
阅读全文
摘要:传送门 考试周也快结束了,想打一场 cf 找一找手感,结果惨不忍睹,大寄 刚好这场前 4 题都是思维题,直接卡死 A - XOR Mixup 这样构造出来的数组异或和一定为 0,说明每一个数都是答案 #include <iostream> #include <cstdio> #include <al
阅读全文