社区讨论

为什么树状数组炸了?

P11217【MX-S4-T1】「yyOI R2」youyou 的垃圾桶参与者 4已保存回复 13

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
13 条
当前快照
1 份
快照标识符
@m2hhzov5
此快照首次捕获于
2024/10/20 19:21
去年
此快照最后确认于
2025/11/04 23:50
4 个月前
查看原帖
代码:
CPP
#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

回复

13 条回复,欢迎继续交流。

正在加载回复...