这个是错的:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
#define ll long long
#define ls now<<1
#define rs now<<1|1
#define mid ((l+r)>>1)
using namespace std;
const int N=2e4+10;
ll n,w,h,x[N<<1];
struct Scan
{
ll l,r,h,op;
bool operator < (const Scan &x) const
{
return h==x.h?op>x.op:h<x.h;
}
}line[N<<1];
struct tree
{
int l,r;
ll mx,tag;
}t[N<<2];
void pushup(int now){t[now].mx=max(t[ls].mx,t[rs].mx);}
void pushtag(int now,ll tag){t[now].mx+=tag,t[now].tag+=tag;}
void pushdown(int now)
{
ll &d=t[now].tag;
pushtag(ls,d),pushtag(rs,d);
d=0;
}
void build(int now,int l,int r)
{
t[now]=(tree){l,r,0ll,0ll};
if(l==r) return ;
build(ls,l,mid),build(rs,mid+1,r);
}
void update(int now,int L,int R,ll d)
{
int l=t[now].l,r=t[now].r;
if(L<=l&&r<=R) return pushtag(now,d);
pushdown(now);
if(L<=mid) update(ls,L,R,d);
if(R>mid) update(rs,L,R,d);
pushup(now);
}
int main()
{
while(~scanf("%lld%lld%lld",&n,&w,&h))
{
ll ans=0;
for(int i=1;i<=n;i++)
{
ll a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
x[2*i-1]=a;x[2*i]=a+w-1;
line[2*i-1]=(Scan){a,a+w-1,b,c};
line[2*i]=(Scan){a,a+w-1,b+h-1,-c};
}
n<<=1;
sort(x+1,x+n+1);sort(line+1,line+n+1);
int cnt=unique(x+1,x+n+1)-x-1;
for(int i=1;i<=n;i++)
line[i].l=lower_bound(x+1,x+cnt+1,line[i].l)-x,
line[i].r=lower_bound(x+1,x+cnt+1,line[i].r)-x;
build(1,1,cnt);
for(int i=1;i<n;i++)
{
Scan k=line[i];
update(1,k.l,k.r,k.op);
ans=max(ans,t[1].mx);
}
printf("%lld\n",ans);
}
return 0;
}
这样就对了:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
#define ll long long
#define ls now<<1
#define rs now<<1|1
#define mid ((l+r)>>1)
using namespace std;
const int N=2e4+10;
ll n,w,h,x[N<<1];
struct Scan
{
ll l,r,h,op;
bool operator < (const Scan &x) const
{
return h==x.h?op>x.op:h<x.h;
}
}line[N<<1];
struct tree
{
int l,r;
ll mx,tag;
}t[N<<2];
void pushup(int now){t[now].mx=max(t[ls].mx,t[rs].mx);}
void pushtag(int now,ll tag){t[now].mx+=tag,t[now].tag+=tag;}
void pushdown(int now)
{
ll &d=t[now].tag;
pushtag(ls,d),pushtag(rs,d);
d=0;
}
void build(int now,int l,int r)
{
t[now]=(tree){l,r,0ll,0ll};
if(l==r) return ;
build(ls,l,mid),build(rs,mid+1,r);
}
void update(int now,int L,int R,ll d)
{
int l=t[now].l,r=t[now].r;
if(L<=l&&r<=R) return pushtag(now,d);
pushdown(now);
if(L<=mid) update(ls,L,R,d);
if(R>mid) update(rs,L,R,d);
pushup(now);
}
ll a,b,c;
int main()
{
while(~scanf("%lld%lld%lld",&n,&w,&h))
{
ll ans=0;
for(int i=1;i<=n;i++)
{
scanf("%lld%lld%lld",&a,&b,&c);
x[2*i-1]=a;x[2*i]=a+w-1;
line[2*i-1]=(Scan){a,a+w-1,b,c};
line[2*i]=(Scan){a,a+w-1,b+h-1,-c};
}
n<<=1;
sort(x+1,x+n+1);sort(line+1,line+n+1);
int cnt=unique(x+1,x+n+1)-x-1;
for(int i=1;i<=n;i++)
line[i].l=lower_bound(x+1,x+cnt+1,line[i].l)-x,
line[i].r=lower_bound(x+1,x+cnt+1,line[i].r)-x;
build(1,1,cnt);
for(int i=1;i<n;i++)
{
Scan k=line[i];
update(1,k.l,k.r,k.op);
ans=max(ans,t[1].mx);
}
printf("%lld\n",ans);
}
return 0;
}
就是把 a,b,c 移到外面了/lengh