本地跑大样例在 1.8s 左右但一交就 T,试图去掉 define int long long 没啥作用,求助是哪里常数写大了 /kk
#include<bits/stdc++.h>
#define il inline
using namespace std;
il long long read()
{
long long xr=0,F=1; char cr;
while(cr=getchar(),cr<'0'||cr>'9') if(cr=='-') F=-1;
while(cr>='0'&&cr<='9')
xr=(xr<<3)+(xr<<1)+(cr^48),cr=getchar();
return xr*F;
}
#define int long long
const int N=2e5+5;
int c,T,n,m,k,d;
struct node{int l,r,x,y,w;} a[N];
int b[N],tot,vis[N],f[N],Vs[N];
vector<int> R[N],L[N];
struct segtree
{
int tr[N<<2],lz[N<<2];
#define ls (x<<1)
#define rs (x<<1|1)
#define mid (l+r>>1)
void build(int x,int l,int r)
{
tr[x]=lz[x]=0;
if(l==r) return;
build(ls,l,mid),build(rs,mid+1,r);
}
il void pushdown(int x)
{
lz[ls]+=lz[x],lz[rs]+=lz[x];
tr[ls]+=lz[x],tr[rs]+=lz[x];
lz[x]=0;
}
void add(int x,int l,int r,int ml,int mr,int k)
{
if(ml>mr) return;
if(l==ml&&r==mr) {tr[x]+=k,lz[x]+=k;return;}
pushdown(x);
if(mr<=mid) add(ls,l,mid,ml,mr,k);
else if(ml>mid) add(rs,mid+1,r,ml,mr,k);
else add(ls,l,mid,ml,mid,k),add(rs,mid+1,r,mid+1,mr,k);
tr[x]=max(tr[ls],tr[rs]);
}
int getmx(int x,int l,int r,int ml,int mr)
{
if(l==ml&&r==mr) return tr[x];
pushdown(x);
if(mr<=mid) return getmx(ls,l,mid,ml,mr);
else if(ml>mid) return getmx(rs,mid+1,r,ml,mr);
else return max(getmx(ls,l,mid,ml,mid),getmx(rs,mid+1,r,mid+1,mr));
}
int query(int x,int l,int r,int pos)
{
if(l==r) return tr[x];
pushdown(x);
if(pos<=mid) return query(ls,l,mid,pos);
else return query(rs,mid+1,r,pos);
}
}tr,dt;
signed main()
{
c=read(),T=read();
while(T--)
{
tot=0;
n=read(),m=read(),k=read(),d=read();
for(int i=1;i<=m;i++)
{
int x=read(),y=read(); a[i].w=read();
a[i].r=x,a[i].l=x-y+1;
b[++tot]=a[i].r,b[++tot]=a[i].l;
}
sort(b+1,b+tot+1); tot=unique(b+1,b+tot+1)-b-1;
tr.build(1,0,tot),dt.build(1,0,tot);
for(int i=1;i<=m;i++)
{
a[i].x=lower_bound(b+1,b+tot+1,a[i].l)-b;
a[i].y=lower_bound(b+1,b+tot+1,a[i].r)-b;
if(a[i].r-a[i].l+1<=k) R[a[i].y].push_back(i),L[a[i].x].push_back(i);
}
tr.add(1,0,tot,0,0,-d),dt.add(1,0,tot,0,0,1);
for(int i=1;i<=tot;i++)
{
for(auto x:R[i])
{
tr.add(1,0,tot,0,a[x].x-1,a[x].w);
}
int pos=lower_bound(b+1,b+tot+1,b[i]-k+1)-b-2;
for(int j=pos+1;j;j--)
{
if(Vs[j]) break; Vs[j]=1;
for(auto x:L[j])
{
tr.add(1,0,tot,0,a[x].x-1,-a[x].w);
}
}
while(pos>=0&&!vis[pos])
{
vis[pos]=1;
int x=dt.query(1,0,tot,pos);
int lst=pos+1;
int len=b[i]-b[lst]+1;
tr.add(1,0,tot,pos,pos,d*x),tr.add(1,0,tot,pos,pos,-d*len);
dt.add(1,0,tot,pos,pos,len-x);
pos--;
}
pos=lower_bound(b+1,b+tot+1,b[i]-k+1)-b-1;
tr.add(1,0,tot,pos,i-2,-d*(b[i]-b[i-1])),dt.add(1,0,tot,pos,i-2,b[i]-b[i-1]);
f[i]=max(tr.getmx(1,0,tot,0,i-1),f[i-1]);
dt.add(1,0,tot,i,i,1),tr.add(1,0,tot,i,i,b[i]+1==b[i+1]?f[i-1]-d:f[i]-d);
}
printf("%lld\n",f[tot]);
for(int i=0;i<=tot;i++) L[i].clear(),R[i].clear(),vis[i]=0;
for(int i=0;i<=tot;i++) f[i]=0,Vs[i]=0;
}
return 0;
}