You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

43 lines
1.7 KiB

2 years ago
#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
#define int long long
#define endl "\n"
int n, m; // 天数和订单的数量
int r[N]; // 第i天学校有r[i]个教室可借用
int d[N], s[N], t[N]; // 借的教室数目、从第s天借到t天
int cf[N]; // 差分数组
bool judge(int x) { // 判断能不能通过x个人
memset(cf, 0, sizeof(cf)); // 每次判断都要先初始化差分数组
int sum = 0; // 记录需要借的教室数
for (int i = 1; i <= x; i++) {
cf[s[i]] += d[i]; // 因为只会对在s~l之间要借用教室的人产生影响所以可以差分
cf[t[i] + 1] -= d[i]; // 差分//注意是t[i]+1因为要包含t[i]这个点
}
for (int i = 1; i <= n; i++) {
sum += cf[i]; // 因为cf是差分数组所以sum就是在第i天的借教室的总数
if (sum > r[i]) // 如果要借的教室多于空的教室
return false; // 不可行
}
return true; // 可行
}
signed main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> r[i];
for (int i = 1; i <= m; i++) cin >> d[i] >> s[i] >> t[i];
if (judge(m)) { // 如果全部满足
cout << '0'; // 输出0
return 0; // 直接结束程序
}
int l = 1;
int r = m; // 二分左右区间
while (l < r) {
int mid = (l + r) / 2;
if (judge(mid) == true) // 如果可行
l = mid + 1; // 增多满足人数
else // 否则
r = mid; // 减少满足人数
}
cout << "-1" << endl
<< l; // 输出-1和需要修改的人
}