1 solutions

  • 0
    @ 2024-12-11 0:25:37

    C++ :

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int K,n,c,ans=0;
    class ZKW{
    	public:
    	int T[2000010<<2],m1;
    	ZKW(){memset(T,0,sizeof(T)); m1=0;}
    	void build(){for(m1=1;m1<n+1;m1<<=1);}
    	void insert(int s,int t,int v){
    		int x=0;
    		for(s=s+m1-1,t=t+m1+1;s^t^1;s>>=1,t>>=1){
    			if(!(s&1)) T[s^1]+=v; if((t&1)) T[t^1]+=v;
    			x=min(T[s],T[s^1]),T[s]-=x,T[s^1]-=x,T[s>>1]+=x;
    			x=min(T[t],T[t^1]),T[t]-=x,T[t^1]-=x,T[t>>1]+=x;
    		}
    		for(;s>1;x=min(T[s],T[s^1]),T[s]-=x,T[s^1]-=x,T[s>>1]+=x,s>>=1);
    	}
        int ask(int s,int t){
    		int L=(1<<28),R=(1<<28);
    		for(s=s+m1-1,t=t+m1+1;s^t^1;s>>=1,t>>=1){
    			L+=T[s];R+=T[t];
    			if(!(s&1)) L=min(L,T[s^1]);if((t&1)) R=min(R,T[t^1]);
    		}
    		int res=min(L+T[s],R+T[t]); while(s>1) res+=T[s>>=1];
    		return res;
    	}
    }zkw;
    struct node{
    	int x,y,v;
    	bool operator<(const node &b)const{
    		if(y==b.y) return x<b.x;
    		return y<=b.y;
    	}
    }V[2000010]={0};
    int main(){
    	scanf("%d%d%d",&K,&n,&c);
    	for(int i=1;i<=K;++i){
    		scanf("%d%d%d",&V[i].x,&V[i].y,&V[i].v);
    		V[i].y=V[i].x+V[i].y-1;
    	}
    	sort(V+1,V+K+1);
    	zkw.build();zkw.T[1]=c;
    	for(int i=1;i<=K;++i){
    		int t=zkw.ask(V[i].x,V[i].y-1);
    		if(t>0){
    			ans+=min(t,V[i].v);
    			zkw.insert(V[i].x,V[i].y-1,-min(t,V[i].v));
    		}
    	}
    	printf("%d",ans);
    }
    
    
    • 1

    Information

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