52pts
查看原帖
52pts
827873
abc1856896楼主2025/1/28 17:38

RT.

#include<bits/stdc++.h>
#define int long long
#define INF 0x3f
using namespace std;
int tree[80005],lazy[80005];
void pushdown(int x) {
	if(lazy[x]) {
		tree[x*2]+=lazy[x];
		lazy[x*2]+=lazy[x];
		tree[x*2+1]+=lazy[x];
		lazy[x*2+1]+=lazy[x];
		lazy[x]=0;
	}
}
int query(int l,int r,int s,int t,int p) {
	if(l<=s && t<=r) return tree[p];
	if(l>t || r<s) return -INF;
	int m=s+((t-s)>>1),ans=-INF;
	pushdown(m);
	if(l<=m) ans=max(ans,query(l,r,s,m,p*2));
	if(r>m) ans=max(ans,query(l,r,m+1,t,p*2+1));
	return ans;
}
void update(int l,int r,int c,int s,int t,int p) {
	if(l<=s && t<=r) {
		lazy[p]+=c;
		tree[p]+=c;
		return;
	}
	if(l>t || r<s) return;
	int m=s+((t-s)>>1);
	pushdown(m);
	if(l<=m) update(l,r,c,s,m,p*2);
	if(r>m) update(l,r,c,m+1,t,p*2+1);
	tree[p]=max(tree[p*2],tree[p*2+1]);
}
int k,n,c;
struct node{
	int st;
	int en;
	int num;
}; 
bool cmp(node t1,node t2) {
	if(t1.en!=t2.en) return t1.en<t2.en;
	else return t1.st<t2.st;
}
node a[50005];
int b[50005];
int ans;
signed main() {
	cin>>k>>n>>c;
	for(int i=1;i<=k;i++) {
		cin>>a[i].st>>a[i].en>>a[i].num;
	}
	sort(a+1,a+k+1,cmp);
	for(int i=1;i<=k;i++) {
		int kk=query(a[i].st,a[i].en-1,1,n,1);
		ans+=min(a[i].num,c-kk);
		update(a[i].st,a[i].en-1,min(a[i].num,c-kk),1,n,1);
	}
	cout<<ans;
	return 0;
}
2025/1/28 17:38
加载中...