Loading

【题解】CF1672H Zigu Zagu

很简单一道 H,如果放在 F 前面可能会有 1k 人通过。

首先每次删除一定是极长合法串,所以一定是 \(\overline{x|x\cdots y|y}\) 中的 \(\overline{x\cdots y}\)

显然如果 \(x=y\),等于将两个 \(|\) 合并成一个 \(|\),如果 \(x\neq y\),就是将两个 \(|\) 同时删掉。

其中 \(|\) 表示的是 \(a_i = a_{i+1}\) 的断点,那么我们把 \(a_i\) 记为 \(|\) 的颜色。那么每次操作相当于删除一个断点,或者删除两个颜色不同的断点。所以答案就是两个颜色中更多的断点数量 \(+1\)

时间复杂度 \(\mathcal{O}(N)\)

#define N 200005
int n, q, a[N], b[N]; char s[N];
int main() {
	read(n, q);
	scanf("%s", s + 1);
	rep(i, 2, n){
		if(s[i] == s[i  - 1]){
			if(s[i] == '1')a[i] = 1;
			else b[i] = 1;
		}
	}
	rp(i, n)a[i] += a[i - 1], b[i] += b[i - 1];
	while(q--){
		int l, r; read(l, r);
		int x = a[r] - a[l], y = b[r] - b[l];
		printf("%d\n", max(x, y) + 1);
	}
	return 0;
}
posted @ 2022-04-24 16:02  7KByte  阅读(146)  评论(0编辑  收藏  举报