0pts求调,玄关
查看原帖
0pts求调,玄关
957618
oyoham楼主2024/7/5 15:47
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
#define pint pair<int,int>
#define f first
#define s second
#define mp make_pair
inline ll read(){
	ll x=0;
	short f=1;
	char c=getchar();
	while(c>57||c<48){
		if(c==45) f=-1;
		c=getchar();
	}
	while(c<58&&c>47){
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}
	return x*f;
}
inline void write(ll x){
	if(x>>63) putchar(45),x=~x+1;
	if(9-x>>63) write(x/10);
	putchar(x%10|48);
}
int id=read(),t=read(),n,m,k,d;
int mx[1000005],lp[1000005],rp[1000005],lz[1000005];
#define ls (id<<1)
#define rs (ls|1)
#define mid (l+r>>1)
#define M (lp[id]+rp[id]>>1)
#define pu(id) mx[id]=max(mx[ls],mx[rs])
#define pd(id) mx[ls]+=lz[id],mx[rs]+=lz[id],lz[ls]+=lz[id],lz[rs]+=lz[id];lz[id]=0
void build(int id,int l,int r){
	lp[id]=l;rp[id]=r;mx[id]=0;
	if(l==r) return;
	build(ls,l,mid);
	build(rs,mid+1,r);
}
void modify(int id,int ql,int qr,int k){
	if(lp[id]>qr||rp[id]<ql) return;
	if(ql<=lp[id]&&rp[id]<=qr){
		lz[id]+=k;
		mx[id]+=k;
		return;
	}
	pd(id);
	modify(ls,ql,qr,k);
	modify(rs,ql,qr,k);
	pu(id);
}
int getmax(int id,int ql,int qr){
	if(lp[id]>qr||rp[id]<ql) return 0;
	if(ql<=lp[id]&&rp[id]<=qr) return mx[id];
	pd(id);
	return max(getmax(ls,ql,qr),getmax(rs,ql,qr));
}
pair<pint,int>ev[100005];
int s[200005],np;
int dp[200005];
signed main(){
	while(t--){
		n=read(),m=read(),k=read(),d=read();
		for(int i=1;i<=m;i++){
			int rp=read(),lp=rp-read()+1,v=read();
			ev[i]=mp(mp(rp,lp),v);
			s[i]=lp;s[i+m]=rp;
		}
		sort(s+1,s+1+m+m);
		int rl=unique(s+1,s+m+m+1)-s-1;
		build(1,1,rl);
		for(int i=1;i<=m;i++){
			ev[i].f.f=lower_bound(s+1,s+1+rl,ev[i].f.f)-s;
			ev[i].f.s=lower_bound(s+1,s+1+rl,ev[i].f.s)-s;
		}
		sort(ev+1,ev+1+m);
		np=1;	
		for(int i=1;i<=rl;i++){
			while(ev[np].f.f==i&&np<=m){
				modify(1,1,ev[np].f.s,ev[np].s);
				np++;
			}
			int pp=lower_bound(s+1,s+rl+1,s[i]-k+1)-s;
			dp[i]=getmax(1,pp,i-1)-d-d*s[i];
			int pos=max(0ll,i-1-!(s[i-1]^s[i]-1));
//			write(pos),putchar(10);
			dp[i]=max(dp[i],getmax(1,i,i)+dp[pos]-d);
			dp[i]=max(dp[i],dp[i-1]);
			modify(1,i,i,dp[pos]+s[i]*d);
		}
//		putchar(10);
//		for(int i=0;i<=rl;i++) write(dp[i]),putchar(10);
		write(dp[rl]);putchar(10);
	}
}
2024/7/5 15:47
加载中...