CF Round #681(Div.2)/CF1443 口胡题解

由于一些原因(时间),本蒟蒻决定口胡这场比赛。

下面的题解纯口胡,但是与题解中的解法基本相同。

Solution

A

答案就是 2 n + 2 , 2 n + 4 , 2 n + 6 … … 4 n 2n+2, 2n+4, 2n+6……4n 2n+2,2n+4,2n+64n

B

考虑我们在一个位置放上一个 1 1 1的意义何在——使得两段不连续的区间连续起来,可以一次清 0 0 0。即,假设左边有一个区间,右边有一个区间,然后中间隔了 k k k个格子;分别清空的代价是 2 a 2a 2a,而拼接起来(即把这 k k k的格子全部填上 1 1 1接着连续之后一次清 0 0 0)的代价是 2 k + a 2k+a 2k+a

根据贪心策略,如果 2 a < 2 k + a 2a<2k+a 2a<2k+a我们就使用第二种方法,否则使用第一种方法即可。

作为Div.2B考场上竟然只有不到 4200 4200 4200人做出来,说明这题还是有一点点思维含量的。

时间复杂度 O ( n ) O(n) O(n)

C

一眼二分题,二眼贪心题。

首先,我们按照 a a a的值升序排列。我们枚举 a a a数列中的数的最大值,可以发现, a a a中凡不是最大值的数都不会产生任何代价,直接选,那么Petya就不用跑了。剩下的用 b b b填满,维护一个后缀和就完了。

时间复杂度 O ( n ) O(n) O(n)

D

题解中乱搞就过了,而我竟然上了个线段树大炮轰蚊子把这题A了……也是唯一没有口胡的一题吧……

我们扫一遍这个序列,遇到 a i ≤ a i + 1 a_i≤a_{i+1} aiai+1就把 [ i + 1 , n ] [i+1,n] [i+1,n]这段区间的所有数减去 a i + 1 − a i a_{i+1}-a_i ai+1ai;否则(如果 a i > a i − 1 a_i>a_{i-1} aiai1)同理(把 [ 1 , i ] [1,i] [1,i]这段区间中的所有数减去 a i − a i − 1 a_i-a_{i-1} aiai1)。

最后, a a a中的所有数显然都相同了,那么我们看一下 a a a中的所有数是否都是非负数即可。

相当于我们要维护区间加,单点查询这两种操作,树状数组即可。但是由于线段树写得特别熟,就莽了。

E

k k k就那么一点小,每次修改的一定是末尾的几个数,直接用数学的方法修改一下就可以了。

由于修改的都是末尾的数,我们只需要前缀和就没了,连专治区间加单点查询的差分套树状数组都不用了。

F

吃饭的时候一直在想,结果呛了,呛了然后就会了……

我们每次删掉的那个数,一定不能是后面需要出现在序列 b b b中的那个数,否则就相当于坑了自己。

我们画一棵树,表示我们要删掉哪一个数,是当前的 b i b_i bi左边的数还是右边的数;当然,做上面任何一种操作都要在“删掉的那个数,一定不能是后面需要出现在序列 b b b中的那个数”的条件下进行。

这棵树在形态上是对称的!!!

所以,我们只需要求出分叉的数量即可,答案就是 2 2 2的这么多次方。还要判一下不行的情况(就是无论如何都会违背那个“删掉的那个数,一定不能是后面需要出现在序列 b b b中的那个数”这个“真理”)。现在,我们只需要维护“单点删除,查询前驱后驱”。

这个东西可以用链表每次 O ( 1 ) O(1) O(1)搞定。但如果你非要写平衡树,那就去写吧,写挂了别找我来调


再说一遍,都是口胡的,有小错可以喷,出言不逊也可以,但别骂人。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值