元素周期表第51位 • 11天前
using namespace std; int l1[200001], r1[200001], r2[200001], l2[200001]; int c, t, n, ai;
struct area {
int l2, r2;
bool operator<(area a2) {
return l2 < a2.l2;
}
}; vectorli;
bool ableless(int opp) {
long long big = 0, small = 0;
for (int i = 1; i <= n; i++)
if (l2[i] <= opp)
small += r1[i];
else
big += l1[i];
return small >= big;
}
bool ablemore(int opp) {
long long big = 0, small = 0;
for (int i = 1; i <= n; i++)
if (r2[i] >= opp)
big += r1[i];
else
small += l1[i];
return big >= small + 1;
}
int main() {
int left, right, ll, rr, minv, maxv, rr2, ans;
cin >> c >> t;
while (t--) {
cin >> n;
left = 1e9, right = 0, minv = 1e9, maxv = 0;
for (int i = 1; i <= n; i++) {
cin >> l1[i] >> r1[i] >> l2[i] >> r2[i];
left = min(l2[i], left);
right = max(r2[i], right);
}
ll = left, rr = right;
while (ll <= rr) {
int mid = (ll + rr) / 2;
if (ableless(mid)) {
rr = mid - 1;
minv = mid;
} else
ll = mid + 1;
}
ll = left, rr = right;
while (ll <= rr) {
int mid = (ll + rr) / 2;
if (ablemore(mid)) {
ll = mid + 1;
maxv = mid;
} else
rr = mid - 1;
}
li.clear();
for (int i = 1; i <= n; i++) {
if (l2[i] > maxv || r2[i] < minv)
continue;
li.push_back({max(minv, l2[i]), min(maxv, r2[i])});
}
sort(li.begin(), li.end());
ans = 0;
for (area a : li)
if (minv <= a.r2) {
ans += a.r2 - max(minv, a.l2) + 1;
minv = a.r2 + 1;
}
cout << ans << endl;
}
return 0;
}
评论:
请先登录,才能进行评论