二分面积差最小答案
暴力往右枚举判断面积差是否变化
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mn = 10010;
struct node
{
int l, r, w, h;
} s[mn];
int N;
ll check(int mid)
{
ll sl = 0, sr = 0;
for (int i = 1; i <= N; i++)
{
if (s[i].r <= mid)
sl += (ll)s[i].w * s[i].h;
else if (s[i].l >= mid)
sr += (ll)s[i].w * s[i].h;
else
{
sl += (ll)s[i].h * (mid - s[i].l);
sr += (ll)s[i].h * (s[i].r - mid);
}
}
return sl - sr;
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int R;
scanf("%d", &R);
scanf("%d", &N);
for (int i = 1; i <= N; i++)
{
int l, t, w, h;
scanf("%d %d %d %d", &l, &t, &w, &h);
s[i].l = l, s[i].r = l + w, s[i].w = w, s[i].h = h;
}
int ans = -1;
int l = 0, r = R;
ll area = 1e18;
while (l <= r)
{
int mid = (l + r) / 2;
ll t = check(mid);
if (t < 0)
l = mid + 1;
else if (t >= 0) // 面积差尽可能小
{
area = min(area, t);
r = mid - 1;
ans = mid;
}
}
while (ans < R && check(ans + 1) == area) // 面积差相同时 ans尽可能大
ans++;
printf("%d\n", ans);
}
return 0;
}