敢问各位奆佬这个问题是怎么回事
查看原帖
敢问各位奆佬这个问题是怎么回事
320605
初学者多高尚楼主2023/3/16 21:36

原题链接 Stars in Your Window

这个是错的:

#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,ca,b,c 移到外面了/lengh

2023/3/16 21:36
加载中...