差分加前缀和加二分20pts全tle
查看原帖
差分加前缀和加二分20pts全tle
1077596
muzuki楼主2024/10/20 21:35

如题,本蒟蒻没学过线段树,大佬们能不能看看这份代码能不能再优化

#include <bits/stdc++.h>
using namespace std;
long long n,q,w,cf[200000+10],qzh[200000+10],qz[200000+10],ys[200000+10],ans[1000000+10];
int main(){
	cin>>n>>q>>w;
	for(int i=1;i<=n;i++)
	{
		cin>>ys[i];
		cf[i]=ys[i]-ys[i-1];
		qzh[i]=qzh[i-1]+ys[i];
	}
	for(int i=1;i<=q;i++)
	{
		int l,r,d;
		cin>>l>>r>>d;
		cf[l]+=d;
		cf[r+1]-=d;
		long long h=0,he=w;
		h+=cf[1];
		qz[1]=h;
		for(int i=2;i<=n;i++)
		{
			h+=cf[i];
			qz[i]=qz[i-1]+h;
		}
		while(he>0)
		{
			if(he>qz[n])
			{
				he-=qz[n];
				for(int j=1;j<=n;j++)
				{
					qz[j]*=2;
				}
				ans[i]+=n;
				continue;
			}
			else
			{
				int l=1,r=n;
				while(l<r)
				{
					long long mid=(l+r)>>1;
					if(qz[mid]>=he)
				{
				r=mid;
				}
				else{
					l=mid+1;
				}
				}
				ans[i]+=r-1;
				break;					
			}
		}
	}
	for(int i=1;i<=q;i++)
	{
		cout<<ans[i]<<endl;
	}
	return 0;
}
2024/10/20 21:35
加载中...