摘要:
涉及知识点:单源最短路。 解题思路 利用拆分的思想。 定义 \(dis_{0, i}\) 代表从 \(s\) 到 \(i\) 的最短路,\(dis_{1, i}\) 代表从 \(t\) 到 \(i\) 的最短路。 如果 \(s\) 到 \(t\) 的最短路已经 \(\le k\) 了,所以无论怎么添 阅读全文
摘要:
涉及知识点:堆 解题思路 利用堆来维护每个能力的最大值。 如果当前的最大值都不属于同一只海狸,就输出。 否则把当重复的元素弹出堆。 如果堆空了还没有找到,说明没有,输出无解。 代码 #include <bits/stdc++.h> #define int long long #define ll _ 阅读全文
摘要:
涉及知识点:构造。 解题思路 题目要求 \(a\) 的长度要最长,所以需要 \(a_1\sim a_i\) 和 \(a_i \sim a_{|a|}\) 最长,于是直接构造一个单调递增和单调递减的序列即可。 由于数据较小,可利用桶通过此题。 注意: \(a_1\sim a_{i-1}\) 与 \(a 阅读全文
摘要:
涉及知识点:字符串,set。 解题思路 首先,如果序列的长度为奇数,是一定不能做到的,所以 \(q\) 个询问直接输出 NO。 如果 \(i\) 为奇数且 \(s_i\) 为 \()\),则将 \(i\) 插入数据结构中。 同理,如果 \(i\) 为偶数且 \(s_i\) 为 \((\),则将 \( 阅读全文
摘要:
解题思路 暴力的方法非常显然意见,可以尝试去优化暴力算法。 由题意可知,将 \(a\) 数组去重是对最终答案没有影响的,所以可以现将 \(a\) 数组去重。 如果数组 \(a\) 去重后就满足了题目的要求,即 \(a\) 数组里的元素个数 \(\le 3\),直接输出从 \(1\) 到 \(a\) 阅读全文
摘要:
涉及知识点:set。 解题思路 为什么要用 set 呢?因为 set 可以去重! 令 \(s1\) 与 \(s2\) 均为 set。 \(|a \cap b|\) 相当于把 \(a\) 数组和 \(b\) 数组的元素放进 \(s1\) 里的长度。 \(|a \cup b|\) 相当于把 \(a\) 阅读全文
摘要:
涉及知识点:字符串处理。 解题思路 记录每个字符出现的第 \(1\) 个位置和最后 \(1\) 个位置,询问时比较大小即可。 代码 #include <bits/stdc++.h> //#define int long long #define ll __int128 #define db doub 阅读全文
摘要:
涉及知识点:动态规划。 解题思路 由于题目要求求方案数,所以考虑动态规划。 定义 \(dp_{i,j}\) 表示 \(i\) 个数,最后一个数为 \(j\) 的方案数。 可以得到转移方程: \[dp_{i, j}=\sum_{k=0}^{2}dp_{i-1,k}\times (|k - j|\le1 阅读全文
摘要:
涉及知识点:图的遍历。 我们观察样例可以发现,染色之后的图是一颗树,而且还是 dfs 树。 题目要求所以路径上的颜色都是交替的,所以直接交替染色即可。 注意:建图的时候需要记录当前边的编号。 代码 #include <bits/stdc++.h> #define int long long #def 阅读全文
摘要:
涉及知识点:set。 解题思路 每次让列表中最大的元素缩小两倍,保证答案最优。 如果当前的元素缩小成 \(0\) 就直接跳出循环,输出这个序列。 由于序列需要支持插入、删除以及找最大值,所以这个序列可以用 set 来维护。 代码 #include <bits/stdc++.h> #define in 阅读全文