20ptsWA求助&关于调试技巧
查看原帖
20ptsWA求助&关于调试技巧
234074
樱雪喵>w<楼主2022/7/9 11:13

RT,已经调一晚上加一上午了。有无大佬救救窝/kel

顺便问一句,线段树题有什么好的调试技巧吗,现在总是一调题就好几个小时还越调越错/ll

#include<bits/stdc++.h>
#define ls now<<1
#define rs now<<1|1
#define int long long
using namespace std;
typedef long long ll;
const ll N=5e5+5;
ll n,m,a[N],s[N],d[N],b[N];
struct node{
	ll sum,maxn;
}tr[N<<2];
ll lzh[N<<2],lzt[N<<2];
void build(ll now,ll l,ll r)
{
	if(l==r)
	{
		tr[now].sum=tr[now].maxn=0;
		return;
	}
	ll mid=(l+r)>>1;
	build(ls,l,mid);build(rs,mid+1,r);
	tr[now].sum=tr[ls].sum+tr[rs].sum;
	tr[now].maxn=tr[rs].maxn;
}
void push_down(ll now,ll l,ll r)
{
	ll mid=(l+r)>>1;
	if(lzh[now]!=-1)
	{
		lzh[ls]=lzh[now];lzh[rs]=lzh[now];
		tr[ls].sum=lzh[ls]*(mid-l+1);tr[rs].sum=lzh[rs]*(r-mid);
		lzt[ls]=lzt[rs]=0;
		tr[ls].maxn=lzh[ls]; tr[rs].maxn=lzh[rs];
		lzh[now]=-1;
	}
	if(lzt[now])
	{
		lzt[ls]+=lzt[now];lzt[rs]+=lzt[now];
		tr[ls].sum+=(s[mid]-s[l-1])*lzt[now];tr[ls].maxn+=a[mid]*lzt[now];
		tr[rs].sum+=(s[r]-s[mid])*lzt[now];tr[rs].maxn+=a[r]*lzt[now];
		lzt[now]=0;
	}
}
void modify(ll now,ll l,ll r,ll ml,ll mr,ll h)
{
	if(l==ml&&r==mr)
	{
		lzh[now]=h;
		tr[now].sum=(r-l+1)*h;
		tr[now].maxn=h;
		return;
	}
	ll mid=(l+r)>>1;
	push_down(now,l,r);
	if(mr<=mid) modify(ls,l,mid,ml,mr,h);
	else if(ml>mid) modify(rs,mid+1,r,ml,mr,h);
	else
	{
		modify(ls,l,mid,ml,mid,h);
		modify(rs,mid+1,r,mid+1,mr,h);
	}
	tr[now].sum=tr[ls].sum+tr[rs].sum;
	tr[now].maxn=max(tr[ls].maxn,tr[rs].maxn);
}
ll find(ll now,ll l,ll r,ll h)
{
	ll mid=(l+r)>>1;
	if(l==r) return l;
	push_down(now,l,r);
	if(tr[ls].maxn>=h) return find(ls,l,mid,h);
	return find(rs,mid+1,r,h);
}
ll query(ll now,ll l,ll r,ll ml,ll mr)
{
	if(l==ml&&r==mr) return tr[now].sum;
	ll mid=(l+r)>>1;
	push_down(now,l,r);
	if(mr<=mid) return query(ls,l,mid,ml,mr);
	if(ml>mid) return query(rs,mid+1,r,ml,mr);
	return query(ls,l,mid,ml,mid)+query(rs,mid+1,r,mid+1,mr);
}
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(ll i=1;i<=n;i++) 
	{
		scanf("%lld",&a[i]);
	}
	sort(a+1,a+n+1);
	for(ll i=1;i<=n;i++) s[i]=s[i-1]+a[i];
	memset(lzh,-1,sizeof(lzh));
	for(ll i=1;i<=m;i++)
	{
		scanf("%lld%lld",&d[i],&b[i]);
		lzt[1]+=d[i]-d[i-1];
		tr[1].sum+=s[n]*lzt[1];
		tr[1].maxn+=a[n]*lzt[1];
		push_down(1,1,n);
		ll w=find(1,1,n,b[i]);
		if(tr[1].maxn<=b[i])
		{
			cout<<"0"<<endl;
			continue;
		}
		if(query(1,1,n,w,n)-(n-w+1)*b[i]<0) cout<<"0"<<endl;
		else cout<<(ll)(query(1,1,n,w,n)-(n-w+1)*b[i])<<endl;
		modify(1,1,n,w,n,b[i]);
	}
	return 0;
}
/*
4 2
1 2 4 3
1 1
2 2
*/
2022/7/9 11:13
加载中...