首页 > 代码库 > Codeforces Round #423(div 2)

Codeforces Round #423(div 2)

A

=w=

B

QvQ

C(并查集)

题意:

你需要根据要求构出一个字符串S

输入n个子串以及这些子串在S中出现的位置(有多个位置),输入数据保证不冲突

然后你根据这些已知子串去构一个字典序最小的S(也就是没涉及的位置填‘a‘)

最终S的总长度<=2e6

分析:

不能直接暴力模拟,那样会TLE

给位置涂色的过程中将相邻的块用并查集合并,父亲是当前块最右边的那个位置

这样就可以保证每个位置最多遍历一次了

时间复杂度O(αlen)

D(构造)

题意:

给出n,k(n,k<=2e5)

可以构造出一个n个点的无根树,并且这个无根树叶子节点的个数是k

那么在这么些合法的树中,你需要找出一个树,叶子节点之间距离的最大值最小

分析:

我们希望它们之间的距离越平均越好

容易发现从根节点分出k个枝杈,然后每个枝杈尽可能平均地挂链,这样的树可以使得叶子节点之间距离的最大值最小

E(树状数组)

题意:

给出一个由A G C T组成的字符串S(|S|<=1e5)

有q(q<=1e5)个操作:

  操作1:将一个位置的字符修改

  操作2:读入l,r,e,e是一个长度<=10的字符串。字符串T=S[l..r],字符串E=eeeeeeeeeeee....,将T和E对比,计算有多少个位置i满足T[i]=E[i]

分析:

首先考虑没有修改操作

对于询问可以枚举e的每一位,那么就是询问一个等差序列与原串S对应位置的重合情况

可以对原串S预处理,数组c[id][i][j][]表示对于字符id,当公差是i的时候(明显公差<=10),首项是j的时候(j<=i),每个位置是否有字符id(0或者1)

那么对于询问其实就是求区间和,那么就求前缀和相减就行了

现在考虑修改操作

修改操作是:修改一个位置,询问区间和

所以直接BIT

时间复杂度O(4*10*10*len*log(len))

F

待填坑

Codeforces Round #423(div 2)