为什么树状数组炸了?
查看原帖
为什么树状数组炸了?
917260
visit楼主2024/10/20 19:12

代码:

#include<bits/stdc++.h>
using namespace std;
int n,q,l,r;
long long w,d;
long long a[101000],sum[101000],b[101000];
int lowbit(int x)
{
	return x&(~x+1);
}
void add(long long x,int wz)
{
	while(wz<=n)
	{
		b[wz]+=x;
		wz+=lowbit(wz);
	}
}
long long count(int x)
{
	long long ans=0;
	while(x)
	{
		ans+=b[x];
		x-=lowbit(x);
	}
	return ans;
}
int main()
{
	cin>>n>>q>>w;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]),sum[i]=a[i]+sum[i-1];
		add(sum[i]-sum[i-1],i);
	}
	while(q--)
	{
		scanf("%d%d%lld",&l,&r,&d);
		add(d,l);
		add(-d,r+1);
		add(d*(r-l+1),r+1);
		add(-d*(r-l+1),n+1);
		int t=1,kk=0;
		long long ww=w;
		long long maxx=count(n);
//		cout<<maxx<<endl;
		while(ww>0)
		{
			ww-=maxx*t;
			t*=2;
			kk++;
		}
		kk--;
		t/=2;
		ww+=maxx*t;
//		cout<<kk<<" "<<ww<<endl;
		int ll=1,rr=n,mid,anss=0;
		while(ll<=rr)
		{
			mid=(ll+rr)>>1;
			if(count(mid)*t>=ww)
			{
				rr=mid-1;
			}
			else
			{
				anss=mid;
				ll=mid+1;
			}
		}
		printf("%d\n",anss+kk*n);
	}
	return 0;
}

MnZn感觉s组要炸了
哪个学校周日还要上课,就打了30min
2024/10/20 19:12
加载中...