Codeforces Educational Round 97(Div.2)
Marketing Scheme
题意:
给出一段区间$[l,r]$,问存不存在一个正整数$a$使得这个区间所有整数$x$满足$x\ mod\ a \geq \frac{a}{2}$。$1 \leq l,r \leq 1e9$。
题解:
设这个数是$a$,观察出这个区间都要在$a*(x+0.5)$到$a*(x+1)$之见,其中$x$是倍数,显然$x=0$时区间最大,所以$a$就是$l*2$,然后判断一下$r$在不在$[\frac{a}{2},a)$中。
B、Reverse Binary Strings
题意:
给出一个$01$串,$0$和$1$的数量相等,每次操作可以选一个子串$reverse$,问最少几次操作使得这个字符串相邻两个字符不相同。$n \leq 1e5$。
题解:
考虑错误位置上的$1$在翻转时,另一头一定是错误的$0$,此时,一定是$11$和$00$的情况,贪心地翻转,一次翻转减小两个这样的情况。所以,我们计算出所有相邻位置相同的情况数,考虑到最后面如果剩下了$10......0110.....$,这样子是需要一次翻转的,所以答案就是上文情况数除$2$,再向上取整。
C、Chef Monocarp
题意:
给出一个$multiset$,构造一个同样大小的$set$,元素必须是正整数,求所有排列的情况中,$multiset$中的元素减去$set$对应元素的绝对值和的最值。$n \leq 200$。
题解:
直接$dp$,转移方程$dp_{i,j} = \min \limits_{i-1 \leq k < j} (dp_{i-1,k}+abs(j-a[i]))$。
D、Minimal Height Tree
题意:
给出一个$BFS$序列,还原一棵树,保证树的每个结点的儿子都是编号单调递增访问,问树的深度的最小值。$n \leq 2e5$。
题解:
对于一段连续的单调递增区间,它都挂在某个结点的上最优,这个结点也显然是深度最小的叶子结点。令$dp_i$是已经按照顺序还原了$i$个点的最小深度,且当前深度最小的叶节点的访问顺序是$fa$,则以当前点为头的单调递增区间的点都有$dp[i] = dp[fa]+1$,对于破坏了单调递增的点,它不能在同一个父亲下,所以$fa++$,然后这个点挂在新的$fa$下,重复以上操作即可。显然$dp$数组是单调不递减的,因为如果出现了递减,说明还有深度小的叶子没选完就选了深度大的叶子,那么先选深度小的叶子结果一定不会变坏。
E、Make It Increasing
题意:
给你一个序列,序列若干个地方不能修改,其余可以修改成任意整数,问最小修改多少次,这个序列单调递增。$n \leq 5e5$。
题解:
显然直接分段求$LIS$就行了。但是有细节:$1、$不能修改的两个点之间一定要有足够的空间放下不同的数,$2、$选择求$LIS$的相邻数之间也要有足够的空间填进不同的数。因此,我们给每个数$a_i-i$,这样子就消去了距离带来的影响,然后直接求$LIS$就行了,注意离散化。
G、Death DBMS
题意:
给出$n$个人,这些人可能重名,他们有一个字符串作为名字,和一个值,初始都是$0$,提供两个操作,操作$1\ pos\ x$,选中第$pos$个人把他的值改成$x$,操作$2\ str$,找到这个字符串出现的所有人名,求出这些人中的最大值。$n \leq 3e5$,字符串长度总和不超过$3e5$。
题解:
多模式匹配直接使用$AC$自动机就行了,对于重名的情况,相当于是在这个点维护一个数据结构,支持重复数据和快速查找最值,使用$multiset$即可,修改数据使用$lower_bound$找到这个值的起始点,然后$erase$这个迭代器,直接$erase$数会把这些值都删了。为了防止$AC$自动机暴力跳$fail$导致超市,需要打标记使得每个点只经过一次。