随笔分类 - 题解
摘要:传送门 解题思路 m:菜数 n:原料数 当 m=n-1 时:最小的跟最大的两两结合。 当 m>=n 时:最大的单独做,最后就变成了 m=n-1 的情况。 当 m=n-2 时:将每个物品减去k后做01可行性背包,可以使用 bitset 优化。 具体证明可以看这里:题解 P6775 【[NOI2020]
阅读全文
摘要:推荐博客:扶苏的bitset浅谈 笔记: 定义时可以赋值 bitset<10> b(8);bitset<1005> b(string("01010101")) 会分别存储为0000001000、0001010101 函数 b.to_ulong() 和 b.to_ullong() 会把b里面的数转化为
阅读全文
摘要:传送门 解题思路 今晚csp报名网站炸了QAQ,发布新闻者禁三警告 先考虑暴力dp: O(na)的想必大家都会,但一遍都做不下来。 所以需要换一种dp。 假设求序列[l……r]的答案。 先将其排序,假设到第i-1位时能表示出来的范围为[1..x],则只要判断第i位是否大于x+1即可。 若小于x+1,
阅读全文
摘要:传送门 解题思路 线段树维护区间最长连续0的长度。 板子。 AC代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include
阅读全文
摘要:传送门 解题思路 被细节卡了一上午wwww 很好地一道题,考察了AC自动机的本质。 先考虑如何暴力做:枚举y中的每一位,并不断跳fail,若跳到了x,则ans++。 如何优化这个过程呢? 先离线根据y从小到大排序。 当我们以0为根节点,fail[now]向now连边时,AC自动机就变成了一颗树。这时
阅读全文
摘要:传送门 解题思路 对于这种求次短路的题,很常见的套路是先求出以起点和终点作为源点到其他各点的单源最短路,然后枚举每一条边,可以发现次短路一定是重复经过某一条边或者走了这条不在最短路中的边。分类讨论即可。 注意本题中有重边和自环,且计算度时,重边算一次,自环也算。 AC代码 #include<iost
阅读全文
摘要:传送门 解题思路 设dp[i]为先i位能否被理解。 然后在AC自动机上匹配,若 num[j]&&dp[i-cnt[j]] 则 dp[i] 等于 1。(j为不断fail的指针) AC代码 #include<iostream> #include<cstdio> #include<cstring> #in
阅读全文
摘要:传送门 解题思路 先对所有的string跑一遍AC自动机。 用sum表示到达一个节点的收益,可以在求fail时顺便继承着fail节点的sum值。 然后在这个AC自动机上做dp即可。 设dp[i][j]为第i步走到AC自动机上的j号节点的最大分数,枚举转移到的点数转移即可。 AC代码 #include
阅读全文
摘要:传送门 解题思路 来pyyz过掉的第一题祭 一开始在前来个模板上改了改,发现T飞了。 看一下题解发现,因为标记不会清空,所以会被卡到O(ST)。 于是考虑优化。 因为AC自动机本质上是一个有向无环图,所以考虑每次更新答案时只更新到当前节点,最后拓扑排序遍历一遍图统计答案即可。 复杂度降到了O(S+T
阅读全文
摘要:传送门(简单版) 传送门(加强版) AC自动机 推荐阅读:洛谷日报 讲的真的很好。 我没法再说的更好了。 甚至我的板子都是照着他的敲的。 加强版 说是加强版,实际上只需更改一下num数组表示的含义:从当前点有几个模式串结尾,改成以当前点结尾的模式串的编号。 在查询过程中也不需要清空num标记。 注意
阅读全文
摘要:传送门 解题思路 看出是区间dp,但是就是不会设计状态,不会写状态转移方程/kk/kk 设dp[i][j][k]表示区间i到j加上左面连续k个a[i]的答案。 最后答案即为dp[1][n][0]。 状态转移分为两种情况: 让前k个和第i位连起来处理:dp[i+1][j][0]+w[k+1] 枚举断点
阅读全文
摘要:传送门 解题思路 观察到n非常小,所以考虑状压dp。 问题在于如何确定一个没有后效性的状态/状态转移方程。 设dp[i][j]表示当前已经选择了的行的集合为i(一个二进制数),上一个选择的行是第j行的不考虑首行和末行的答案。 首先转移可以通过提前预处理两行之间的代价优化到O(1)。而首行的选择实际上
阅读全文
摘要:传送门 解题思路 先将u和v二进制拆分,然后从低位向高位考虑。 然后就是大力分类讨论: 当某一位u是1且v是1时,要求这一位有奇数个1且前面有偶数个进位 当某一位u是1且v是0时,要求这一位有奇数个1且前面有奇数个进位 当某一位u是0且v是1时,要求这一位有偶数个1且前面有奇数个进位 当某一位u是0
阅读全文
摘要:传送门 解题思路 先不考虑砝码质量相等的情况,设dp[i][j][k]表示前i个砝码选j个组成重量为k的方案数。 最后判断是否合法就从判断方案数是否为1,变成了是否等于C(cnt,i)。(cnt为某个数字的数量,i表示选取的数量)。 可以滚动掉一维数组。 最后一定要记得特判数字类型只有一种或两种的情
阅读全文
摘要:简单版传送门 困难版传送门 解题思路 单调队列优化dp板子题。 但是要注意一开始把dp数组初始化成极小值。 AC代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #
阅读全文
摘要:传送门 解题思路 一开始想到的是类似0/1分数规划的方法进行二分。 后来发现答案可以贪心解决。 我们可以发现最后的答案一定是由若干权值和相同的集合组成的,因为若其中一个集合的点权和较大,则将其单独拿出来显然更优。 所以可以先dfs一遍用树形dp求出最大的集合的大小ans,再dfs一遍,若扫到某个集合
阅读全文
摘要:传送门 解题思路 观察到一个点的点权最多有8个质因数,所以可以存下来进行dp。 设dp[u][i]表示以u为根的子树中的点到u的gcd为u的第i个质因数的倍数的最大距离。 是不是有点绕。多读几遍。我再加个括号。 设dp[u][i]表示 (以u为根的子树中的点) (到u的gcd为u的第i个质因数的倍数
阅读全文
摘要:传送门 解题思路 树形dp。 用dp[i]表示i的子树中的节点到i节点的最大收益。 Q:如何保证路径上任意时刻的收益非负? A:其实不需要管。因为若某一时刻收益为负,则不会去走,而是从零开始。 AC代码 #include<iostream> #include<cstdio> #include<cst
阅读全文
摘要:传送门 解题思路 哈夫曼树(Huffman Tree),就是一棵树满足叶子节点的权值*到根节点的距离的和最小的树。 一开始假设整个图没有任何连边。 然后贪心思想,每次新建一个节点,取k个权值最小的节点作为这个节点的儿子(相当于把节点合并)。 这样每次少k-1个节点,会导致最后一次合并不满k个节点。
阅读全文
摘要:传送门 解题思路 一直往扫描线方面想,结果自己没想出来,还是运用的不够灵活。 其实很简单,对于查询区间[l,r],答案为左端点小于等于r的区间数-右端点小于l的区间数。 维护两个树状数组即可。 AC代码 #include<cstdio> #include<iostream> #include<cst
阅读全文

浙公网安备 33010602011771号