void solve()
{
int n, m;
cin >> n >> m;
vector<int> v(n + 2);
for (int i = 1; i <= n; i++) cin >> v[i];
for (int i = n; i >= 1; i--) v[i] -= v[i - 1];
struct datas
{
int d, s, t;
};
vector<datas> k(m + 1);
for (int i = 1; i <= m; i++) cin >> k[i].d >> k[i].s >> k[i].t;
int l = 1, r = m, mid, ans;
while (l <= r)
{
mid = l + (r - l) / 2;
auto check = [&]() -> bool
{
auto b = v;
for (int i = 1; i <= mid; i++)
{
b[v[i].s] -= v[i].d;
b[v[i].t + 1] += v[i].d;
}
int ans = 0;
for (int i = 1; i <= m; i++)
{
ans += b[i];
if (b[i] < 0) return 1;
}
return 0;
};
if (check()) r = (ans = mid) - 1;
else l = mid + 1;
}
cout << ans;
}Important
随着订单增加,每天可用教室的数量一定单调下降 我们可以二分求出第一天出现负值的订单编号 每个订单 我们会选择 全部减去 可以用差分来加速处理过程