集训阶段反思 · Week2
Just_int_mian · · 个人记录
10.15
还是没拉开分差啊。
本来以为 T4 能做出来的,写了一棵很优雅的线段树,然后测了大样例发现假了。
算了,先按题目顺序看看吧。
T1
简单题。但是赛上的复杂度没有做到太优,是
但是我神秘了,还容易发现每一段的答案一定就是整个序列的按位与。如果整个序列的按位与是
大家都过了,也没花我太久时间,还对了拍的,比较合理的 T1 吧。
T2
看一眼就知道不是我喜欢的题。(可能将来会是但现在一定不是啊!)又是这种思维题,想了一会发现没想出来就去看 T3 了。这题却结论也猜不到暴力也不会打,(神秘了,一直在想什么全排列啊什么的暴力,没想到搜索。)所以交了一个全输出 -1 的代码,不作评价。
说是思维题却有点像结论题呢,貌似就说成是结论题也不为过,既然赛时没想出来,那么赛后写总结时就证明一下结论做做思维训练吧。
首先呢,是这样子的。题目既然有无解的情况,先把无解的充要条件找出来吧。
容易发现(好像也不是特别容易,至少我赛时没想出来啊啊啊)当一幅图至少存在如下矩形之一时,该图无解。
R ... B B ... R
. . . .
. . . .
. . . .
B ... R R ... B
充分性手玩即可很好证明,这样每个操作的拓扑序会形成一个环,必要性呢?
其实赛上一眼觉得这东西是个图论,但是想的却是 2-SAT。真正的证明需要的是二分图。我们可以把这种形状放到二分图上,如果
且容易发现,对于一个大小为
那么这玩意判无解就可以直接找环做了,但是好像比较麻烦,nb_jzy 提供了一种很好的做法,但是他不会证明,让我们一起来看看。(做法其实是 nikangle 的,我先入为主了。)
做法简述为:将每一列按 R 的个数从大到小排序,如果重排后的图每一行的结构都是
这东西的原因就没有那么显然了,我们来通过分析建立一个映射。
首先,我们有两个无解结构:
R B B R
B R R B
那么在列重排后,它一定不会被破坏,顶多左右两列交换位置,这个不需要证明了。那么就可以得到:原图上是否有解等价于新图上是否有解。
nikangle 说不用证明了。
简单分讨后可以发现做法的确是对的,因为我们知道每一列 R 的个数是不增的,交换同一行的一个 R 和一个 B 后再结合上述性质,容易推出矛盾,不再赘述。
T3
简单 DP,放 T3 多少有点抽象。放 T1 估计还差不多。本来以为我计数有提升了,没想到是这道题虚高了。
T4
有点抽象的大数据结构。
赛上想了个暴力,然后发现可以用线段树合并优化,但是好像假了。于是就只写了那个跳子树的暴力,分析出来期望复杂度比较低,没想到真的连大样例都能过。其实只要一个菊花图就能卡,但不知道为什么没有人卡我。大家好善良啊。
先写点部分分吧。单组询问是比较好做的,只要看有多少条边的两端都是打了标记的点就可以了,因为是棵树所以连并查集都不用。这样单组是
那么考虑处理
然后显然可以根号分治,并通过均值不等式算出
正解和这个根号分治没多大关系,就是把原来的暴力做法用倍增优化然后用奇妙东西维护。(细节我还不太清楚。)不过能想到跳子树但是想不到倍增,果然我还是套路见少了吗。
10.18
写点有价值的东西。今天稍微有点困。
T1
水题。猜猜结论再带证明即可做出来。但是 Kruskal 复杂度没有线性做法优。线性做法是每个点朝自己距离最近的点连边。
T2
贪心。赛上一直在想错误的贪心做法。每次都找被覆盖次数最多的点然后进行删除操作。明知道这个东西很难维护但是还是觉得没问题然后浪费了我一个半小时。
可改正的点有很多:
- 结论是猜的但是没有对拍,如果对了拍应该会放弃这个做法进而想到正确的做法。
- 在无法证明的做法上耗时太久。
- 不会贪心。
T2 必须得做出来,没什么其它好说的。
鉴定为游戏打多了,对自己下手还是不够狠,练题练少了。决定这个周末只打一小时泰拉瑞亚。
T3
赛上想到了全部选择和离线的转换,但是这个点的覆盖的转换有些过于神奇了。但是这又属于想到这个转换马上就会做法了的转换,感觉还是蛮巧妙的。
这个东西应该也可以算作套路吧?大概就是把线段对点的覆盖用点被哪些线段覆盖来判断。
T4
赛上连
那么就可以处理一个
10.19
这又是啥啊。
T1
让直径最小容易想到二分答案,但是我觉得判定是否可行和直接做最优化 DP 好像没有区别,所以就一直在想怎么直接做 DP。事实上这两东西是有区别的,而判定是可做的,直接 DP 则不太可做。
又和上次 T2 犯了同样的错误啊,在一个错误的做法上死磕了太久,而且好像又是 1.5h。真的不能再这样了,如果方向错了怎么磕也磕不出来,所以还是找对方向最重要。
UPD:问了 nk_fzx_sd,再思考了一下,终于算是明白了为什么。直接 DP 要同时保证子节点子树内的直径与新合成的直径的最大值最小,这玩意应该没那么好维护。但是可行性判定就不那么难了,因为子节点子树内的双链直径不会参与新直径的合成,所以只要保证不合法的状态不会被选就可以了。
T2
感觉比 T1 好做。
网格图 + 放车 + 两两互不攻击容易想到二分图。发现可行的最大值就是其最大匹配,最小值就是其连通块个数,因为每个连通块都至少要有一个位置上最后有车。(不可能全部吃完。)
所以说在最小值的情况下任意加匹配边且不超过连通块最大匹配就可以摆放出
思路确实蛮好想,但是调了我好一会。
T3
神秘状压 DP。
普通的
然后有两种优化方式,第一种是把预处理直接变成两段,直接预处理某个状态时中间所有牌的答案,查询就可以做到
把时间堆 T1 上确实不是一个明智的选择,如果放在 T3 上想想
T4
数据结构题也写少了,赛上甚至没有观察到这不是 polylog 的。可以发现(但是特别难)一个点的 dfs 序不能直接计算的部分只和它的祖先有关,又因为每次修改的
1.该祖先前序遍历。
2.该祖先中序遍历,且当前点在其右子树内。
然后就可以分块处理了。但是具体怎么个分块法自己复盘了下还不是很懂,得多想想了。这些 T4 都好难啊。
总结的总结
越来越体会到 T2 的关键之处了。无论是模拟赛也好,T2 专练也好,T2 的确就是大多数时候的翻盘希望。
不过呢,貌似新的弱点又接踵而至了。
构造/思维
一般会放在 T3/T4 吧,但是确实也见过放在 T2 的构造,比较恶心。但是没办法啊,恶心也得做。这种题就是猜结论和手玩为主,还要尝试将题意形式化,将复杂操作变得更简单。
贪心
应该也可以归到思维里但是还是有点区别的,而且考察的也比较频繁。贪心也是靠手玩和猜结论来引导出正解的,但是有的也有固定的套路,比如说像第 K 大和将路径贡献在 LCA 处计算之类的。
DP
本来说的是计数 DP 的,但是貌似是所有 DP 我都不会啊。状态设计和转移都是难点,而且现在出现的 DP 都没有那么直接了,需要拐弯抹角地推出很多性质才能正确地设出状态并且做到优秀的复杂度。转移的话在纸上写下来会比在脑内想清楚很多。
新的套路也见识到不少,套路见多了总是好的。
- 序列划分且要求每段相等 -> 找规律。而且满足某个性质的运算不止按位与一个。
- 染色 -> 一看就很思维,找规律和突破口。当然不排除区间 DP 的可能。
- 固定的跳跃 -> 倍增。
- 复杂度和元素个数/单次询问数有关 -> 根号分治。(真的会在 CSP-S 第二轮里出现吗?)
- 路径问题 -> 优先考虑在 LCA 处计算贡献。
- 是否有子集可行 -> 全集是否可行(例如覆盖问题)。
- 线段覆盖点 -> 点被哪些线段覆盖。
- 最大值最小/最小值最大 -> 二分答案+可行性判定。
- 网格图+放车+互不攻击 -> 二分图。
- 状压 -> 将状态分开预处理再合并以降低复杂度。
- 散点维护 -> 分块。
- 对序列进行神秘操作,判断一个序列能否通过操作得到另一序列或构造一操作后序列 -> 找不变量。
离 CSP 第二轮不远了。说实话模拟赛还有很多东西没有考到诶。数论啊字符串啊更是见都没见过。不过说实话,这俩东西应该也不会单独出题的,当然还是要练,把贪心啊DP啊练好就更好了!
比赛策略落实得也比之前到位了,现在只要保证不在一个题的错误做法上死磕太久就可以了!
好好练题也要好好休息,希望可以在 CSP-S 第二轮中发挥出好成绩!
我们都有光明的未来。