【Codeforces】GoodBye 2019简要题解
传送门
七道构造题,外加一道暴力,妙啊! 话说构造题太考验思维了,想不到就没了。
A.Card Game
- 直接贪心即可
B.Interesting Subarray
- 可以发现当且仅当存在相邻的两个不满足条件时才存在,也就是说任意一个不合法的子段一定有这么一个相邻的位置不合法。
C.Make Good
- 因为要求,注意到有一个乘二,所以说最后一个位置相当于是已经确定了,然后倒着推过去就可以O(log)的时间用一个数完成要求的构造。
- 或者还有一种构造方法。设刚开始的和为s1,异或和为s2。
- 第一个数是s2,第二个为(s1+s2)。然后发现这样就可以了???神奇。
D. Strange Device
- 简单
交互题构造题。 - 只需要将前k+1个选择k次,那么返回的只会有第m大的出现k+1-m次,第m+1大的出现k次,然后找到返回值中小的那个的个数就好了。
E. Divide Points
- 刚开始一本正经地以为是神仙的二分图匹配的问题,结果还是构造???
- 奇偶讨论。因为要讨论的关系,所以直接按照x,y分别的奇偶性讨论即可,一共有四种可能。
- 注意到如果有不止一种可能,那么就一定能分成两组(如果x-y都同奇偶,有两组,那么它们最后的距离mod4是不一样的)。
- 否则全部坐标除以二继续做。可以预先全部变成正数。
F. Awesome Substrings
- 首先计算一个前缀和记录为s[i],那么相当于是求
- 注意到k如果很大的话那么,那么有效的满足
- 那么我们就可以平衡规划了。
- 时暴力,的部分枚举左端点以及1的个数,计算右端点在这个区间内满足的个数,时间。
- 可以用map完成暴力(虽然超级慢),然后要求上面两个时间相等即可。
G. Subset with Zero Sum
- 真·构造。首先化一下很丑的约束式子变成。
- 超级优美——直接i向a[i]连边,然后找环即可。
H. Number of Components
基础线段树- 刚开始想建一个树出来LCT,然后似乎有单调队列???难搞
- 然后发现一个性质,联通快一定是连续的一段区间。否则左边一块隔着几个和右边一块相连,你会发现中间的几个一定会和左边的或右边的相连。
- 既然如此,那么问题就转化为了找分界点了。
- 分界点一定满足。
- 现在我们想要维护分界点的个数。直接做并不好做。考虑转换一下模型。
- 对于上面的式子我们不妨找到的,将的的位置赋为1,赋为0.那么最后对于这个,我们得到的序列是类似11…110…00这样的。如果我们在这个序列前面加一个1,后面加一个0,那么这个序列是这个形态当且仅当相邻位置不同的个数为1.
- 我们对于每一个都维护一个的相邻位置不同的个数,以为关键字开一个权值线段树,维护。
- 可以注意到修改一个位置pos只会跟pos-1或pos+1在h中与pos的0/1状态有关,影响到的刚好是一个区间。分类讨论即可。
- 线段树上只需要记录最小的是什么和最小的数的个数。
- 由于修改自己不好改,所以不妨离线下来,全部一起操作。预处理也可以变成类似的操作。