Loading

08 2022 档案

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