08 2022 档案

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

点击右上角即可分享
微信分享提示
主题色彩