玄关求条
查看原帖
玄关求条
755633
lucky_baizq楼主2024/11/26 18:33
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define pii pair<int,int>
#define pb push_back
#define fi first
#define se second

#define bzq "!!! tiaojiao"
 
const int N=200010;

int maxn[N<<2],lazy[N<<2];

int c,t,n,m,k,d,li[3*N],id,a[3*N],uid,dp[N];

vector<pii> f1[N];

int ls(int p){
	return p<<1;
}

int rs(int p){
	return p<<1|1;
}

int get2(int p){
	if(p>=0) return dp[p];
	return 0;
}

void build(int p,int l,int r){
	maxn[p]=0,lazy[p]=0;
	if(l==r) return ;
	int mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
}

void push2(int p,int k){
	lazy[p]+=k;
	maxn[p]+=k;
}

void push1(int p){
	push2(ls(p),lazy[p]);
	push2(rs(p),lazy[p]);
	lazy[p]=0;
}

void get1(int p){
	maxn[p]=max(maxn[ls(p)],maxn[rs(p)]);
}

void ins(int p,int l,int r,int l1,int r1,int k){
	if(l>=l1&&r1>=r){
		push2(p,k);
		return ; 
	}
	push1(p);
	int mid=(l+r)>>1;
	if(l1<=mid&&r1>=l)ins(ls(p),l,mid,l1,r1,k);
	if(r1>mid&&l1<=r)ins(rs(p),mid+1,r,l1,r1,k); 
	get1(p);
}

int up(int p,int l,int r,int l1,int r1){
	if(l1>r1)return 0;
	if(l>=l1&&r1>=r)
		return maxn[p];
	push1(p);
	int mid=(l+r)>>1;
	if(l1<=mid)return up(ls(p),l,mid,l1,r1);
	if(r1>mid) return up(rs(p),mid+1,r,l1,r1);
	return max(up(ls(p),l,mid,l1,r1),up(rs(p),mid+1,r,l1,r1));
}

struct jcd{
	int x,y,v,id;
}f[N];

int find1(int k){
	int l=1,r=uid,ans=0;
	while(l<=r){
		int mid=(l+r)>>1;
		if(a[mid]>=k)r=mid-1,ans=mid;
		else l=mid+1;
	}
	return ans;
} 

signed main(){
//	freopen("1.out","w",stdout);
	cin>>c>>t;
	while(t--){
		id=uid=0;
		cin>>n>>m>>k>>d;
		for(int i=1;i<=m;i++){
			cin>>f[i].x>>f[i].y>>f[i].v;
			f[i].y=f[i].x-f[i].y+1;
			swap(f[i].x,f[i].y);
			li[++id]=f[i].x;li[++id]=f[i].y;
		}
		li[id+1]=0;
		sort(li+1,li+1+id);
		for(int i=2;i<=id+1;i++){
//			cout<<li[i-1]<<" ";
		if(li[i]!=li[i-1])
		a[++uid]=li[i-1];
//		cout<<a[uid]<<" ";
		}
//		cout<<endl;
//		cout<<bzq;
		build(1,1,uid);
//		cout<<"wyq"<<endl;
		for(int i=0;i<=uid;i++){
			dp[i]=0;
		}
		for(int i=1;i<=m;i++){
			f[i].x=lower_bound(a+1,a+uid+1,f[i].x)-a;
			f[i].y=lower_bound(a+1,a+uid+1,f[i].y)-a;
			f1[f[i].y].pb({f[i].x,f[i].v});
		//	cout<<f[i].x<<" "<<f[i].y<<endl;
		}
//		for(int i=1;i<=uid;i++){
//			cout<<a[i]<<" ";
//		}
	//	cout<<bzq<<endl;
		for(int i=1;i<=uid;i++){
			for(pii op:f1[i]){
			ins(1,1,uid,1,op.fi,op.se);
		//	cout<<bzq<<endl;
			}
			int j=find1(a[i]-k+1);
		//	cout<<j<<" ";
		//	cout<<"wyq1"<<endl;
			dp[i]=max(dp[i],up(1,1,uid,j,i-1))-1ll*a[i]*d-1ll*d;
			int j1=i-2;
			if(a[i-1]!=a[i]-1)j1=i-1;
//			cout<<dp[i]<<" ";
//			cout<<j<<" ";
			dp[i]=max(dp[i],up(1,1,uid,i,i)+get2(j1)-d);
//			cout<<up(1,1,uid,i,i)<<endl;
			dp[i]=max(dp[i],dp[i-1]);
		//	cout<<"pp"<<endl;
			ins(1,1,uid,i,i,get2(j1)+a[i]*d);
		}
	//	for(int i=1;i<=uid;i++)
	//	cout<<dp[i]<<" ";
	//	cout<<endl;
		cout<<dp[uid]<<endl;
		for(int i=1;i<=uid;i++)
		f1[i].clear();
	}
	return 0;
}


2024/11/26 18:33
加载中...