社区讨论
萌新求助,每个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 条回复,欢迎继续交流。
正在加载回复...