代码如下
#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;
}