社区讨论

求问

P14174【MX-X23-T4】卡常数参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mlj5av3a
此快照首次捕获于
2026/02/12 15:36
上周
此快照最后确认于
2026/02/14 22:00
5 天前
查看原帖
code:
CPP
#include <bits/stdc++.h>
#define vt(x) vector <x>
#define it(x, n) x.begin() + 1, x.begin() + (n) + 1
#define int long long
#define len(x) (int)(x.size())
#define rep(i, s, t) for (int i = (s); i <= (t); i += 1)
#define func(type, para...) function <type(para)>
using namespace std;
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int n, k;
	cin >> n >> k;
	struct Num{
		int a, b;
		double r;
	};
	vt(vt(Num)) a(n + 1);
	vt(int) x(n + 1);
	rep(i, 1, n) {
		int l;
		cin >> x[i] >> l;
		a[i].assign(l + 1, Num());
		rep(j, 1, l)
			cin >> a[i][j].a;
		rep(j, 1, l)
			cin >> a[i][j].b;
		rep(j, 1, l)
			a[i][j].r = (double)a[i][j].b / a[i][j].a;
		sort(it(a[i], l), [&](Num x, Num y) {
			return x.r < y.r;
		});
	}
	vt(int) P = x;
	rep(i, 1, n)
		rep(j, 1, len(a[i]) - 1)
			P[i] *= a[i][j].a;
	struct Choice{
		int id, power;
		bool operator< (const Choice& y) const {
			return power < y.power;
		}
	};
	priority_queue <Choice> pq;
	rep(i, 1, n)
		pq.push({i, P[i] / a[i].back().a * a[i].back().b});
	while (k --) {
		int i = pq.top().id, power = pq.top().power;
		pq.pop();
		a[i].pop_back();
		P[i] -= power;
		if (!a[i].empty()) //hachimi
			pq.push({i, P[i] / a[i].back().a * a[i].back().b});
	}
	int ans = 0;
	rep(i, 1, n)
		ans += P[i];
	cout << ans << "\n";
	return 0;
}
code:
CPP
#include <bits/stdc++.h>
#define vt(x) vector <x>
#define it(x, n) x.begin() + 1, x.begin() + (n) + 1
#define int long long
#define len(x) (int)(x.size())
#define rep(i, s, t) for (int i = (s); i <= (t); i += 1)
#define func(type, para...) function <type(para)>
using namespace std;
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int n, k;
	cin >> n >> k;
	struct Num{
		int a, b;
		double r;
	};
	vt(vt(Num)) a(n + 1);
	vt(int) x(n + 1);
	rep(i, 1, n) {
		int l;
		cin >> x[i] >> l;
		a[i].assign(l + 1, Num());
		rep(j, 1, l)
			cin >> a[i][j].a;
		rep(j, 1, l)
			cin >> a[i][j].b;
		rep(j, 1, l)
			a[i][j].r = (double)a[i][j].b / a[i][j].a;
		sort(it(a[i], l), [&](Num x, Num y) {
			return x.r < y.r;
		});
	}
	vt(int) P = x;
	rep(i, 1, n)
		rep(j, 1, len(a[i]) - 1)
			P[i] *= a[i][j].a;
	struct Choice{
		int id, power;
		bool operator< (const Choice& y) const {
			return power < y.power;
		}
	};
	priority_queue <Choice> pq;
	rep(i, 1, n)
		pq.push({i, P[i] / a[i].back().a * a[i].back().b});
	while (k --) {
		int i = pq.top().id, power = pq.top().power;
		pq.pop();
		a[i].pop_back();
		P[i] -= power;
		if (!a[i].empty() && a[i].back().a != 0) //hachimi
			pq.push({i, P[i] / a[i].back().a * a[i].back().b});
	}
	int ans = 0;
	rep(i, 1, n)
		ans += P[i];
	cout << ans << "\n";
	return 0;
}
注意到,两段代码仅在第 5252 行不同(有注释 hachimi 的那一行),为什么仅加一个 a[i].back().a != 0 就能过? a[i].back().a != 0 应当恒为 true 的。
求问为什么会有这样的情况

回复

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

正在加载回复...