zoukankan      html  css  js  c++  java
  • CF 2400~2600 泛刷

    明天是 CSP,打板子之余找点题练练手。

    然后 CSP 之后一个月可能会比较轻松,大概就补补模拟赛的样子,所以开了这样一个坑。(效仿 wjz 常刷 CF,思维能力那么强)

    长更,大概等我上 GM 停更吧。


    1055E - Segments on the Line

    这个是我独立做出来的(于是我又有理由说这题黑是恶评了

    一开始看错题目了(洛谷翻译这什么翻译啊,害人不浅啊你们这翻译),以为是说在数轴上的区间覆盖点,然而实际上区间覆盖的是下标。

    如果按看错的题目的话,就排个序,然后答案 (leq x) 当且仅当可以在 (x) 前面用区间覆盖出来至少 (t) 个点,然后对被覆盖的序列 DP,(nm) DP 就完事了。二分的话是平方对数,然后你发现根本不用二分,求一遍 DP 数组就够了,平方?

    然后才发现题目看错了。不过可以补救,在之前做法上魔改一下即可。必须要二分答案 (x),然后把那些 (leq x) 的当作有效点,前缀和一下即可。复杂度平方对数。

    做着 tzc 还问我为啥不用二分,我这题目看错也够搞笑的。

    然后又犯了各种奇怪的错误(sb-mistakes 19~20,19 是题目看错的时候犯的错误),妈蛋老子 CSP 前夜写你 CF 的题,你就是这样打击我信心的?

    1428F - Fruit Sequences

    这个 2400 题算是比较常规的吧。

    我当时是考虑每个连通块的贡献,大概就分为四类:分别以该连通块非前后缀子串、非后缀前缀、非前缀后缀、整串为最长连续 (1) 子串的贡献。第一类拿高斯求和公式和平方和公式稍微推一下即可。

    显然第二类可以往左扩展,第三类可以往右扩展,第四类两边都可。为了去重,我们强行规定往左最长连续长度必须 $leq $ 当前,往右要 (<) 当前。然后第二三四类的数量是线性的,考虑对于每个求一下。然后发现要求的是左边 / 右边最近的 (>/geq) 当前的连通块位置,这个倒过来 BIT 两遍即可。复杂度线性对数,有点难写。

    然后翻题解,发现这个 BIT 可以用一个单调栈优化掉,是一个非常经典的单调栈。然后还有算左端点贡献的,这个只有几行代码。总之非常水就是了,各种角度思考似乎都可以线性(?)

    1389F - Bicolored Segments

    这是个 2600 的题目,而且是个 EDR 的 F。然而我好像想一会儿写一会儿就 A 了,那我打了岂不是阿克了?(个锤子,这场有 7 个题)

    我好像确实比较精通这类常规的 DP 和优化。

    大概就想象一下任意一种合法场面的情况,就是一段黑的搞在一起,一段白的搞在一起,一段黑的,一段白的,等等等等,其中搞在一起不一定要连通。那这样我们就可以对这个搞基序列 DP 了,(dp_{i,0/1}),转移就是枚举最后一片搞基的区间的最左端点,贡献有两个,一个是其之前的 DP 值,一个是其到 (i) 之间一共包含多少个区间,最多是它们在一起搞基了。然后发现这个常规的不得了,对于每个区间等到 (i) 等于它的右端点的时候算一下它的贡献即可,发现贡献位置集合是前缀,于是前缀加一。然后算 DP 值还需要前缀 (max),就线段树维护一波就可以了。

    771D - Bear and Company

    difficulty *2500。

    题解

    1373F - Network Coverage

    hot tea,题解

    1093F - Vasya and Array

    本来想 11 点多了干不了啥了,就随便做个 2400 水题吧。没想到开的第一个题是个 FFT?这年头 FFT 才 2400?亏我想了 30min 还没想出来。

    然后就开了这道题。序列 DP 我最擅长了~

    明天秋游,就 1h,形式主义。我准备带个草稿纸去,正好今天第一次 NOI 班,有题可想(


    讲做法。我们考虑 (dp_{i,j}) 表示考虑到第 (i) 个,最后一个为 (j) 的方案数。转移就枚举最近一个连续段的左端点。显然要满足两个条件,其一是长度 (<len),其二要都是 (j)(-1)。这个左端点显然对于每个 (j) 都是可以一路实时更新的。

    然后不就是个前缀和优化的事了吗?复杂度 (mathrm O(nk))


    btw,为啥是黑啊?奇了怪了,真是个怪事。

    627D - Preorder Test

    tzc 做啥我就做啥.jpg

    翻译翻的像 shit 一样。

    注意到「最小值最大」的字眼,就应该立刻想到二分。二分答案,然后只有权值 (geq) 这个答案的点可以走。然后只需要算是否存在走 (k) 步的方案。

    如何算呢?考虑先确定根,然后 DP。转移就是,如果当前点不可走就是 (0),否则贪心地把整个子树都可以走的儿子给加上,不可的找出最大的那个最后走。然后因为根不固定,所以要二次扫描一遍。

    二次扫描的时候,「加上」显然可以减去,那么取最大值怎么操作呢?最无脑的是维护一个 set,这样总复杂度有 2 只 log;其实只需要维护前两大值即可,总复杂度线性对数。

    1209E2 - Rotate Columns (hard version)

    这题双倍经验

    翻译也是错的,明明是每一行的最大值的和的最大值。


    这是我所看了题解的题(捂脸

    首先有个显然的 (mathrm O(T3^nm)) 的子集枚举状压 DP。到这儿我就不会了。看了题解发现有一个很清新的性质:将列按最大值从大到小排序,那么只能在前 (n) 列里面选。证明很简单:我们贪心考虑一个特殊的选择方案,就是在最大值最大的 (n) 列里面每列选一个最大值。这个显然不是最优解,但是一旦有选择的格子坐落在前 (n) 列以外,那么一定有前 (n) 列中的空列(这是显然的吧),把以外的一个一个放进前 (n) 列的最大值里面一定会变得更优。这样复杂度就是 (mathrm O(T3^nn))

    所以像这种感觉算法没有可优化性的时候,接下来做的事应该是找优秀性质,比如单调性是常见的一种性质,这题也算一个。you know what i was thinking then?我在想这个状压 DP 有没有可能是用一些我不会的比如说子集卷积、高维前缀和之类把 (3^n) 变成 (2^n)(wssb5448

    1348E - Phoenix and Berries

    下午被 809C 搞疯了,之后补吧。先切个 2400 水题爽一下。

    不难想到一种方案:将两种颜色分别尽力搞掉,这样两种颜色剩的个数都会 (<m),加起来就 (<2m),于是答案下界是这种方案的答案,上界就是再加一。我们只需要判断加一能不能做到。

    我们考虑将一种颜色通过同一棵树搞掉一些,使得剩下的个数 (mod m) 是我们想要的。于是我们只需要算有哪些 (xin[0,m)) 可以作为被搞掉的个数 (mod m)。这个 (mathrm O!left(nm^2 ight)) 随便 DP 就好了。


    现在一共有 4 题欠着,太不高兴了/kk

    1257F - Make Them Similar

    上午 tzc 给我布置了这道作业,然后我苦思冥想想了一节语文课想出来了(亏这还只是个 2400,wtcl/kk)。

    这是个挺巧妙的思维题。考虑折半枚举,左右边 (2^{15}) 种,每种处理出 (a_{2sim n}oplus x) 依次与 (a_1oplus x) 的 popcount 的差值的 vector。然后两边的 vector 互补就是个合法情况。考虑用 setvector,这样复杂度是 (mathrm O!left(2^{15}nlog ight)),换成排序 + 二分常数似乎小一点,但还是过不去(我人傻常数大/kk)。于是可以对 vector 哈希把 (log) 去掉。

    1244G - Running in Pairs

    熬到了凌晨/qiang

    开了一堆题不会,自爆了啊,慢慢补啊。只能刷刷水题过日子了。

    注意到最小值到最大值都能取到,慢慢推即可构造方案。着实是水题。

    1065F - Up and Down the Tree

    这是个挺厉害的题,想我了挺长时间呢。(可能是因为昨晚太晚了,脑子不清楚,今早接着想一会儿就会了)

    首先上来一个暴力的思路是:每个叶子所能到达的叶子集合,就是往上走 (m) 步的那个节点的子树内的所有叶子。这显然是个区间。于是我们可以线段树优化建图,然后 SCC 缩点,再 DP 一下求最长链。理论上是可以过的,但是太难写了。

    考虑挖掘一些性质。不难发现往上 (m) 步相同的叶子们显然是在同一个 SCC 里面,我们用树上的节点代表它们。然后一个节点的祖先的子树覆盖了它的子树,于是每个节点指向它的儿子们。那么什么时候节点能够指向祖先呢?显然当且仅当该祖先有往下 (m) 步的叶子在该节点子树内。于是往上连了一条返祖边。这样子就构成了一个环。

    然后环也有可能有很多呀。但是每个点最往上连的那条返祖边才是有用的。于是我们对于每个点都找到这条边,只需要算子树内的所有叶子节点的往上 (m) 步的最浅节点即可,这个只需要 DFS 一遍。然后对于每个环,要做的事是将它们合并,一种方案是在这条链上除了链顶的所有节点都往爸爸合并。然后就树上差分一下算每个节点是否要往爸爸合并。此时已经缩点完毕,然后就 DP 一下就做完了。


    终于把昨晚让我自爆的心头之恨解决掉了,爽(

    1221F - Choose a Square

    感谢 tzc 赠送的水题(

    虽然也交了个几遍,MLE 是啥操作……


    注意到正方形 ((l,l),(r,r)) 包含点 ((x,y)) 当且仅当 (min(x,y)geq l)(max(x,y)leq r)。然后就按照套路,从左往右枚举 (r),维护答案关于 (l) 的序列。具体就是在 (r=max(x,y)) 时加入该节点,加入时前缀加即可。

    809C - Find a car

    难度 *2600 的神仙题,题解

    1028E - Restore Array

    感谢 tzc 再次赠送的水……真的是水题吗?

    首先注意到两个特殊的 (mod) 的情况:

    1. (x<y) 时,(xmod y=x)
    2. (y<x<2y) 时,(xmod y=x-y)

    然后容易想到先用第二种,固定第一个数然后不断地往左加,不难想到固定的数是最大值时恰好一圈回来可以用第一种。然后要分出两种情况:第一种是所有数都相等,那么显然都 (>0) 无解;否则找到最大的数,但是注意到如果往左边一个也是最大数的话,那就 (x=2y) 就不行了,但显然总能找到一个左边不是最大数的最大数。然后这时候还有一个需要注意的点,如果它左边是一段 (0),然后迎来的第一个非零数是最大值,那也会发生 (x=2y) 的情况,但是好处理,只需要在第一个 (0) 处乘以 (2) 即可。

    以后做这种题还是要耐心一点,把特殊情况和边界都想清楚了啊…………


    下面先停更一会儿,要补一些其他题和算法。开了的坑先留在这儿:712E 1392F 1420E 1437F 436E 1198E(网络流) 946G


    1423J - Bubble Cup hypothesis

    题解

    997C - Sky Full of Stars

    题解

    946G - Almost Increasing Array

    whkzb 了,先做个题快乐一下(

    没错这就是我 NOIP 前夜开的最后一道题目。当时我看错题了,以为是要删掉元素,WA 了之后才发现是修改。然后发现需要分析分析就弃了。今天来补一个。

    我们考虑最终改成的那个序列,删掉其中一个成为的严格递增序列,中的没被修改的序列。考虑对这个序列 DP,(dp0_i) 表示考虑到第 (i) 位,前 (i) 位都不能被删除,第 (i) 没被修改且不被删除时候的最多不被修改的元素数量,(dp1_i) 则表示前 (i) 位必须有一个被删除。

    那么转移就是 (dp0_i) 可以转移到 (j) 当且仅当 (a_jleq a_i-i+j)(a_j-jleq a_i-i)(dp1_i) 可以转移到 (dp0)(dp1),后者的条件跟上面一样,前者因为在这一段里面删除了一个,所以 (leq) 右边要 (+1),但是因为删除的那个不算被修改了,所以 (max) 里面的式子里要 (+2)。然后把涉及到的式子的值都离散化,维护三个 BIT 即可。

    为了方便,我们假设 (a_{n+1}=+infty) 然后它必须不变且选。最后答案就用 (n+1) 减一下即可。

  • 相关阅读:
    webapi Action中跳转到指定内容
    命令行添加防火墙入站规则
    nps简单配置(linux环境)
    C# 执行Javascript脚本
    Docker集群管理(Docker Swarm)
    linux简单的部署frp
    QMap只有insert,而没有append
    SqlServer 数据发布与订阅时一个小问题的处理
    Vue 内部指令缩写
    html中ol li和ul li的区别
  • 原文地址:https://www.cnblogs.com/ycx-akioi/p/cf-2400-2600.html
Copyright © 2011-2022 走看看