社区讨论

萌新求助,每个Sub都只错一两个

P10784【MX-J1-T4】『FLA - III』Wrestle参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lylex37x
此快照首次捕获于
2024/07/14 18:28
2 年前
此快照最后确认于
2024/07/14 18:35
2 年前
查看原帖
大佬们救救我
代码
CPP
#include <bits/stdc++.h>
#define int long long
#define L first
#define R second
#define pii pair<int,int>
using namespace std;
const int N = 2e5 + 5, M = 5e3 + 5;
int n, m, k, w[N], v[N], redw[N], lsh[N * 10], lshcnt;
int u[N * 10], used[N * 10], fa[N], f[M][M], Id[N];
pii red[N], blue[N];
vector <int> J[N];
vector <int> W[N];
vector <int> V[N];
int id(int x) {return lower_bound(lsh + 1, lsh + lshcnt + 1, x) - lsh - 1;}
int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);}
void merge(int x, int y) {
    int fx = find(x), fy = find(y);
    if (fx == fy) return ;
    fa[fx] = fy;
}
signed main() {
    cin >> n >> m >> k;
    for (int i = 1; i <= m; i ++) fa[i] = i;
    for (int i = 1; i <= n; i ++) {
        auto &[x, y] = red[i];
        cin >> x >> y >> redw[i];
        lsh[++ lshcnt] = x;
        lsh[++ lshcnt] = y;
    }
    for (int i = 1; i <= m; i ++) {
        auto &[x, y] = blue[i];
        cin >> x >> y;
        lsh[++ lshcnt] = x;
        lsh[++ lshcnt] = y;
    }
    sort(lsh + 1, lsh + lshcnt + 1);
    lshcnt = unique(lsh + 1, lsh + lshcnt + 1) - lsh - 1;
    for (int i = 1; i <= n; i ++) {
        int l = id(red[i].L), r = id(red[i].R);
        for (int j = l; j <= r; j ++) u[j] = i;
    }
    for (int i = 1; i <= m; i ++) {
        int l = id(blue[i].L), r = id(blue[i].R);
        for (int j = l; j <= r; j ++) {
            if (!u[j]) continue;
            if (used[u[j]] == i) continue;
            // cerr << i << ' ' << u[j] << endl;
            used[u[j]] = i;
            w[i] += redw[u[j]];
            v[i] += min(blue[i].R, red[u[j]].R) - max(blue[i].L, red[u[j]].L) + 1;
            J[u[j]].push_back(i);
        }
    }
    for (int i = 1; i <= n; i ++)
        for (int j = 1; j < J[i].size(); j ++)
            merge(J[i][j], J[i][j - 1]);
    int tot = 0;
    for (int i = 1; i <= m; i ++) {
        int fx = find(i);
        if (!Id[fx]) Id[fx] = ++ tot; 
        W[Id[fx]].push_back(w[i]);
        V[Id[fx]].push_back(v[i]);
    }
    for (int i = 1; i <= tot; i ++) {
        for (int j = 0; j <= k; j ++) {
            f[i][j] = f[i - 1][j];
            for (int l = 0; l < W[i].size(); l ++) {
                if (j >= W[i][l])
                f[i][j] = max(f[i][j], f[i - 1][j - W[i][l]] + V[i][l]);
            }
        }
    }
    cout << f[tot][k] << endl;
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...