我为啥做不出题??
收录一些我做不出来的题目。
CF1136E
这几把什么题目??
有取 \(\max\) 还有神秘 \(+k_i\) 看起来很难做啊,想了半个小时完全没思路。
你发现思维的卡点在于,你完全无法维护一个任意的向前取 \(\max\) 状物。这个时候我们需要一个具有单调性的东西。
令 \(b_i = a_i - \sum\limits_{j=1}^{i-1} k_j\),我们又有 \(a_{i-1} + k_{i-1} \le a_i\),代入:\(b_{i-1} + \sum\limits_{j=1}^{i-1} k_j \le b_i + \sum \limits_{j=1}^{i-1} k_j\),得到 \(b_{i-1} \le b_i\)。
因此我们使用区间覆盖区间求和的线段树维护 \(b\),再维护 \(k\) 的二次前缀和即可。
晚上询问了 tml,他给出了一个另类做法:
在差分数组上考虑,我们维护那些 \(a_i - a_{i-1} = k_{i-1}\) 的连续段,不难发现一次单点修改仅仅会破坏 \(O(1)\) 个连续段,修改每次往后暴力跳连续段,若不合法就退出,否则合并两个连续段。均摊下来,合并操作是 \(O(n+m)\) 的。使用线段树维护区间和,复杂度单 \(\log\)。
CF1784C
为啥会做不出来??
考虑全局一个看起来很好维护的做法:进行扫描线,每次选取一个扫描线后面的最小的元素,取出并移动到当前位置。答案即为移动长度之和。
但是想到这我直接爆掉了。看了题解发现可以倒着做,这样变成删数。把所有做全局时候取出的数扔到一个集合里面,这样影响会非常具象:
-
如果这个数不在集合中,显然没有影响。
-
如果还有比大于等于它的数,则删这个数那次替换为这个数即可。
-
否则可以直接删掉最后有效的一次扫描线。
维护只需要一个 multiset 即可。
CF1093F
看了 dp 状态之后才做出来的。
状态设计是 \(f_{i,j}\) 表示考虑前缀 \(i\),\(a_i=j\) 的方案数。如果你确信这个状态是对的,那就很好做了。
转移钦定填入的是一个极长的连续段,枚举这个连续段的左端点可以得到转移 \(f_{i,j}=\sum\limits_{p} [[p,i] \text{is valid}] \sum\limits_{1 \le l \le k \land l \neq j} f_{p-1,l}\)。时间复杂度 \(O(n^2k)\)。
优化很显然,预处理出 \(l_{i,j}\) 表示 \(a_i=j\) 时最左的合法左端点,再前缀和优化即可,时间复杂度 \(O(nk)\)。
CF2006D
自己做完了一半,没能想出转化。
首先有结论,最优策略一定是轮流放没放过的最大和最小。证明考虑归纳,\(n \le 2\) 显然成立,如果最大值在中间则可以 swap 最大值为结尾的前缀,如果最小值不在第二个则可以交换它和第二个数,均能更优,于是得证。
然后考虑点修会怎么修,显然应该把最大的那个数改成 \(1\)。
然后是一个比较神秘的转化,考虑一个 \(x\) 的数旁边只能摆 \(\le \dfrac{k}{x}\) 的数,因此 \(\le x\) 的数的数量必须要大于 \(\ge \dfrac{k}{x}\) 的数的数量。每次操作会使得差距缩小 \(2\),因此答案是它们的数量之差除以 \(2\) 上取整。注意特殊处理数量分别为 \(\lfloor \dfrac{n}{2} \rfloor\) 和 \(\lceil \dfrac{n}{2} \rceil\) 的情况,只需要给出现次数对 \(\lfloor \dfrac{n}{2} \rfloor\) 取 \(\min\) 即可。
莫队维护区间数字出现次数,复杂度 \(O(n+m(\sqrt k + \sqrt n))\)。
CF1556F
比较牛逼的计数。
首先将期望转化为计算每个人赢的概率之和。令 dp 状态 \(f_{i,S}\) 代表 \(i\) 赢了 \(S\) 内所有人的概率,要求 \(i \not \in S\)。
发现直接转移会算重,于是考虑容斥,计算 \(i\) 没有赢过 \(S\) 中所有人的概率 \(P\),则 \(f_{i,S}=1-P\)。枚举 \(i\) 赢过的集合 \(T \subseteq S\),令 \(g_{A,B}(A \cap B = \varnothing)\) 表示 \(B\) 中的每一个人都直接赢过 \(A\) 中的每一个人的概率,即 \(\prod\limits_{x \in A} \prod\limits_{y \in B} \dfrac{a_y}{a_x+a_y}\)。可以做到 \(O(n2^n)\) 预处理 \(O(n)\) 查询,那么转移是 \(O(n^23^n)\) 的,可以通过。
CF1566F
首先考虑两个区间 \([l_1,r_1]\) 和 \([l_2,r_2]\),若满足 \(l_1 \le l_2 \le r_2 \le r_1\),则若一个点进入了 \([l_2,r_2]\) 必定会进入 \([l_1,r_1]\),因此可以将 \([l_1,r_1]\) 扔掉。
而且如果一个区间初始已经有一个点在其中,则这个区间也是没用的。
然后现在区间和点的形态是,一段点、一段左右端点均递增的区间、一段点、一段区间、……、一段点。
考虑一定有一种最优方案使得点的运动轨迹是不交的,考虑如下调整:

可以使得其不交。
这个性质的意思是说,每个点所贡献的区间在排序后一定是一个连续段,而且最左不超过上一个点,最右不超过下一个点。假设这个连续段最左区间右端点为 \(L\),最右区间左端点为 \(R\),当前点的位置为 \(x\),则你有两种决策:
-
先走到 \(L\),再走到 \(R\),代价为 \((x-L)+(R-L)\)。
-
先走到 \(R\),再走到 \(L\),代价为 \((R-x)+(R-L)\)。
考虑 dp。令 \(f_{i,j}\) 表示前 \(i\) 个点覆盖前 \(j\) 个线段的最小代价……吗?你发现这样是 \(O(n^3)\) 的,而且也没有用上上述性质。考虑性质,枚举上一个点向右贡献到了哪个区间,则能够确定当前点需要向左走到哪从而快速确定状态,于是你只需要记录上一个点的决策来算代价即可。
即:令 \(f_{i,0/1}\) 代表考虑完前 \(i\) 个点,第 \(i\) 个点选择了第一或第二种决策的最小代价。
考虑转移。如下图:

我们在 \(f_{i,0/1}\) 处考虑点在 \([a_{i-1},a_i]\) 内移动的代价,那么假设我们枚举的区间是 \(j\)(即图中绿色箭头),则左边的点往左就需要 \(l_j-a_{i-1}\) 的代价(图中的黑色箭头);否则需要 \(2(l_j-a_{i-1})\) 的代价(图中的红色箭头)。右边的点同理。
所以我们有如下转移:
时间复杂度在排序,复杂度 \(O(n \log n)\)。注意边界情况。
CF1815D
这种题目还是可以多考虑一下比较特殊的构造方式,然后可以多尝试按位考虑。
对于 \(m=1\) 显然答案为 \(n\)。
对于 \(m \ge 3\),可以构造 \([x,\dfrac{n-x}{2},\dfrac{n-x}{2},0,\dots,0]\),其中 \(n,x\) 奇偶性相同。那么这样能否取到所有可构造的数呢?
答案是可以,考虑加法奇偶性与异或相同,因此结果只可能与 \(n\) 奇偶性相同。所以这部分可以 \(O(1)\) 计算。
对于 \(m=2\),我们考虑令 \(f(n)\) 代表原问题答案,\(g(n)\) 代表有多少种可能的异或值。
考虑对 \(n\) 的奇偶性分讨,若 \(n\) 是奇数,则最后分出来的两个数 \(x,y\) 必定一奇一偶。不妨令 \(x\) 是奇数,那么 \(x \oplus y\) = \(2(\dfrac{x-1}{2} \oplus \dfrac{y}{2})+1\)。因此 \(f(n)=2f(\dfrac{n-1}{2})+g(\dfrac{n-1}{2})\)。
否则 \(x,y\) 是同奇偶的,若同为偶数则答案为 \(2(\dfrac{x}{2} \oplus \dfrac{y}{2})\),否则为 \(2[(\dfrac{x}{2}-1) \oplus (\dfrac{y}{2}-1)]\)。因此 \(f(n)=2(f(\dfrac{n}{2})+f(\dfrac{n}{2}-1))\)。
同理考虑 \(g(n)\),可以得到若 \(n\) 为奇数则 \(g(n)=g(\dfrac{n-1}{2})\);否则 \(g(n)=g(\dfrac{n}{2})+g(\dfrac{n}{2}-1)\)。
复杂度 \(O(\log n)\)。

浙公网安备 33010602011771号