ABC F 求调。
  • 板块学术版
  • 楼主TernaryTree
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/29 21:44
  • 上次更新2023/11/3 06:59:48
查看原帖
ABC F 求调。
362750
TernaryTree楼主2023/7/29 21:44

我是 F 调不出来 bot。

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int maxn = 1e6 + 10;

struct op {
	int t, v;
};

int n, m, ans;
op a[maxn];
int b[maxn];
int p[maxn], q[maxn];
int s[maxn], t[maxn];
int c[3];

signed main() {
	cin >> n >> m;
	for (int i = 1, t, v; i <= n; i++) {
		cin >> t >> v;
		if (t == 2) b[++c[2]] = v;
		else {
			++c[t];
			a[c[0] + c[1]] = {t, v};
		}
	}
	sort(b + 1, b + 1 + c[2], greater<int> ());
	sort(a + 1, a + 1 + c[0] + c[1], [] (op x, op y) {
		return x.v != y.v ? x.v > y.v : x.t < y.t;
	});
	for (int i = 1; i <= c[0] + c[1]; i++) {
		p[i] = p[i - 1] + (a[i].t == 1);
		q[i] = q[i - 1] + (a[i].t == 0);
		s[i] = s[i - 1] + (a[i].t == 0) * a[i].v;
		t[i] = t[i - 1] + (a[i].t == 1) * a[i].v;
	}
	for (int i = 1; i <= c[2]; i++) b[i] += b[i - 1];
	for (int k = 0; k <= c[2]; k++) {
		int v;
		int j = m - k, w = b[k];
		if (min(c[1], w) + c[0] < m) continue;
		else if (p[j] > w) {
			int l = 1, r = n;
			while (l <= r) {
				int mid = l + r >> 1;
				if (p[mid] < w) l = mid + 1;
				else r = mid - 1;
			}
			int re = p[j] - w;
			v = s[j] + t[l];
			l = 1, r = n;
			while (l <= r) {
				int mid = l + r >> 1;
				if (q[mid] - q[j] < re) l = mid + 1;
				else r = mid - 1;
			}
			v += s[l] - s[j];
		} else {
			v = s[j] + t[j];
		}
		ans = max(ans, v);
	}
	cout << ans << endl;
	return 0;
}

AC+WA+RE。求调

2023/7/29 21:44
加载中...