CSP 考前啥也不会开始睡觉笔记

zroi 2992

link

根据 \(\in[1,n]\)\(\in[n+1,2n]\) 对数进行分类。不难观察到取的数就是一段递增的小数+一段递减的大数+……,对这个进行 dp。注意我们并不关心哪些数被取走,因为从某类数中随便取出一个子序列都是合法的。\(dp_{i,j,0/1}\) 代表取了 \(i\) 个小数,\(j\) 个大数,最后一段是什么的方案数,转移是容易的,枚举下一段取多少数即可。统计答案就是考虑最后一个合法的局面是什么,枚举一个长度进行统计答案。

代码

zroi 2991

link

考虑 dp,\(dp_{i,j}\) 代表 \(i\) 所在的连通块异或和为 \(j\)子树中除了根所在连通块的最大贡献

转移考虑每条边断不断,做一个子树合并的转移。dp 过程中还需要记录子树 \(\max\limits_{0\le j\le 3}(dp_{i,j})\),注意这种情况需要判断子树的根是否是一个孤立点,此时子树所在连通块异或和为 \(0\)

答案显然是 \(2^a3^b\) 的形式,取 \(\log\) 后即可进行比较。

代码

zroi 2995

link

这种题真是一点都不会做。

首先不难区分有无解的点。然后考虑倒序遍历值域,判断某点答案是否可以不超过 \(x\)

当该点所有出边的 \(t\) 都大于 \(x\) 时显然不可以。对于一条 \(u\rightarrow v\) 的边,若 \(v\) 的答案已经确定,那么 \(u\)\(x<ans_v-p\) 的情况下也是不行的,但这只是对于一条边而言,准确地说是对于所有出边终点答案已经确定的边。对于不确定的点,我们先不管。当在 \(x\) 这轮判断时出现一个新点答案被确定,那么重新做一遍这轮判断。

考虑对于所有出边终点答案没有确定的边,当 \(p>0\) 时显然是对的,因为那些点的答案可以为 \(x+1\)。考虑若上述判断流程错误说明出边终点的答案为 \(x\),接着考虑这个 \(x\) 是从何而来,除了 \(t\) 的贡献外必然是它的某一个出边终点,归纳不难证明。

但是扫描值域会获得 \(0\) 分,优化这个过程。对于每一条边显然会有一个限制,考虑根据限制从大到小删除边。一个点被删光了就代表它的答案已经确定,同时会造成它的入边的限制更改,这样的更改只会有 \(O(m)\) 次,拿堆维护一下就能做到 \(O(m\log m)\)

代码

qbxt 4406

link

首先倒水操作一定是若干次向右倒+一次向左倒,设 \(x\) 中有 \(b_x\) 的水,如果 \(x\) 将水倒入左边的 \(y\),则会倒入 \(\min(b_x,a_y)\)。证明考虑倒水操作实际上就是一条链。

设计 dp:\(dp_{i,j}\) 代表考虑到 \(i\) 时有 \(j\) 的水的概率(强制此时没有向左倒的操作)。向前转移直接加入答案:\(ans_k=ans_k+\min(b_x,a_y)\times dp_{i,j}\times\dfrac{1}{n-1}\)。向后转移:\(dp_{k,\min(a_k,j)}=dp_{k,\min(a_k,j)}+dp_{i,j}\times\dfrac{1}{n-1}\)。注意向前向后转移的时候如果有剩余还需要更新 \(ans_i\)

\(O(n^3)\) dp 的代码

后面就是一些比较板的优化了,主要难点在于 dp。

CF1906F

数据结构低手。

询问等价于把 \(S\sim T\) 中所有和 \(A_k\) 有关的询问拉出来做最大子段和。扫描每个 \(A_k\),所有与其有关的询问保留真实的 \(x_i\),其余的 \(x_i\) 置为 \(0\),回答询问即可。

posted @ 2024-10-21 21:27  BYR_KKK  阅读(34)  评论(0编辑  收藏  举报