随笔分类 -  题目来源-OI赛事真题

摘要:从 i 向 b[i] + 1 连边,得到一棵树。考虑分层,问题转化为构造一个数组,使得每个节点的值小于父亲的值,但大于父亲同一层左边节点的值。在 dfs 离开一个节点时记录的 dfs 序就满足这个要求。 阅读全文
posted @ 2022-03-17 21:18 duyiblue 阅读(141) 评论(0) 推荐(0) 编辑
摘要:把所有位置按下标的奇偶性分类。考虑每个前缀里,两类位置上数的和之差。把对 h 的操作,变为对这个差序列的操作。操作变成了每次选一个小于 n 的位置,将它的值减 1。只要想清楚最终差序列的样子,就很容易求出合法差序列的数量了。 阅读全文
posted @ 2022-03-16 22:33 duyiblue 阅读(261) 评论(0) 推荐(1) 编辑
摘要:分析题目性质,找出一些最基本的贪心策略(比如把 B 从小到大排序)。然后枚举总共获得了几个协作者,这样就能知道每个仅获得选票的州的用时,进而可以 DP。朴素的 DP 是 O(N^3) 的,总时间复杂度 O(N^4)。进一步观察问题特性后,可以把 DP 优化到 O(n^2)。 阅读全文
posted @ 2022-02-26 16:56 duyiblue 阅读(505) 评论(2) 推荐(3) 编辑
摘要:lcp 就是后缀树上的 lca。因为字符串随机,所以后缀树树高是 O(log n) 级别的。将询问离线,从小到大枚举 R,暴力跳祖先,更新一些 i 的答案。需要数据结构支持:前缀对一个值取 max,区间求和。发现要取 max 的值是 O(log n) 级别的,对每个值记录最大位置,就可以实现 O(1) 修改,O(log n) 查询。总时间复杂度 O(n log n)。 阅读全文
posted @ 2021-04-07 15:55 duyiblue 阅读(285) 评论(0) 推荐(1) 编辑
摘要:分 b > d 和 b <= d 两种情况讨论。关于 b, d 做 cdq 分治。每次考虑右边对左边的贡献,这样 b, d 的大小关系就解决了。第一种情况比较简单,就是在可持久化 01 trie 里查询一下就行了第二种可以考虑每个 b 对 d 的贡献,方法就和第一种情况差不多了,也就是把“查询”改成“打标记”。 阅读全文
posted @ 2021-03-27 15:17 duyiblue 阅读(2792) 评论(9) 推荐(8) 编辑
摘要:发现问题等价于:第一步可以到达右边任何一个点,且有推论:此后再也不需要向右走。我们特判第一步。然后问题转化为:求 x 及其右边所有点到 y 的距离的最小值。可以倍增。 阅读全文
posted @ 2021-03-08 11:44 duyiblue 阅读(141) 评论(2) 推荐(0) 编辑
摘要:考虑最大前缀和所在的位置,需要满足什么条件。根据这个条件,可以得到一个状压 DP 的做法 阅读全文
posted @ 2021-03-07 17:32 duyiblue 阅读(193) 评论(0) 推荐(0) 编辑
摘要:初步转化:不管死了多少个猎人,我们开枪时仍然在 n 个猎人里进行选择,如果选到了已经死去的猎人,就假装无事发生,再选一次,直到某次选中了活着的猎人为止。之后使用容斥,考虑哪些人死的时间晚于 1,写出式子后,发现可以用分治 NTT 计算。 阅读全文
posted @ 2021-03-06 21:48 duyiblue 阅读(195) 评论(0) 推荐(0) 编辑
摘要:枚举 r。注意到关键性质:位置 r 必被选出。顺着这个思路,看哪些点是能被 r 看见的。进一步发现大区间可以直接从小区间转移过来。于是可以自然地得到一个 DP 做法 阅读全文
posted @ 2021-03-04 12:57 duyiblue 阅读(132) 评论(1) 推荐(0) 编辑
摘要:首先转化为算每种完美匹配出现的概率之和。发现难点是处理 t = 1 和 t = 2。将一组的两条边拆开,假装他们就是 t = 0 的两组。考虑这样算会对答案有什么影响。t = 1 时,会在两条边同时出现在完美匹配里时,把概率少算 1/4。我们新建一种转移,把这 1/4 补回来即可。t = 2 同理。 阅读全文
posted @ 2021-03-01 17:25 duyiblue 阅读(516) 评论(3) 推荐(2) 编辑
摘要:m=n-1时一定有解,策略是取最小的和最大的原材料拼成一道菜,然后转化为m,n分别小1的子问题递归下去。m>=n时,可以先取最大的原材料,直到m=n-1。m=n-2时,用DP将所有原材料,划分成两个m=n-1的集合。DP的状态设计比较巧妙,同时需要用到bitset优化 阅读全文
posted @ 2020-08-26 11:31 duyiblue 阅读(304) 评论(0) 推荐(0) 编辑
摘要:先做一个二维DP:dp[u][i]表示点u的祖先边中离它最近的,颜色为1的边,深度为i,此时节点u子树内的边的染色方案数。然后把第二维搬到线段树上,做线段树合并 阅读全文
posted @ 2020-08-25 00:12 duyiblue 阅读(646) 评论(0) 推荐(1) 编辑
摘要:朴素DP,设dp[i][u]表示第i个时刻在第u个点,总共得到的最大愉悦值。用矩阵快速幂优化,需要重新定义一种max运算的矩阵乘法,它也具有结合律。拆边可以完成转移。改成拆点可以进一步优化复杂度。我们要对k个美食节间的每一段时间单独做一次快速幂,太慢了。发现转移矩阵是一样的,可以预处理转移矩阵的2^x幂,就变成log T次向量乘矩阵的乘法。时间复杂度O((5n)^3 log T + k*(5n)^2 log T) 阅读全文
posted @ 2020-08-21 21:33 duyiblue 阅读(408) 评论(4) 推荐(1) 编辑
摘要:对每个i,预处理以i结尾的AA数量f[i],以i开头的BB数量g[i],答案就是Σf[i]*g[i+1]。朴素地求f,g,时间复杂度是O(n^2)的。考虑枚举A的长度len,把是len倍数的位置标位关键点,则每个AA必定跨过恰好2个关键点。枚举每一组关键点,可以O(1)统计出跨过它们的AA。关键点数量是调和级数。所以总复杂度O(n log n)。 阅读全文
posted @ 2020-07-18 17:45 duyiblue 阅读(266) 评论(0) 推荐(1) 编辑
摘要:因为border的border还是border,所以一个串的最小border,也必须是无界单词。设dp[i]表示长度为i的无界单词数量,转移时,枚举最小border的长度(长度一定不超过floor(i/2))j,dp[i]可以从dp[j]转移过来。对第二问,可以逐位确定,每次对后面还未确定的位,做类似的DP。 阅读全文
posted @ 2020-07-05 20:48 duyiblue 阅读(287) 评论(0) 推荐(0) 编辑
摘要:假设这n个数,最终就是从大到小严格降序的。可以做状压DP:对相邻两个数的大小关系(小于还是等于)进行状压。转移时枚举这个n个数下一个二进制位上分别是什么。发现S的这k次重复,每次的转移都是一样的。可以把转移预处理出来,然后做矩阵快速幂。 阅读全文
posted @ 2020-07-02 21:22 duyiblue 阅读(445) 评论(0) 推荐(2) 编辑
摘要:状压DP,设dp[s]表示考虑了前|s|个位置,填了s里的这些数。转移时枚举下一个位置上的数i,考虑它和前面的数、后面的数,分别会产生哪些代价。时间复杂度O(2^mm^2)。发现对(s,i),这个代价可以通过递推,预处理出来,时间复杂度降为O(2^m*m)。但是预处理一个这样的数组,空间复杂度O(2^m*m),无法承受。可以按集合大小,从小到大,一边DP,一边处理代价数组。用滚动数组,或者stl-queue优化空间 阅读全文
posted @ 2020-06-28 10:24 duyiblue 阅读(653) 评论(3) 推荐(1) 编辑
摘要:把f(k)拆开,对每一项单独算。后面的可以用二项式定理,难点在如何消掉k^i。可以每次求导再乘以x,效果等价于让每一项乘以k。这样就把k^i消掉了。还有一种方法是利用组合恒等式,拿组合数去消k,发现系数恰好是第二类斯特林数。当然,还有很多别的方法,例如考虑组合意义 阅读全文
posted @ 2020-06-26 20:06 duyiblue 阅读(431) 评论(2) 推荐(1) 编辑
摘要:发现是求[ice的和]与[fire的和]的较小值的最大值。ice的和,是一个单调不下降的函数,fire的和,是一个单调不上升的函数。两者较小值的最大值,显然在它们相交的地方取到。二分相交的地方。用数据结构分别维护ice和fire,时间复杂度O(nlog^2n)。直接在线段树上二分,复杂度O(nlogn),但是常数较大。用树状数组上倍增的技巧代替线段树上二分,就可以了 阅读全文
posted @ 2020-06-26 19:43 duyiblue 阅读(619) 评论(1) 推荐(1) 编辑
摘要:考虑预处理出s的每个子串是不是t的子串。发现对于一个左端点i,是t子串的右端点是从i开始的一段连续的区间,我们记这样的最大右端点为R[i]。对t建SAM,可以通过在SAM上跳求出R[1...n]。然后对于询问l,r。分r<=R[i]和r>R[i]两类讨论。那么相当于一个二维的区间最大值查询。通过离线去掉一维,另一维用线段树维护即可。 阅读全文
posted @ 2020-06-18 17:46 duyiblue 阅读(425) 评论(1) 推荐(2) 编辑