2023.8.7 LGJ Round

A

有一个 01 串,只有一位是 \(1\),你每次可以翻转一个长为 \(k\) 的串,求出使得每个位置为 \(1\) 最少翻转多少次。
其中有一些位是存在 \(1\) 的。 \(n 10^5\)

考虑求出一个点能翻转一次到哪些点,只要不碰到边界即可。
考虑线段树优化建图,建立奇偶两颗线段树。
然后 deque 优化 BFS 即可。
也可以用 set 优化,并查集等。

B

有一个括号序列,其中有通配符,问有多少个子串可变为一个括号序列。\(n 10^6\).
考虑一个子串是合法的条件。

1.长度偶数
2.若把左括号和通配符看成 \(1\),右括号为 \(-1\),任意前缀和非负,记这个前缀和为 \(s_1\)
3.若把右括号和通配符看成 \(1\),左括号为 \(-1\),任意后缀和非负,记这个后缀和为 \(s_2\)

\(p_i\) 为右边第一个 \(j\),满足 \(s_1(j)-s_1(i-1)<0\)
\(q_i\) 为左边第一个 \(j\),满足 \(s_2(j)-s_2(i+1)<0\).
单调栈求出。

那么若区间 \([l,r]\) 合法,满足 \(r<p_l\),且满足 \(q_r<l\).
显然是一个二维数点,即计算区间 \((l,p_l)\) 内多少个 \(q_r\in[1,l)\).
排序后树状数组即可。

C P8908

考虑一个区间的贡献,若 G,H 的数量都为奇数,则不能。
那么,考虑将 G,H 中的一个配对成回文串。
设 G 存在的位置是 \(a_1...a_m\).
那么考虑将 \(a_1,a_m\)\(a_2,a_{m-1},...\) 两两配对成相对的位置。
那么每对的贡献是 \(|a_i+a_j-2mid|\).
\(m\) 为奇数,那么还要加上 \(|a_{m/2+1}-mid|\).

现在我们考虑多个区间的贡献,直接枚举是 \(n^3\) 的。
考虑枚举中间的 G,然后向左,向右扩展,都要保证最中间的是枚举的那个 G。
具体是:先处理完 G 向左,向右没有 G 出现的所有区间,然后再把左边第一个,右边第一个 G 加入。
这样保证有奇数个 G.
只需要计算 \(\sum|a_i+a_j-(l+r)|\) 即可。
那么如何计算呢,我们只需用树状数组处理出 \(a_i+a_j\) 不大于 \((l+r)\) 的个数及和即可。

还要处理偶数个 G 的情况,相似的。

D P9379

posted @ 2023-08-07 21:45  s1monG  阅读(16)  评论(0)    收藏  举报