无TLE,考场代码,80求调
查看原帖
无TLE,考场代码,80求调
1078013
qsn123楼主2024/10/20 21:23

WA在了#11-#14,大点都过了小点反而没过去

#include<bits/stdc++.h>
#define lowbit(x) x&-x
using namespace std;
const int N=200050;
long long tre[N][2]={0},sum[N]={0};
void add(int x,long long k,int op)
{
	for(int i=x;i<=N;i+=lowbit(i))
	{
		tre[i][op]+=k;
	}
	return ;
}
long long ask(int x,int op)
{
	long long ans=0;
	for(int i=x;i;i-=lowbit(i))
	{
		ans+=tre[i][op];
	}
	return ans;
}
int main()
{
	//freopen("t1.in","r",stdin);
	//freopen("t1.out","w",stdout);
	int n,t;
	long long w,sm;
	scanf("%d%d%lld",&n,&t,&w);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&sum[i]);
		sum[i]=sum[i-1]+sum[i];
	}
	sm=sum[n];
	int x,y,tp;
	long long z;
	while(t--)
	{
		scanf("%d%d%lld",&x,&y,&z);
		add(x,z,0);
		add(y+1,-z,0);
		add(x,x*z,1);
		add(y+1,-(y+1)*z,1);
		sm+=(long long)(y-x+1)*z;
		for(int i=1;i<=64;i++)
		{
			if(w<=(unsigned long long)sm*((1<<i)-1))
			{
				tp=i-1;
				break;
			}
		}
		int l=1,r=n;
		while(l<r)
		{
			int mid=(l+r)/2;
			long long ans=(sum[mid]+(mid+1)*ask(mid,0)-ask(mid,1));
			if((1<<tp)*ans+(((1<<tp)-1)*sm)<w)l=mid+1;
			else r=mid;
		}
		printf("%d\n",tp*n+l-1);
	}
	return 0;
} 
2024/10/20 21:23
加载中...