AtCoder Beginner Contest 285 题解

比赛链接:
https://atcoder.jp/contests/abc285
总体来说不算难。

A-C略。

\(D\)
因为起点终点不同,起点之间、终点之间两两不同,所以有环的情况是错的,其他都是对的。写起来的难点是要把string哈希,耗了一点时间,最后拿map来hash。

\(E\)
比赛的时候不太会,没有去仔细想。看来一眼题解就懂了,其实就是算\(A_i\)的贡献。因为weekend必须至少有1天,所以定为第\(1\)天可以简化计算。然后考虑如果两个weekend之间有\(L\)天的话,那么贡献是确定的,就是\(\sum_{i=1}^{L}A_{\frac{i+1}{2}}\),所以这个数可以用一个\(b_i\)来代替,然后对整个星期进行DP即可。\(f_{i,j}\)表示当前到了一个星期的第\(i\)天,目前连续的这一段weekday的长度是\(j\),如果\(j=0\),就意味着第\(i\)天是weekend,然后用此来DP即可。
最后看下\(f_{n,j}\)的最大值即可。

\(F\)
比赛的时候思考了一下,就想到了所谓的子串等价于,当前的这个询问区间\([l,r]\)内的串必须单调不降,而且满足除了一头一尾两种字母的数量可以不等于整个串的该字母的总数外,其他中间的字母必须满足数量等于原串的字母(就算是0,也要相等)。对于修改,发现只需要在原来那个位置上的字符数量\(-1\),新的字符数量\(+1\)即可。因为是动态的,所以不可以直接前缀和或者差分,那么可以想到线段树或者树状数组,因为都是单点修改、区间查询,所以直接树状数组就做完了。注意单调不降也就是不存在逆序对,如果有逆序对那肯定会存在\(s_{i-1}>s_i\),所以这个东西也可以用树状数组来维护。

\(G\)
\
\(Ex\)

posted @ 2023-01-16 12:25  MN2016  阅读(98)  评论(0编辑  收藏  举报