AC

元素周期表第51位  •  11天前


include

include

include

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;

}


评论:

请先登录,才能进行评论