求助不知道哪里错误
查看原帖
求助不知道哪里错误
530500
Andy2035楼主2024/11/19 14:25
#include<bits/stdc++.h>
#define ls(x) x << 1
#define rs(x) x << 1 | 1
#define _for(i,x,y) for(int i = (x);i<=(y);i ++)

using namespace std;

typedef long long ll;
typedef pair<int,ll> pii;

const int N = 200010;
const ll inf = 2e18;

int lsh[N];
int x[N],y[N];
int ln;
ll v[N];

vector<pii> E[N];

ll f[N];
int n,m,k,d;

// segment tree
struct info{
	int l,r;ll tag,mx;
}t[N * 4];

void pushup(int u){
	t[u].mx= max(t[ls(u)].mx,t[rs(u)].mx);
	return;
}

void build(int u,int l,int r){
	t[u].l = l,t[u].r = r;
	if(l == r){t[u].tag = t[u].mx = 0ll;return;}
	int mid = l + r >> 1;
	build(ls(u),l,mid),build(rs(u),mid+1,r);
	pushup(u);
	return;
}

void maketag(int u,int x){
	t[u].tag += x,t[u].mx += x;
	return;
}

void pushdown(int u){
	maketag(ls(u),t[u].tag),maketag(rs(u),t[u].tag);
	t[u].tag = 0ll;
	return;
}

void modify(int u,int l,int r,int x){
	if(t[u].l>=l && t[u].r<=r)maketag(u,x);
	else if(t[u].l <= r && t[u].r >= l){
		pushdown(u);
		modify(ls(u),l,r,x),modify(rs(u),l,r,x);
		pushup(u);
	}
	return;
}

ll query(int u,int l,int r){
	if(t[u].l >= l && t[u].r <= r)return t[u].mx;
	else if(t[u].l <= r && t[u].r >= l){
		pushdown(u);
		return max(query(ls(u),l,r),query(rs(u),l,r));
	}
	return -inf;
}

//solve

void solve(){
	scanf("%d%d%d%d",&n,&m,&k,&d);
	_for(i,1,m*2)E[i].clear();
	memset(t,0,sizeof t);
	ln = 0;
	_for(i,1,m){
		scanf("%d%d%lld",&x[i],&y[i],&v[i]);
		int L = x[i] - y[i] + 1,R = x[i];
		lsh[++ln] = L,lsh[++ln] = R;
	}
	sort(lsh+1,lsh+1+ln);
	ln = unique(lsh+1,lsh+1+ln)-lsh-1;
	_for(i,1,m){
		int L = lower_bound(lsh+1,lsh+1+ln,x[i] - y[i] + 1) - lsh;
		int R = lower_bound(lsh+1,lsh+1+ln,x[i]) - lsh;
		E[R].push_back({L,v[i]});
	}
	build(1,1,ln);
	_for(i,1,ln){
		modify(1,i,i,((i==1||lsh[i] - lsh[i-1] > 1)?f[i-1]:f[i-2]) - d);
		if(i > 1)modify(1,1,i-1,-(ll)d * (lsh[i] - lsh[i-1]));
		for(auto x:E[i])modify(1,1,x.first,x.second);
		int st = lower_bound(lsh+1,lsh+1+ln,lsh[i] - k + 1) - lsh;
		ll cur = query(1,st,i);
		f[i] = max(f[i-1],cur);
	}
	printf("%lld\n",f[ln]); 
}

int c,T;



int main(){
	//freopen("P9871_1 (5).in","r",stdin);
	scanf("%d%d",&c,&T);
	while(T--)solve();
	return 0;
}
2024/11/19 14:25
加载中...