TEl 最后四个点,求条
查看原帖
TEl 最后四个点,求条
416192
kbzcz楼主2023/12/5 13:50

rt,感觉是常数问题,应该怎么优化

bool _Start;
#include <bits/stdc++.h>
using namespace std;
#define LL long long 
#define il inline
#define Tp template<typename T>
#define Ts template<typename T,typename... _T>
Tp il void read(T& x) {
	x=0;bool f=0;char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f|=c=='-';
	for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	x=(f?-x:x);
}Ts il void read(T& x,_T&... y) {read(x),read(y...);}
const int N=4e5+5;
int n,m,K;
LL D;
struct node {
	int x,y;
	LL v;
}a[N];
LL f[N];
il bool cmp(node x,node y) {return x.y<y.y;}
int ln;
vector<int> ls(N,0);
LL mx[N<<1],lz[N<<1];
int lc[N<<1],rc[N<<1],trlen;
il int bt(int l,int r) {
	int p=++trlen;
	lc[p]=rc[p]=lz[p]=mx[p]=0;
	if(l==r) return mx[p]=1ll*(ls[l-1]+1)*D,p;
	int mid=(l+r)>>1;
	lc[p]=bt(l,mid);
	rc[p]=bt(mid+1,r);
	mx[p]=max(mx[lc[p]],mx[rc[p]]);
	return p;
}
il void change(int l,int r,int p,int x,int y,LL k) {
	if(l>=x&&r<=y) {
		mx[p]+=k;
		lz[p]+=k;
		return ;
	}
	int ls=lc[p],rs=rc[p];
	LL tlz=lz[p];
	mx[ls]+=tlz,mx[rs]+=tlz;
	lz[ls]+=tlz,lz[rs]+=tlz;
	lz[p]=0;
	int mid=(l+r)>>1;
	if(x<=mid) change(l,mid,lc[p],x,y,k);
	if(y>mid) change(mid+1,r,rc[p],x,y,k);
	mx[p]=max(mx[lc[p]],mx[rc[p]]);
}
il LL query(int l,int r,int p,int x,int y) {
	if(l>=x&&r<=y) return mx[p];
	int ls=lc[p],rs=rc[p];
	LL tlz=lz[p];
	mx[ls]+=tlz,mx[rs]+=tlz;
	lz[ls]+=tlz,lz[rs]+=tlz;
	lz[p]=0;
	int mid=(l+r)>>1;
	LL ans=0;
	if(x<=mid) ans=max(ans,query(l,mid,lc[p],x,y));
	if(y>mid) ans=max(ans,query(mid+1,r,rc[p],x,y));
	return ans;
}
il void clear() {
	trlen=0;
	ls.clear();
}
bool _End;
int main() {
	fprintf(stderr,"Memory: %.4lf Mib\n",(&_End-&_Start)/1048576.0);
	int C,T;read(C,T);
	while(T--) {
		clear();
		read(n,m,K,D);
		for(int i=1;i<=m;i++) {
			read(a[i].y,a[i].x,a[i].v);
			a[i].x=a[i].y-a[i].x+1;
			ls.emplace_back(a[i].x);
			ls.emplace_back(a[i].y);
			ls.emplace_back(a[i].x-1);
			ls.emplace_back(a[i].y+1);
		}
		sort(ls.begin(),ls.end());
		ls.erase(unique(ls.begin(),ls.end()),ls.end());
		for(int i=1;i<=m;i++) {
			a[i].x=lower_bound(ls.begin(),ls.end(),a[i].x)-ls.begin()+1;;
			a[i].y=lower_bound(ls.begin(),ls.end(),a[i].y)-ls.begin()+1;;
		}
		ln=ls.size();
		sort(a+1,a+1+m,cmp);
		bt(1,ln);
		for(int i=1,j=1,cnt=1;i<=ln;i++) {
			while(cnt<=m&&a[cnt].y<i) change(1,ln,1,1,a[cnt].x-1,a[cnt].v),cnt++;
			while(j<=ln&&ls[i-1]-K-1>ls[j-1]) j++;
			if(i>1) f[i]=max(f[i-1],query(1,ln,1,j,i-1)-1ll*ls[i-1]*D);
			change(1,ln,1,i,i,f[i]);
		}
		printf("%lld\n",f[ln]);
	}
	return 0;
}

可读性有点差

2023/12/5 13:50
加载中...