30分求调
查看原帖
30分求调
1232175
Hu_Tianqi楼主2024/7/30 11:31

#1#2#3AC,其他全WA

#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct Node {
	int id, z;
	ll a, st, nd, ed;
	
	bool operator< (Node x) const {
		if (z != x.z) {
			return z < x.z;
		}else {
			return a > x.a;
		}
	}
};

Node x;

Node doing;
priority_queue<Node> pq;

int main () {
	doing.ed = -1LL;
	pq = priority_queue<Node>();
	
	while (cin >> x.id >> x.a >> x.nd >> x.z) {
		x.st = x.a;
		x.ed = x.st + x.nd;
		while (doing.ed < x.st) {
			if (doing.ed > -1) {
				printf("%i %lld\n", doing.id, doing.ed);
			}
			Node x;
			if (!pq.empty()) {
				x = pq.top();
				pq.pop();
				
				x.st = max(doing.ed, x.st);
				x.ed = x.st + x.nd;
				doing = x;
			}else {
				x = {0, 0, 0LL, 0LL, 0LL, -1};
				doing = x;
				break;
			}
//			printf("\ta%i %lld\n", doing.id, doing.ed);
		}
		pq.push(x);
		if (pq.top().z > doing.z) {
			auto x = pq.top();
			pq.pop();
			
			x.ed = x.st + x.nd;
			if (doing.ed > -1) {
				doing.nd -= x.st - doing.st;
				pq.push(doing);
			}
//			printf("\tb%i %lld %i %lld\n", doing.id, doing.nd, x.id, x.ed);
			doing = x;
		}
	}
	while (!pq.empty()) {
		if (doing.ed != -1) {
			printf("%i %lld\n", doing.id, doing.ed);
		}
		auto x = pq.top();
		pq.pop();
		
		x.ed = max(doing.ed, x.st) + x.nd;
		doing = x;
	}
	
	printf("%i %lld\n", doing.id, doing.ed);
	return 0;
}
2024/7/30 11:31
加载中...