摘要: 题面:https://www.luogu.com.cn/problem/P4630 先用tarjan把原图建成圆方树 圆点赋值-1,方点赋值环的大小 对于每个点对,方案数为圆方树上的路径权值 然后利用树形dp处理每个点对的贡献 计算子树根节点经过的次数乘以2即可 代码 #include<bits/s 阅读全文
posted @ 2020-11-28 22:14 andyc_03 阅读(88) 评论(0) 推荐(0) 编辑
摘要: N = 2时,棋盘上必须无障碍点,且m为奇数时有解,方案数为1.N = 3时,观察可以发现,中间一行所有的格子一定是必经的,且相邻两个格子为一个单元,同时位于第1行或者第3行。所以每个小单元方案数为2,空棋盘的方案数为2的幂次。障碍点对于答案的影响是,限制这个单元只能选择第1行或者第3行,因此每限制 阅读全文
posted @ 2020-11-28 19:03 andyc_03 阅读(77) 评论(0) 推荐(0) 编辑
摘要: 考虑维护一个类似链式的结构,去维护i位置为起点的一组将到哪里,然后一直跳下去就好 想到这里,自然就会考虑到用倍增去优化 这个倍增的预处理要从n倒着枚举 因为它都是向后跳的,要先把后面的算出来啊!! WA了两发 代码 #include<bits/stdc++.h> using namespace st 阅读全文
posted @ 2020-11-28 18:16 andyc_03 阅读(117) 评论(0) 推荐(0) 编辑
摘要: 如果C>=P 也就是说每次做一张桌子一定能腾空一个工作区域,所以最多能做W/C个 如果C<P 这时候就需要考虑有可能出现工作区域不够的情况了 把所有工作区域铺满需要P*N块木板,而我们一次操作能倒出的空余为P-C 所以数量为(P*N-W)/(P-C) 代码 #include<bits/stdc++. 阅读全文
posted @ 2020-11-28 17:02 andyc_03 阅读(98) 评论(0) 推荐(0) 编辑
摘要: 正常的LCS问题,时间复杂度是O(|A|*|B|) 但是这道题有一个特点:B串的长度很短,小于等于1000 所以可以换一个状态记录:f[i][j]为A串匹配到第i位,最长公共子序列长度为j的最靠左的B串的位置 为了递推这个方程,需要预处理一个nxt[i][j]表示当前B串在i位置,下一个匹配到j的位 阅读全文
posted @ 2020-11-28 15:54 andyc_03 阅读(96) 评论(0) 推荐(0) 编辑
摘要: 这道题目很明显是个概率dp,又观察到N的范围很大,所以就能猜到是利用了矩阵快速幂加速 设计矩阵! 阅读全文
posted @ 2020-11-28 14:01 andyc_03 阅读(90) 评论(0) 推荐(0) 编辑
摘要: 很经典的一道题目,首先我们考虑每一条附加边x-y 会造成的影响 会使得x-y的简单路径上每条边断开的权值都加1 权值的意义:权值为0,它搭配m条附加边的任意一个都可以 权值为1,它只能搭配一个附加边 权值大于1,无论搭配哪个附加边,都无法做到使原图不连通 所以我们利用树上差分,处理每条附加边时,先把 阅读全文
posted @ 2020-11-28 12:59 andyc_03 阅读(164) 评论(0) 推荐(0) 编辑