刷刷原来的水题。。。主要是复习一下二分答案和差分思想。直接上代码咯,应该简单得很明显。。。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int n,m;
int room[maxn];
long long s[maxn],a[maxn];
struct node{
int d,l,r;
}x[maxn];
bool borrow(int t){
memset(a,0,sizeof a);
memset(s,0,sizeof s);
for (int i=1;i<=t;i++){
a[x[i].l]+=x[i].d;
a[x[i].r+1]-=x[i].d;
}
for (int i=1;i<=n;i++){
s[i]=s[i-1]+a[i];
if (s[i]>room[i]) return false;
}
return true;
}
int main(){
cin>>n>>m;
for (int i=1;i<=n;i++)
cin>>room[i];
for (int i=1;i<=m;i++)
cin>>x[i].d>>x[i].l>>x[i].r;
int i=1,j=m;
if (borrow(m)) {
cout<<0<<endl;
return 0;
}
while (i<j){
int mid=(i+j)/2;
if (borrow(mid)) i=mid+1;else j=mid;
}
cout<<-1<<endl<<i<<endl;
return 0;
}
回头把树上差分学完再发树上差分的题目。。。