5 solutions

  • 1
    @ 2024-7-27 11:40:17
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N=1e7+10;
    int n,m;
    int r[N],d[N],s[N],t[N];
    LL b[N];
    bool check(int k)
    {
    	for(int i=1;i<=n;i++)  //计算差分
       {
          b[i]=r[i]-r[i-1];
       }
    	for(int i=1;i<=k;i++) //处理前k个任务
       {
    		b[s[i]]-=d[i];
    		b[t[i]+1]+=d[i];
    	}
    	LL res=0;
    	for(int i=1;i<=n;i++)
       {
    		res+=b[i];
    		if(res<0)
          {
             return true; //某一天的任务不够
          }
    	}
    	return false; //任务可以满足
    }
    int main()
    {
    	cin>>n>>m;
    	for(int i=1;i<=n;i++) 
       {
          cin>>r[i]; //r[i]可以使用的教室数量
       }
    	for(int i=1;i<=m;i++) 
       {
          cin>>d[i]>>s[i]>>t[i]; //获取第i个任务的个数,起点,终点
       }
    	int l=1,r=m;
    	while(l<r) //枚举当前的任务个数
       {
    		int mid=l+r>>1;
    		if(check(mid))
          {
             r=mid; //1...mid个任务不能满足
          }
    		else
          {
             l=mid+1; //1...mid可以满足
          } 
    	}
    	if(check(r))
       {
          cout<<-1<<endl<<r;
       }
    	else
       {
          cout<<0;
       }
    	return 0;
    }
    
    • 1
      @ 2024-7-27 11:10:12
      #include<bits/stdc++.h>
      using namespace std;
      typedef long long LL;
      const int N=1e7+10;
      int n,m;
      int r[N],d[N],s[N],t[N];
      LL b[N];
      bool check(int k)
      {
      	for(int i=1;i<=n;i++)  //计算差分 
          {
              b[i]=r[i]-r[i-1];
          }
      	for(int i=1;i<=k;i++) //处理前k个任务 
          {
      		b[s[i]]-=d[i];
      		b[t[i]+1]+=d[i];
      	}
      	LL res=0;
      	for(int i=1;i<=n;i++)
          {
      		res+=b[i];
      		if(res<0) return true; //某一天的任务不够 
      	}
      	return false; //任务可以满足 
      }
      int main()
      {
      	scanf("%d%d",&n,&m);
      	for(int i=1;i<=n;i++) 
          {
              scanf("%d",&r[i]); //r[i]可以使用的教室数量 
          }
      	for(int i=1;i<=m;i++) 
          {
              scanf("%d%d%d",&d[i],&s[i],&t[i]); //获取第i个任务的个数,起点,终点 
          }
      	int l=1,r=m;
      	while(l<r) //枚举当前的任务个数 
          {
      		int mid=l+r>>1;
      		if(check(mid)) r=mid; //1...mid个任务不能满足 
      		else l=mid+1; //1...mid可以满足 
      	}
      	if(check(r)) printf("-1 \n%d",r);
      	else printf("0");
      	return 0;
      }
      
      
      
      • 0
        @ 2025-5-4 14:21:07
        
        10 10
        42323424 633675939 990396626 965164370 965164370 965164370 972489810 619351082 619351082 0
        586780256 2 9
        316471206 3 7
        42323424 1 3
        8081621 3 9
        36667522 3 7
        110729 3 6
        4572259 2 9
        7436169 7 9
        3834281 3 9
        8646496 4 9
        
        
        • -1
          @ 2024-7-12 10:04:33
          #include<bits/stdc++.h>
          using namespace std;
          typedef long long LL;
          const int N=1e7+10;
          int n,m;
          int r[N],d[N],s[N],t[N];
          LL b[N];
          bool check(int k)
          {
          	for(int i=1;i<=n;i++) 
              {
                  b[i]=r[i]-r[i-1];
              }
          	for(int i=1;i<=k;i++)
              {
          		b[s[i]]-=d[i];
          		b[t[i]+1]+=d[i];
          	}
          	LL res=0;
          	for(int i=1;i<=n;i++)
              {
          		res+=b[i];
          		if(res<0) return true;
          	}
          	return false;
          }
          int main()
          {
          	scanf("%d%d",&n,&m);
          	for(int i=1;i<=n;i++) 
              {
                  scanf("%d",&r[i]);
              }
          	for(int i=1;i<=m;i++) 
              {
                  scanf("%d%d%d",&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(r)) printf("-1 \n%d",r);
          	else printf("0");
          	return 0;
          }
          
          
          • -2
            @ 2024-4-17 18:57:48
            #include<bits/stdc++.h>
            using namespace std;
            typedef long long LL;
            const int N=1e7+10;
            int n,m;
            int r[N],d[N],s[N],t[N];
            LL b[N];
            bool check(int k)
            {
            	for(int i=1;i<=n;i++) 
                {
                    b[i]=r[i]-r[i-1];
                }
            	for(int i=1;i<=k;i++)
                {
            		b[s[i]]-=d[i];
            		b[t[i]+1]+=d[i];
            	}
            	LL res=0;
            	for(int i=1;i<=n;i++)
                {
            		res+=b[i];
            		if(res<0) return true;
            	}
            	return false;
            }
            int main()
            {
            	scanf("%d%d",&n,&m);
            	for(int i=1;i<=n;i++) 
                {
                    scanf("%d",&r[i]);
                }
            	for(int i=1;i<=m;i++) 
                {
                    scanf("%d%d%d",&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(r)) printf("-1 \n%d",r);
            	else printf("0");
            	return 0;
            }
            
            • 1

            Information

            ID
            198
            Time
            1000ms
            Memory
            256MiB
            Difficulty
            5
            Tags
            # Submissions
            28
            Accepted
            6
            Uploaded By