求救40分
查看原帖
求救40分
1126780
IamCLW楼主2025/7/28 13:07

代码如下

#include <iostream>
#include <algorithm>

namespace noip {
typedef long long Int;

constexpr Int MAX_N = 100000;
struct Equitment {
    Int pm, pp, sm, sp;
} es[MAX_N+1];
Int n, l, r, m, t;

bool cmp(Equitment a, Equitment b) {
	Int pa = std::max(a.pm, b.pm-a.pp), pb = std::max(b.pm, a.pm-b.pp);
	Int sa = std::max(a.sm, b.sm-a.sp), sb = std::max(b.sm, a.sm-b.sp); 
	return (pa==pb) ? (sa<sb) : (pa<pb);
}

bool isok1(Int p) {
	for (Int i = 1; i <= n; i++) {
		if (p < es[i].pm) return 0;
		p += es[i].pp;
	}
	return 1;
}

bool isok2(Int s) {
	for (Int i = 1; i <= n; i++) {
		if (s < es[i].sm) return 0;
		s += es[i].sp;
	}
	return 1;
}

void main() {
    std::cin >> t >> n;
    for (Int i = 1; i <= n; i++)
        std::cin >> es[i].pm >> es[i].sm >> es[i].pp >> es[i].sp;
    std::sort(es+1, es+1+n, noip::cmp);

    if (n == 0){
        std::cout << "0 0"; return ;
    }
    if (n == 1) {
        std::cout << es[1].pm << ' ' << es[1].sm ; return ;
    }
    l = 0, r = 1e18;
    while (r > l) {
    	m = l+(r-l)/2;
    	if (isok1(m)) r = m;
    	else l = m+1;
	} std::cout << r << ' ';
	
	l = 0, r = 1e18;
    while (r > l) {
    	m = l+(r-l)/2;
    	if (isok2(m)) r = m;
    	else l = m+1;
	} std::cout << r << std::endl;
} 
} int main() {
    noip::main();
    return 0;
}

https://www.luogu.com.cn/record/227336005

2025/7/28 13:07
加载中...