首页 > 代码库 > 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)