☀️☃️☃️☃️☀️ • 2天前
using namespace std; int l1[200001], r1[200001], l2[200001], r2[200001]; int n; struct area {
int left, right;
bool operator < (area a2) {
return left < a2.left;
}
}; bool ableless(int mid) {
long long big = 0, small = 0;
for (int i = 1; i <= n; i++) {
if (l2[i] <= mid) small += r1[i];
else big += l1[i];
}
return small >= big;
} bool ablemore(int mid) {
long long big = 0, small = 0;
for (int i = 1; i <= n; i++) {
if (r2[i] >= mid) big += r1[i];
else small += l1[i];
}
return big >= small + 1;
} int main() {
int c, t;
cin >> c >> t;
while (t--) {
cin >> n;
int left = 1e9, right = 0, ll, rr, minv, maxv;
for (int i = 1; i <= n; i++) {
cin >> l1[i] >> r1[i] >> l2[i] >> r2[i];
left = min(left, l2[i]);
right = max(right, r2[i]);
}
ll = left, rr = right;
while (ll <= rr) {
int mid = (ll + rr) / 2;
if (ableless(mid)) {
minv = mid;
rr = mid - 1;
}
else ll = mid + 1;
}
ll = left, rr = right;
while (ll <= rr) {
int mid = (ll + rr) / 2;
if (ablemore(mid)) {
maxv = mid;
ll = mid + 1;
}
else rr = mid - 1;
}
vector<area> list; int ans = 0;
for (int i = 1; i <= n; i++) {
if (l2[i] > maxv || r2[i] < minv) continue;
list.push_back({ max(minv,l2[i]),min(maxv,r2[i]) });
}
sort(list.begin(), list.end());
for (area ar : list) {
if (ar.right >= minv) {
ans += ar.right - max(minv, ar.left) + 1;
minv = ar.right + 1;
}
}
cout << ans << endl;
}
}
评论:
请先登录,才能进行评论