CF1609 部分题解

赛时做出了 ABCDE,没有做出 FGH;目前已补掉了 F,尚未补掉 G,H。

A

bib_ibiaia_iai 所含质因子 222 的个数,ci=ai2bic_i=\frac {a_i} {2^{b_i}}ci=2biai。不难发现,调整过程等价于将一共的 S=∑i=1nbiS=\sum_{i=1}^n b_iS=i=1nbi 个质因子 222 重新分配给所有的 ccc,使得所有值之和最大。

根据贪心策略,将 SSS 全部分配给最大的 ccc 即可。

B

不难发现,最少删除次数就是 abc 以子串形式出现的次数。于是,我们只要在询问过程中,动态更新这个值即可。

时间复杂度 O(∑(n+q))O(\sum (n+q))O((n+q))

C

为方便叙述,令 bi=1b_i=1bi=1 当且仅当 aia_iai 为质数,bi=0b_i=0bi=0 当且仅当 ai=1a_i=1ai=1bi=−1b_i=-1bi=1 当且仅当 aia_iai 为合数。

看到下标为等差数列的问题,不难想到将 aaa 分成独立的 eee 类,第 iii 类为 {bi,bi+e,⋯ }\{b_i,b_{i+e},\cdots\}{bi,bi+e,}。于是,问题转化为: 对于一个固定的序列 ccc,求其有多少个子区间不包含 −1-11 且和为 111。显然,将 ccc 中所有值为 −1-11 的位删去,再对每个分裂出的区间做前缀和,最后再用桶扫描一遍计算对答案的贡献即可。

时间复杂度 O(∑n)O(\sum n)O(n)

D

首先,图中不会有环。

其次,令 SiS_iSi 为第 iii 个连通块所包含的点集,那么对于每个 SiS_iSi 在其内部连成一个菊花图必定最优。因此,答案就是 max⁡i{Si}−1\max_i \{S_i\}-1maxi{Si}1。于是,问题转化为: 如何构造图,使其最大的连通块最大。

依次扫描每一条边 (x,y)(x,y)(x,y),并分类讨论:

  • x,yx,yx,y 属于不同连通块,则连一条跨越这两个连通块的边;
  • x,yx,yx,y 属于同个连通块,那么将 cntcntcnt111

可以发现,当前的 cntcntcnt 就是我们可以随意钦定的边数;不难想到,用这 cntcntcnt 条边将前 cnt+1cnt+1cnt+1最大的连通块连接起来,即可最大化 max⁡i{Si}\max_i \{S_i\}maxi{Si}

并查集维护即可。时间复杂度 O(n2)O(n^2)O(n2)

若使用权值线段树维护各个连通块的大小,并每次通过线段树上二分求出答案,则总复杂度可以被优化到 O(nlog⁡n)O(n \log n)O(nlogn)

E

算法一

考虑 dp\text{dp}dp

xix_ixi 表示,看了 s[1,i]s[1,i]s[1,i],使其中不存在 a 的最少删除次数。
yiy_iyi 表示,看了 s[1,i]s[1,i]s[1,i],使其中不存在子序列 ab 的最少删除次数。
ziz_izi 表示,看了 s[1,i]s[1,i]s[1,i],使其中不存在子序列 abc 的最少删除次数。

转移如下:

  • ai=0a_i=0ai=0,则 xi=xi−1+1,yi=yi−1,zi=zi−1x_i=x_{i-1}+1,y_i=y_{i-1},z_i=z_{i-1}xi=xi1+1,yi=yi1,zi=zi1
  • ai=1a_i=1ai=1,则 xi=xi−1,yi=max⁡(xi−1,yi−1+1),zi=zi−1x_i=x_{i-1},y_i=\max(x_{i-1},y_{i-1}+1),z_i=z_{i-1}xi=xi1,yi=max(xi1,yi1+1),zi=zi1
  • ai=2a_i=2ai=2,则 xi=xi−1,yi=yi−1,zi=max⁡(yi−1,zi−1+1)x_i=x_{i-1},y_i=y_{i-1},z_i=\max(y_{i-1},z_{i-1}+1)xi=xi1,yi=yi1,zi=max(yi1,zi1+1)

边界: x0=y0=z0=0x_0=y_0=z_0=0x0=y0=z0=0
答案: znz_nzn

每次修改都跑一遍 dp\text{dp}dp,则总复杂度 O(qn)O(qn)O(qn),无法通过。

算法二

采用矩阵表示上述转移,并使用线段树维护矩阵乘法,则时间复杂度为 O(qlog⁡n×33)O(q \log n \times 3^3)O(qlogn×33),可以通过本题。

F

我竟然没有发现我的做法的复杂度是正确的!!1

wi=popcount(ai)w_i=\text{popcount}(a_i)wi=popcount(ai)W=59W=59W=59。我们在 [0,W][0,W][0,W] 中枚举一个 xxx,表示区间最值的 www 均为 xxx

为方便叙述,令 iii 为优秀位置,当且仅当 wi=xw_i=xwi=x。同时,令 tit_iti 表示 [i,r][i,r][i,r]aaa 最大的位置的 www 是否为 xxx 以及 aaa 最小的 www 是否为 xxx——若均满足则 ti=2t_i=2ti=2,只满足一个则 ti=1t_i=1ti=1,否则 ti=0t_i=0ti=0

考虑从左往右扫描序列(令当前扫描到了 rrr),并使用单调栈+线段树维护 ttt。具体来说,我们使用一个表示最小值的单调栈,维护一个递增序列;每当新看到一个数的时候,我们先进行弹栈,并对于每个弹出的值进行区间加 111 或区间减 111(因为一个新的区间最小值替代掉了原来的区间最小值,如果优秀的替换了不优秀的那么区间加 111,如果不优秀的替换掉了优秀的那么区间减 111)。另外也要用一个表示最大值的单调栈进行同样的处理。不难发现,这里只要求维护区间修改,查询区间中 222 的数量,线段树显然可以胜任。

那么这个复杂度是什么的呢?我赛时一直以为是 O(nlog⁡nlog⁡M)O(n \log n \log M)O(nlognlogM) 的,实则不然。下面便是复杂度分析:

  • 先考虑询问。显然,询问都是全局的,而一共有 O(nlog⁡M)O(n \log M)O(nlogM) 次询问,所以这一部分是 O(nlog⁡M)O(n \log M)O(nlogM) 的。
  • 再考虑修改。
    • 优秀变为不优秀: 一个优秀的值被弹出。显然在固定了 xxx 后,优秀的值只会被弹出一次,而对于 x=0,1,⋯ ,Mx=0,1,\cdots,Mx=0,1,,M 所对应的优秀值个数之和恰好是 nnn,所以均摊下来这一部分的复杂度是 O(nlog⁡n)O(n \log n)O(nlogn) 的。
    • 不优秀变为优秀: 一个优秀的值被加入。与上述分析同理,这一部分的复杂度也是 O(nlog⁡n)O(n \log n)O(nlogn) 的。

因此,总时间复杂度是 O(n(log⁡n+log⁡M))O(n(\log n+\log M))O(n(logn+logM))。卡常后可过本题。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值