【Codeforces】GoodBye 2019简要题解

16 篇文章 0 订阅
14 篇文章 0 订阅

传送门
七道构造题,外加一道暴力,妙啊! 话说构造题太考验思维了,想不到就没了。

A.Card Game

  • 直接贪心即可

B.Interesting Subarray

  • 可以发现当且仅当存在相邻的两个不满足条件时才存在,也就是说任意一个不合法的子段一定有这么一个相邻的位置不合法。

C.Make Good

  • 因为要求 ∑ a i = 2 ∗ ( a 1   x o r   a 2   x o r . . . a k ) \sum a_i=2*(a_1 \:xor\:a_2\:xor...a_k) ai=2(a1xora2xor...ak),注意到有一个乘二,所以说最后一个位置相当于是已经确定了,然后倒着推过去就可以O(log)的时间用一个数完成要求的构造。
  • 或者还有一种构造方法。设刚开始的和为s1,异或和为s2。
  • 第一个数是s2,第二个为(s1+s2)。然后发现这样就可以了???神奇。

D. Strange Device

  • 简单交互题 构造题。
  • 只需要将前k+1个选择k次,那么返回的只会有第m大的出现k+1-m次,第m+1大的出现k次,然后找到返回值中小的那个的个数就好了。

E. Divide Points

  • 刚开始一本正经地以为是神仙的二分图匹配的问题,结果还是构造???
  • 奇偶讨论。因为要讨论 ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 (x_1-x_2)^2+(y_1-y_2)^2 (x1x2)2+(y1y2)2的关系,所以直接按照x,y分别的奇偶性讨论即可,一共有四种可能。
  • 注意到如果有不止一种可能,那么就一定能分成两组(如果x-y都同奇偶,有两组,那么它们最后的距离mod4是不一样的)。
  • 否则全部坐标除以二继续做。可以预先全部变成正数。

F. Awesome Substrings

  • 首先计算一个前缀和记录为s[i],那么相当于是求
    ∑ k > 0 ∑ 0 < = l < r < = n [   k ( s [ r ] − s [ l ] ) = ( r − l )   ] \sum_{k>0}\sum_{0<=l<r<=n} [\:k(s[r]-s[l])=(r-l)\:] k>00<=l<r<=n[k(s[r]s[l])=(rl)]
  • 注意到k如果很大的话那么 k ∗ s [ m ] < = n k*s[m]<=n ks[m]<=n,那么有效的 s [ m ] s[m] s[m]满足 s [ m ] < = n k s[m]<=\frac{n}{k} s[m]<=kn
  • 那么我们就可以平衡规划了。
  • k < = T k<=T k<=T时暴力 O ( T n ) O(Tn) O(Tn) k > = T k>=T k>=T的部分枚举左端点 l l l以及1的个数,计算右端点在这个区间内满足 k > = T k>=T k>=T的个数,时间 O ( n 2 / T ) O(n^2/T) O(n2/T)
  • 可以用map完成暴力(虽然超级慢),然后要求上面两个时间相等即可。

G. Subset with Zero Sum

  • 真·构造。首先化一下很丑的约束式子变成 1 < = i − a [ i ] < = n 1<=i-a[i]<=n 1<=ia[i]<=n
  • 超级优美——直接i向a[i]连边,然后找环即可。

H. Number of Components

  • 基础线段树
  • 刚开始想建一个树出来LCT,然后似乎有单调队列???难搞
  • 然后发现一个性质,联通快一定是连续的一段区间。否则左边一块隔着几个和右边一块相连,你会发现中间的几个一定会和左边的或右边的相连。
  • 既然如此,那么问题就转化为了找分界点了。
  • 分界点 x x x一定满足 M i n i < x ( a i ) > M a x i > = x ( a i ) Min_{i<x}(a_i)>Max_{i>=x}(a_i) Mini<x(ai)>Maxi>=x(ai)
  • 现在我们想要维护分界点的个数。直接做并不好做。考虑转换一下模型。
  • 对于上面的式子我们不妨找到 M i n i < x ( a i ) Min_{i<x}(a_i) Mini<x(ai) i i i,将 a j > = a i a_j>=a_i aj>=ai j j j的位置赋为1, a j < a i a_j<a_i aj<ai赋为0.那么最后对于这个 i i i,我们得到的序列是类似11…110…00这样的。如果我们在这个序列前面加一个1,后面加一个0,那么这个序列 h h h是这个形态当且仅当相邻位置不同的个数为1.
  • 我们对于每一个 i i i都维护一个 h h h的相邻位置不同的个数 f f f,以 a [ i ] a[i] a[i]为关键字开一个权值线段树,维护 f f f
  • 可以注意到修改一个位置pos只会跟pos-1或pos+1在h中与pos的0/1状态有关,影响到的刚好是一个区间。分类讨论即可。
  • 线段树上只需要记录最小的是什么和最小的数的个数。
  • 由于修改自己不好改,所以不妨离线下来,全部一起操作。预处理也可以变成类似的操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值