题目大意:给你一个长度为$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);
}