示例程序如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200020;
int n, a[maxn], L[maxn], R[maxn];
char s[maxn];
bool vis[maxn];
struct Pair {
int l, r;
bool operator < (const Pair& b) const {
return abs(a[l]-a[r]) > abs(a[b.l]-a[b.r]) || abs(a[l]-a[r]) == abs(a[b.l]-a[b.r]) && l > b.l;
}
};
priority_queue<Pair> que;
vector<Pair> ans;
int main() {
cin >> n >> s+1;
for (int i = 1; i <= n; i ++) {
cin >> a[i];
L[i] = i-1;
R[i] = i+1;
}
for (int i = 1; i < n; i ++) if (s[i] != s[i-1]) que.push({i, i+1});
while (!que.empty()) {
Pair u = que.top();
que.pop();
int l = u.l, r = u.r;
if (!vis[l] && !vis[r]) {
ans.push_back(u);
vis[l] = vis[r] = true;
int ll = L[l], rr = R[r];
R[ll] = rr;
L[rr] = ll;
if (ll > 0 && rr <= n && s[ll] != s[rr]) {
assert(!vis[ll] && !vis[rr]);
que.push({ll, rr});
}
}
}
cout << ans.size() << endl;
for (auto x : ans) cout << x.l << " " << x.r << endl;
return 0;
}
本题是使用优先队列解决的,然后开一个结构体,保存相邻两个节点的编号(用 l 和 r 表示),同时使用双向链表维护数据之间的关系,L[u] 表示 u 的左指针连着的节点编号,R[u] 表示 u 的有指针连着的节点编号。计算得到的数组放在容器 ans 中,最后输出 ans 的结果。
但是不知道哪里写错了,求教!