洛谷P1083
Keywords: #algorithm
#solution
可以发现,当第 $ i $ 个订单可以满足时,第 $ i-1 $ 个订单也可以满足.
于是可以想到二分答案求解,差分计算每个订单,复杂度 $ O(n\log{n}) $ .
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long num[1000006];
long long r[1000006],n,m,res;
struct Node{
long long l,r,k;
}node[1000006];
int check(long long x){
res=0;
memset(num,0,sizeof num);
for(int i=1;i<=x;i++){
num[node[i].l]+=node[i].k;
num[node[i].r+1]-=node[i].k;
}
for(int i=1;i<=n;i++){
res+=num[i];
if(res>r[i]){
return 0;
}
}
return 1;
}
int main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&r[i]);
}
for(int i=1;i<=m;i++){
scanf("%lld%lld%lld",&node[i].k,&node[i].l,&node[i].r);
}
long long l=0,r=m;
while(l<r){
long long mid=(l+r+1)>>1;
if(check(mid)){
l=mid;
}
else{
r=mid-1;
}
}
if(l==m){
printf("0");
}
else{
printf("-1\n%d",l+1);
}
return 0;
}
注意开long long
(大悲)