首页 > 其他分享 >CF1753

CF1753

时间:2023-07-02 20:35:21浏览次数:42  
标签:CF1753 times Delta 考虑 移动 mex 乘法

CF1753

成功因为虚拟机炸了,重新写一遍此文。

都是没有保存的错

A. Make Nonzero Sum

由于 Note that it is not required to minimize the number of segments in the partition.。考虑每一段最小化……

可以发现,每一段都可以划分为长度为 1 或 2 的段。于是考虑影响。

只有长度为 2 的段会改变正负,不妨令 \(C_+, C_-\) 分别表示 1 和 -1 的个数,并假定 1 更多。

不难发现,只需要 \(\frac {|C_+ - C_-|}2\) 个长度为 2 的即可。

如果不是整数,那么直接判不可以即可。

由于有影响,考虑 DP。

设 \(f_i\) 表示考虑前 \(i\) 个数,最多能够放多少个长度为 2 的。

于是有

\[f_i = \max \begin{cases} f_{i - 1} \\ f_{i - 2} + 1 &, a_i = 1 \end{cases} \]

考虑在 DP 变化的地方放置长度为 2 的即可。

B. Factorial Divisibility

当时脑子抽了,用了两种合并的方法。

详见:https://codeforces.com/contest/1753/submission/211561532

但是实际上只需要通过 \(x! = x \times (x -1)!\) 合成即可(2048……

C. Wish I Knew How to Sort

假定有 \(C_0\) 个 \(0\),并且在前 \(C_0\) 个数中有 \(k\) 个 1。

那么考虑此时一个有效的操作,即是在前 \(C_0\) 中选择到了一个 \(1\),在后面中选择了一个 \(0\)。

有效的概率为

\[P_k = \cfrac {k^2}{n \choose 2} \]

于是考虑状态转移,设 \(f_k\) 表示从前 \(C_0\) 个数中有 \(k\) 个 \(1\) 的状态转移到 \(0\) 个 \(1\) 的期望步数。

根据 markov 中的期望线性方程求解的方法,有

\[f_k = 1 + (1 - P_k)f_k + P_k f_{k - 1} \]

稍微魔改一下,就变成了:

\[f_k = \frac {1}{P_k} + f_{k - 1} \]

于是小小递推即可。

然而我当时是反着推的,无所谓,一样的:Submission #211560140 - Codeforces

D. The Beach

转换问题:等价于将两个 . 移动到一起的最小代价。

显然可以发现,一个障碍最多移动一次。

借用大佬的图:

于是我们可以考虑如此建图。跑一个最短路即可。

提交:Submission #211566195 - Codeforces

E. N Machines

非常恶心,虽然不是顶级难度。

最优的策略一定是把乘法向后移,把加法向前移。

思考 It's guaranteed that the current value of the resulting product does not exceed 2x10^9. 的意义。

发现,除去 \(\times 1\),最多只会有 \(\log C\) 个乘法。

于是考虑枚举其子集,为 \(2^{\log C}\)。所以需要优化。

有一个简单而优雅的剪枝:如果两个数相等,那么一定是选择最前面的。

由于 \(12! = 6227020800 \gt 2 \times 10^9\),所以其实最多只会有 \(O(2^{12})\) 种状态。

那么在钦定了向后移动的乘法后,我们需要找到前 \(rest\) 个移动到前面贡献最大的加法。

考虑二分移动到前面的贡献 \(\Delta\),在每一段再二分数量。

考虑如何计算每一个加法的 \(\Delta\) ?考虑加法移动前,其贡献为 \(x \times suf_x\),移动后的贡献为 \(x \times pre_x \times suf_x\)。

其中 \(suf_x\) 和 \(pre_x\) 是指乘法移动后,\(x\) 前面的乘法前缀积和后面的乘法后缀积。

于是 \(\Delta x = x \times (pre_x - 1) \times suf_x\)。

NOTICE

  • 二分 \(\Delta\) 时找到最大的 \(cnt > rest\) 的那个 \(\Delta\),由于多算了 \(cnt- rest\) 个,并且这些数的贡献一定是 \(\Delta\),所以再减去 \((cnt - rest) \times \Delta\) 即可。

  • \(\Delta\) 可能很大很大,所以上界大一点(我用的倍增,所以直接是从 \(2^{60}\) 开始向下……虽然没必要)

提交:Submission #211609810 - Codeforces

F. Minecraft Series

首先固定一个正方形,考虑贡献:将数分为正数与负数,分别计算 \(mex_p\) 与 \(mex_n\)。

正的为 positive,负的为 negative

于是贡献为 \(mex_p + mex_n - 1\)。

由于 \(mex\) 的单调性,发现包括合法正方形的正方形一定合法,所以考虑双指针维护所在最小合法正方形的。

注意,是在每一条对角线上来一发双指针,这样才能保证复杂度。

然后,然后就搞定了。

可以优化的是,\(mex\) 可以利用分块优化复杂度。

于是你可以得到一个复杂度为:

\[O(nm \cdot \min\{n, m\} + n m \sqrt k) \]

的优雅 brute force……

提交:https://codeforces.com/contest/1753/submission/211685792

然而……不断的 TLE 让我怀疑人生,最后发现……

参考:讨论

标签:CF1753,times,Delta,考虑,移动,mex,乘法
From: https://www.cnblogs.com/jeefy/p/17521324.html

相关文章

  • CF1753 题解
    CF1753题解A首先我们发现,我们可以将序列一部分取反,将1变-1,-1变1的操作每次将总和增加2,所以如果初始和的绝对值为奇数则无解。我们发现,一段区间可以拆成若干个长度为2和1的小区间(+-+-+-+-....)变成(+-+-+-...)。我们假设初始都是长度为1的小区间,这时答案等于所有数的总和。我们......
  • CF1753C Wish I Knew How to Sort
    正解:这场我打过,E题没做出来。状态:\(dp_i\)表示前\(x\)个有\(i\)个\(0\),剩余步数的期望,\(x\)为原序列\(0\)的个数。转移:\(dp_i=dp_{i+1}\times\frac{2\cdo......
  • CF1753EF
    E.NMachines题意:有\(n\)个操作\((+/*,a_i)\),有\(S\)块钱,可以花\(a\)把一个\(+\)或\(b\)把\(*\)挪动。求最大值。题解:这个题有两个关键点我没有想到。其一......
  • CF1753B 题解
    \(\mathcalPreface\)题目传送门\(\mathcalSolution\)定理:\(n!\cdot(n+1)=(n+1)!\)这题就是围绕以上定理展开的。如果加入一个数\(a_i\)满足\(\operatornam......
  • CF1753D Beach Sol
    看到这种要先满足某个条件才能满足另一个条件的题目,想到图论。假设当前有一个\(c_{i,j}=\)L,\(c_{i,j+1}=\)R,那么如果要把其右移一格就需要满足\(c_{i,j+2}\)当前空出......
  • CF1753C Wish I Knew How to Sort Sol
    喵喵题。考场上完全想不到。很难想到把序列排序,得出最后的排序结果。同时很难想到,原序列左半边的\(1\)会变成\(0\),右半边的\(0\)会变成\(1\)。很难想到这两部分的......
  • 【CF1753E】N Machines(暴力+二分)
    题目链接给定一个操作序列,包含\((+,a_i),(\times,a_i)\)两种操作。初始\(x=1\),会从左到右依次执行所有操作得到一个终值\(x'\)。共有\(lim\)块钱,可以花\(p1\)......
  • CF1753E N Machines
    题面传送门首先你发现题面里有一个初始答案不大于\(2\times10^9\),这表示最终答案不超过\(4\times10^{18}\),这表明不用写高精,这是好的。但是这仅仅如此吗?可以发现乘\(1......
  • [CF1753C]Wish I Knew How to Sort
    做题时间:2022.10.25\(【题目描述】\)给定一个长度为\(n\)的01序列\(a\)和一种操作,你需要用这种操作将序列从小到大排序。操作为:等概率随机选择两个位置\(i,j(i<j)\)......
  • CF1753A1
    前言题目传送门!更好的阅读体验?提供一种更加好理解的方法。思路关键点:只要凑够就行,不需要区间数量最小。首先,每个数是\(-1\)或\(1\),说明\(n\)为奇数时,必定无解。......