求助啊,样例过都过不去,我觉得逻辑没问题吧
查看原帖
求助啊,样例过都过不去,我觉得逻辑没问题吧
1288805
hnyn楼主2024/3/6 04:21
 #include<iostream>
 using namespace std;
 const int N=1e6;
 int b[N],s[N],t[N];
 long long a[N],d[N];
 int n,m;
 int check(int mid){
     for(int i=1;i<=mid;i++){
          b[s[i]]+=d[i];
          b[t[i]+1]-=d[i];
     }//完成差分数组
     for(int i=1;i<=mid;i++){
         a[i]=b[i]+a[i-1];//完成对原序列的赋值
         if(a[i]<0){//存在负数说明mid过大
             return true;
         }
     }
     return false;
 }
 int main(){
     scanf("%d %d",&n,&m);
     for(int i=1;i<=n;i++){
         scanf("%lld",&a[i]);
     }//记录初始每天的教室 
     for(int i=1;i<=m;i++){
         scanf("%lld%d%d",&d[i],&s[i],&t[i]);//差分初始变量
         d[i]=-d[i]; //方便构造差分数组,做减法 
     }
     int l=1,r=m;
     while(l<r){
         int mid=l+r>>1;
         if(check(mid)){
             r=mid;//排除后面,答案在前面
         }
         else l=mid+1;
     }//二分答案check函数不会写,凸(艹皿艹 )
     if(l==m){
         printf("0");
     }else{
         printf("-1\n%d",r);
     }
     return 0;
 }
2024/3/6 04:21
加载中...