一、题目
输入样例:
4 3
2 5 4 3
2 1 3
3 2 4
4 2 4
输出样例:
-1
2
二、思路
根据题目画出线段图,发现应该是使用差分的方法;在天数判断上面是采用二分的思想
二分思想:因为当发现有一天不符合条件的时候,那么后面的订单都不符合,所以具有二段性
三、题解
#include <iostream>
#include <vector>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#define IOS() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define int long long
using namespace std;
const int N=1000006;
int a[N];
int r[N];
int d[N],s[N],t[N];
int b[N];//定义差分数组
int n,m;
bool cmp(int x,int y)
{
return x>y;
}
bool check(int mid){
for(int i =1;i<=n;i++)b[i]=r[i]-r[i-1]; //这个是全局的差分数组
for(int i =1;i<=mid;i++){ //在前mid天里面进行区间加减
b[s[i]]-=d[i];
b[t[i]+1]+=d[i];
}
for(int i=1;i<=n;i++){//判断是否满足条件
b[i]+=b[i-1];
if(b[i]<0){
return true;
}
}
return false;
}
signed main()
{
IOS();
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];
}
int l=1,r=m;
while(l<r){
int mid=(l+r)>>1;
if(check(mid)){
//如果不满足
r=mid;
}
else {
l=mid+1;
}
}
if(!check(m)){
cout<<0<<endl;
}
else {
cout<<"-1"<<endl<<r<<endl;
}
}