集训模拟赛第一轮
10.5
时间轴
国庆放假回来第一天,竟然没开门???延迟 10 分钟。
通读全文,
发现还好假的不多,刚刚只保证了单调栈弹完后只含当前被删元素的位置个数。但是被删的那个元素可能弹掉了前面的一些元素,于是再加一个限制,让这些数还要满足能够弹完前面的所有元素,于是形式化就是还要满足
继续对拍,最后一共拍了 20000 多组。
开始搞
想 C 题,观察后发现被选的那些数之间不会互相交换,于是想考虑是不是可以把交换的和选的分成两段区间,发现好像不行。又考虑是不是选的数量越多越好(即把所有权值赋成 1),发现好像可以 HACK。于是又跳了。
只有看看 set,直接又 T 掉 10 分。
回头看
发现
反思
1.别被一道题搞太久了,如果把
2.少用类似 set 之类的快速STL。
PS.本来要写检讨,结果B题重测,
D
很好啊,忘记可以在单调栈上做合并,于是写了依托。
10.6
咕咕咕。
策略依然是先通读全文,这个 A 题很好啊,虽然题意很简单,但是感觉不是很好做,数据范围也很迷惑,
A
于是开始做
这看起来是 unordered_map。
于是最后就爆了,
实际上我们只需要在进行一步观察,发现只要某个数的个数不是 3 的倍数,我们一定会将它和相邻几个凑成一对。而若每个数都是 3 的倍数,那么每种相同的分组数量也一定是 3 的倍数。于是我们可以先将所有数的个数通过操作变成 3 的倍数,然后就考虑 3 个数捆在一起,发现刚好是
B
最大的方案是平凡的,最小简直就是****。
一个经典的转换是将一段区间的 不难发现总和为 ,即在一些正数位置
而使得操作代价最小即可使用一种贪心策略:我们从后往前进行操作,考虑对于每个负数,找到最近的一个还未变成
不严谨的证明如下:
设
i<j<j'<i',a_i,a_j<0,a_{i'},a_{j'}>0,|a_i|=|a_j|=|a_{i'}|=|a_{j'}| ,因为我们要满足a_j 先被消完,所以可能交换消的顺序的情况即如上,那么当前操作的代价即为a_{i'} \times (i'-i)^2+a_{j'}\times (j'-j)^2 ,而若我们考虑将i 和j' 消,j 和i' 消,就变成了a_{i'}\times (i'-j)^2+a_{j'}\times (j'-i)^2 ,即证(i'-j)^2+(j'-i)^2\le(i'-i)^2+(j'-j)^2 ,这显然是对的啊,因为呢将两式都加上2\times (i'j'+ij-ij'-i'j) ,就都变成了(i'+j'-i-j)^2 ,肯定不会更劣。
这个转换差分的套路还是挺常见的,不要太局限了。
C
这个图困扰了我 5 分钟。
没什么思路,还是说这题实在是很妙啊。
这种将牌面划分成若干个区域的题目实际上就是在提醒我们两个字:地皮。但是我们会发现不同的划分方案之间会有重复,于是就是 dp 的经典套路,去重。
而去重主要有几种方式:要么使得状态不重不漏,要么再设一个状态记录重的个数,要么就是某二字词语:容斥(特指
如图就十分明了了:
这是其中的一种情况,其他几种划分方式的交也类似。其实我们发现算重的部分就是这若干个划分方法会将矩形分为若干个正方形。
所以这提示我们还需要再算一下正方形的方案数,而正方形本身是简单的,就直接将横着放加竖着放再减去四个正方形。
但是代码是比较长的,因为不同的交集情况有 13 种(有两种系数为 0),封装后都有2000多B。
D
超纲题,仙人掌,我不会啊,但是思路是比较简单的,只需要对于每个环求出最短的一条经过它的路径,其他就和树差不多,就是很难写。
10.8
通读全文后发现 A 题是经典建图题,B 题怎么是构造!C 题是期望!D 题什么东西!预感会爆了。然后确实爆了。感觉就做了个 A 题。
A
比较套路,我将它命名为优化子集,感谢 Just_int_mian 大佬给我推荐了这道题目,使得我对这种建图思想有了更深刻的理解。
然后就用 Dijkstra?发现边权只有 0 和 1,于是 01BFS 即可,但是我地杰斯特拉过了,NKOJ 被卡了。
再次赞颂某二字词语:对拍。这使我发现没给 dis 数组赋值。
B
这就难起来了。相当于是通过洗牌的操作将序列排序。
发现洗牌操作的位置一直在变化,于是我们考虑用一种等价的方式洗牌,发现可以将其变化为(但是我没有发现):
选择若干段连续的区间
(l_1,r_1),(l_2,r_2)...(l_{i-1},r_{i-1}),(l_i,r_i) l_1=1,r_i=n ,将这些区间内的数字翻转,然后在整体翻转一次。
考虑是否有一种排序的过程可以转换为若干次这样的操作。想到快速排序。
我们把每一层大于
而我们又发现每一层被划分成了若干不相交的区间,于是操作可以并行,理论的操作步数即为
还有一个小细节是,因为每次整段区间被翻转了,所以答案有的要翻转,如果序列是倒着的,最后可能还要再将其全部翻转一遍。
C
不是很会啊,考试的时候甚至没算出来
D
不会。
10.10
好啊好啊,说好的比上场简单,还真就比上场简单。
时间轴
取用以往的策略,首先通读全文,发现:咦?这
现在差不多会了 T2,把 A 题冲出来应该就赢了(但是好像并不是,200分基本上都有。)
于是盯着题面看了两分钟,咦?他原来说的是“可以”啊,只能进行一次操作的话,
而这种在树上选取一条简单路径的题目,不就是很经典的 dp 做法,考虑换根后枚举子树内的两条链做拼接。而这个代价很好算啊,只需要看其他的子树有多少
于是几分钟后写完,感觉大样例挺强的,本来想对拍,但是不想造树,于是就没有然后了。
好了,最煎熬的时刻到了。
发现 B 题比较简单,第一步就求出每个 l 和 r。第二步就是经典的求第
开始写 B 题,发现细节真的很多(因为希望实现一个 check),于是就先把统计排名的部分写了。测了一下第一个样例,没什么问题之后就把后面的堆给写了。然后就发现第二个样例过不了,多输出了一个
看了一会儿没有结果之后就打了一个暴力,发现暴力也过不了样例。于是发现暴力跑出来的个数不止
然后过了第二个样例,发现大样例过不了一点,然后我急了啊,一直怀疑是计数的时候细节方面写错了,于是这修修那补补,还是没什么进展。看了看排名算没算对,发现好像没对。
然后就是然后
但是看了很久之后还是没什么进展,于是又用暴力跑了一遍,发现好像细节没写错!?
然后我直接崩了啊,已经
看来抠细节的能力还是有待提高的。紧接着就打了个对拍,一直怕写错了。
赶紧开最后两道题,没多少时间细想了,于是
反思
这场比赛其实并不是特别难(虽然 C 和 D 我还是做不出来),但是其实是比较极限的,试想,如果我
所以说,有以下几点值得注意:
- 注意读题的准确性,这样可以为一些难调的题目节约时间。
- 题目的细节要思考清楚,最好是在纸上写下一些关键点,防止写错浪费大量时间。
10.12
时间轴
8:00\sim 8:10
通读了全文,发现 还是在图上,更加劝退。
于是选择回来想
看到
然后感觉状压可以做啊,设 然后发现过不了样例。
然后发现我在算什么东西,这样做其实是有后效性的,因为不能保证前面一些位上的情况,肯定是错的。
那怎么让它没有后效性呢?首先应该是从高到低考虑,这样可以保证大小关系,然后呢?看了看我刚刚推的东西,不就是分了两种情况吗?一种是前缀等于
于是优化了一些常数后就往后做了。
开始想
然后就去体检了。
去体检了,但回来还是没什么思路。
准备先放一下
然后想到了一种构造方法:将两个偶点之间的一条边删去,然后马上被 HACK 了(我太弱了)。
发现树有很多分,然后想到可以用树形 dp,正准备开始写,发现记录字典序最大的方案就变成了
开始写
然后做子任务
然后写着写着发现就 4000 B 了。(关键是这依托还只有
垂死挣扎 但是没想到操作树真的很难做出来啊,我也不是很觉得有什么规律。 然后就打了一个爆搜,
准备去实现
打开时钟,开始倒计时。
结果
这场挂分严重,(这几场都没什么分拿来挂)res=-1e14,但实际上下界可以到
反思
- 虽说这场打得很炸裂,但是这些小分平常也应该重视,他们可以给高分锦上添花,有时还可以拯救中档分于水深火热之中。
- 结论一定要勇敢猜,比如说
B 题K 的系数,其实感觉可能在每种本质相同的情况下是定值,但是就是被操作顺序困扰了,而如果想到树就一目了然了。以后这种合并的题目可以想一想是否是树的结构。 - 细节一定要仔细抠好,像上下界开小这个问题已经是老生常谈,但这次又犯了。
- 构造题多想想部分分的提示,比如
n 的奇偶性,其实是很有用的,因为当n 为偶数时,实际上每个点都能变成奇点,所以说在树上的构造方式就是唯一的。奇数还是有点技巧,赛场上自己应该是不会的,但要多积累。 - 不要把那些带有修改查询的操作固化的认为是数据结构,
D 题技巧性还是很强,这种把儿子连续访问,子树也是一段区间的“BDFS 序”还是比较又技巧性的。整体总结
优点
- 延续了自从前几次总结以来总结的方法,比如说每次都通读全文,一些简单但是有些细节的题目打对拍,这些策略都让自己每场比赛没有那么凌乱。
- 一些时间点做出的策略还是比较的正确,基本上没有在一道题上花费超过两个小时的时间。
- 对于一些题目条件的转换能力有所提升,一些比较难的问题虽然不能做出整道题目,但是大部分情况下能有客观的部分分。
- 基本上每道题都在尽力拿分,没有哪道题目没留时间思考。(因为感觉这几天的题都挺难的)
- 不会在因为某种思路错误而被其干扰,可以重新开辟一条道路进行思考,也不会因为一些题目没有做出来而被过度耽误其他题目。
缺点
- 想到一些自认为正确的做法时过于激动,导致可能浪费时间去实现一些很容易 HACK 的做法。
- 一些有比较难写的细节的题目有时会写错然后调试很久。
- 对于很多题目性质的挖掘还不够深入,导致一些题目无法推出正解或者是拿到一些理应获得的部分分。
- 上次比赛犯了一个很久没犯过的错误了,就是上下界开小还有读题产生错误,希望下不为例(为什么这两个错误都出现在这周最后一次啊......)
- 思维,思维要打开!!!多想一想与题目相关的模型,多敢于猜点结论。
总之,优点继续保持,缺点尽力改正。
CSP 前最后2周了,冲冲冲!!!
补充
好像有人不会10.6日的 A 题时间复杂度分析。(刚刚 IMSB 了)
我们的状态是
f_{i,j,k} 表示前i 个数,第i 个数还有j 个,第i-1 个数还有k 个。那么有\sum_{i=1}^m cnt_i\le n ,我们的复杂度即为\sum_{i=1}^{m-1} cnt_i\times cnt_{i+1} ,因为n^2=(\sum_{i=1}^m cnt_i)^2=\sum_{i=1}^m cnt_i^2+2\times \sum_{i=1}^{m} \sum_{j=i+1}^m cnt_i\times cnt_j > \sum_{i=1}^{m-1} cnt_i\times cnt_{i+1} ,故时间复杂度可缩放为\mathcal O(n^2) 。