QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#685569#9528. New Energy VehiclePHarrWA 0ms3548kbC++202.0kb2024-10-28 20:11:442024-10-28 20:11:44

Judging History

This is the latest submission verdict.

  • [2024-10-28 20:11:44]
  • Judged
  • Verdict: WA
  • Time: 0ms
  • Memory: 3548kb
  • [2024-10-28 20:11:44]
  • Submitted

answer

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;

#define int i64

using vi = vector<int>;
using pii = pair<int,int>;

const int inf = LLONG_MAX / 2;

void solve() {
	int n, m;
	cin >> n >> m;
	vi a(n + 1);
	for(int i = 1; i <= n; i ++) cin >> a[i];

	vi b = a;
	
	vector<pii> charge(m);
	for(auto &[x, t] : charge) cin >> x >> t;

	vi lst(n + 1, inf), suf(m + 1);
	
	for(int i = m - 1; i >= n; i --) {
		auto [pos, ti] = charge[i];
		suf[i] = lst[i], lst[ti] = i;
	}

	int now = 0;

	priority_queue<pii, vector<pii>, greater<pii>> bank;
	for(int i = 1; i <= n; i ++)
		bank.emplace(lst[i], i);

	for(int i = 0; i < m; i ++) {
		auto[x, t] = charge[i];
		while(now < x and not bank.empty()) {
			auto [it, p] = bank.top();
			bank.pop();
			int y = min(x - now, b[p]);
			now += y, b[p] -= y;
			if(b[p] > 0 and p != t) bank.emplace(it, p);
		}
		if(now == x) {
			b[t] = a[t];
			bank.emplace(suf[i], t);
		}else {
			break;
		}
	}
	for(auto i : b) {
		now += i;
	}
	cout << now << "\n";

}
i32 main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int n, m;
	cin >> n >> m;
	vector<array<int,3>> c(n + 1);

	for(int i = 1; i <= n; i ++) {
		 int w, l, r;
		 cin >> w >> l >> r;
		 c[i] = {w, l, r - l};
	}

	ranges::sort(c);

	int sum = 0, used = 0;
	for(int i = 1; i <= n; i ++) {
		auto [wi, li, ri] = c[i];
		sum += li * wi, used += li;
	}

	vi suf(n + 2), suf_used(n + 2);
	for(int i = n; i >= 1; i --) {
		suf[i] = suf[i + 1] + c[i][0] * c[i][2];
		suf_used[i] = suf_used[i + 1] + c[i][2];
	}

	int res = 0;
	for(int i = 1; i <= n; i ++) {
		int now_sum = sum - c[i][1] * c[i][0];
		int now_can = m - (used - c[i][1]);
		int l = i + 1, r = n + 1, it = -1;
		while(l <= r) {
			int mid = (l + r) / 2;
			if(suf_used[mid] <= now_can) it = mid, r = mid - 1;
			else l = mid + 1;
		}

		now_sum += suf[it];
		now_can -= suf_used[it];
		it --;
		now_sum += now_can * c[it][0];
		res = max(res, now_sum);
	}
	cout << res;
	return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3548kb

input:

2
3 1
3 3 3
8 1
2 2
5 2
1 2
2 1

output:

5

result:

wrong answer 1st lines differ - expected: '12', found: '5'