洛谷题目:借教室
好像前缀和、差分很喜欢和二分结合
#include<iostream>
#include<cstring>
using namespace std;
//链接:
const int N = 1e6 + 10;
int rooms[N];
int subRooms[N];
int d[N],s[N],t[N];
int n,m;
bool check(int ordNum)//查询前ordNum个订单能否成功
{
for (int i = 1; i <= n; i++)
{
subRooms[i] = rooms[i] - rooms[i-1];
}
for (int i = 1; i <= ordNum; i++)
{
subRooms[s[i]] -= d[i];
subRooms[t[i]+1] += d[i];
}
int r = 0;
for (int i = 1; i <= n; i++)
{
r += subRooms[i];
if(r<0)
return false;
}
return true;
}
int main()
{
cin >>n >>m;
for (int i = 1; i <= n; i++)
{
cin >> rooms[i];
}
for (int i = 1; i <= m; i++)
{
cin >> d[i] >> s[i] >> t[i];
}
if(check(m))
{
cout<<0<<endl;
return 0;
}
else
cout<<-1<<endl;
int min = 1;
int max = m;
int mid;
while(min <= max)
{
mid = min + (max-min)/2;
if(check(mid))
{
min=mid+1;
}
else
{
if(max==mid)
break;//说明找到了
max=mid;
}
}
cout << max;
}