重金5块钱求解大佬帮忙看一下下面的代码!!!
  • 板块P1878 舞蹈课
  • 楼主quanjun
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/12/3 22:15
  • 上次更新2023/11/3 23:02:22
查看原帖
重金5块钱求解大佬帮忙看一下下面的代码!!!
291976
quanjun楼主2021/12/3 22:15

示例程序如下:

#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;
}

本题是使用优先队列解决的,然后开一个结构体,保存相邻两个节点的编号(用 llrr 表示),同时使用双向链表维护数据之间的关系,L[u]L[u] 表示 uu 的左指针连着的节点编号,R[u]R[u] 表示 uu 的有指针连着的节点编号。计算得到的数组放在容器 ansans 中,最后输出 ansans 的结果。

但是不知道哪里写错了,求教!

2021/12/3 22:15
加载中...