1 solutions

  • 0
    @ 2025-11-5 16:44:43

    C++ :

    /*
    暴力拿银牌,搜索是王道!
    */
    #include<cstdio>
    #include<cctype>
    #include<algorithm>
    #define Lowbit(x) x & (-x)
    using namespace std;
    
    int ret;
    char ch;
    int qin()
    {
        ret=0;
        while(ch=getchar(),!isdigit(ch));
        while(ret=ret*10+ch-'0',ch=getchar(),isdigit(ch));
        return ret;
    }
    
    struct dx{
    	int l,r;
    	long long s;
    };
    dx a[500001];
    
    int n,m;
    long long Ans;
    long long c[500001];
    int k[500001];
    
    bool comp(dx a,dx b){return a.r<b.r;}
    
    void add(int k,int x)
    {
    	while(k<=n)
    	{
    		c[k]+=x;
    		k+=Lowbit(k);
    	}
    }
    
    long long pr(int k)
    {
    	long long sum=0;
    	while(k)
    	{
    		sum+=c[k];
    		k-=Lowbit(k);
    	}
    	return sum;
    }
    
    int main()
    {
    	n=qin();m=qin();
    	for(int i=1;i<=n;i++) k[i]=qin();
    	for(int i=1;i<=m;i++)
    	{
    		a[i].l=qin();a[i].r=qin();a[i].s=qin();
    	}
    	sort(a+1,a+m+1,comp);
    	for(int i=1;i<=m;i++)
    	{
    		long long kk=pr(a[i].r)-pr(a[i].l-1);
    		if(kk>=a[i].s) continue;
    		int j=a[i].r;
    		long long sum=kk;
    		while(sum<a[i].s)
    		{
    			if(a[i].s-sum<=k[j])
    			{
    				Ans+=a[i].s-sum;
    				k[j]-=a[i].s-sum;
    				add(j,a[i].s-sum);
    				break;
    			}
    			add(j,k[j]);
    			Ans+=k[j];
    			sum+=k[j];
    			k[j]=0;
    			j--;
    		}
    	}
    	printf("%lld\n",Ans);
        return 0;
    }
    
    • 1

    Information

    ID
    17968
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By