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;
}
可读性有点差