[UOJ31]【UR #2】猪猪侠再战括号序列

题目大意:给你一个长度为$2n$的括号序列,保证$n$个`(`,$n$个`)`。要求输出一种可行方案,通过小于等于$n$的步数,每次交换区间$[x_i,y_i]$(立即交换),使得最后括号序列合法

题解:找到第一个`)`和最后一个`(`,交换

卡点:看成读入后一起交换

C++ Code:

#include <cstdio>
#include <algorithm>
#include <cstring>
struct _ {
	int id;
	char need;
} x, y;
char s[100010 << 1];
int n, m;
int ans[100010][2], tmp[2];
int main() {
	scanf("%s", s);
	n = strlen(s);
	x = (_) {0, ')'};
	y = (_) {n - 1, '('};
	tmp[1] = 0, tmp[0] = n - 1;
	int now = 1;
	while (x.id < y.id) {
		while (s[x.id] != x.need && x.id < y.id) x.id++, tmp[now] += now == 1 ? 1 : -1;
		while (s[y.id] != y.need && x.id < y.id) y.id--, tmp[now ^ 1] += now == 1 ? -1 : 1;
		if (x.id >= y.id) break;
		ans[m][0] = tmp[now], ans[m][1] = tmp[now ^ 1];
		if (ans[m][0] > ans[m][1]) std::swap(ans[m][0], ans[m][1]);
		m++;
		std::swap(x.need, y.need);
		now ^= 1;
	}
	printf("%d\n", m);
	for (int i = 0; i < m; i++) printf("%d %d\n", ans[i][0] + 1, ans[i][1] + 1);
}

猜你喜欢

转载自www.cnblogs.com/Memory-of-winter/p/9637225.html
今日推荐