G. Old Floppy Drive(st表+二分套二分,1900)

这篇博客介绍了如何解决一个关于环形磁盘的问题,其中指针按照特定规则行走并累计区域值。文章提出了利用二分查找策略确定满足条件的最少步数,并详细阐述了单调性的证明和前缀和数组结合ST表的处理方法。通过预处理和区间最值查询,实现了O(mlognlogn)的时间复杂度解决方案。
摘要由CSDN通过智能技术生成

题意: 给你一个环形的磁盘,对于磁盘的n个区域,每个区域有一个整数 a i a_i ai,你每次会将指针放到1号位置,它从1走到n,因为是环形,n之后又是1。
他对你进行m次询问,每次询问有一个数x,每当你的指针指向一个区域,会对贡献加上当前区域的值(可重复),当贡献至少为时,指针停下,让你输出指针每次走的步数。

思路: 显然,我们可以对走过的圈数进行二分,因为这显然有单调性。
证明:我们使用 s u m i sum_i sumi记录前i项的和。
如果 s u m n > 0 sum_n>0 sumn>0,那么单调性显然成立,因为如果当前满足,显然可以通过试着减少圈数去满足。如果当前不满足,就必须通过增加圈数来满足。
如果 s u m n < 0 sum_n<0 sumn<0,那么单调性也成立,因为如果当前满足,减少圈数必满足。如果当前不满足,就要通过减少圈数满足。

在我们二分了圈数之后,就需要考虑剩下的部分怎么处理。
假设我们当前走了 a a a圈,那么现在就有 a ∗ s u m n a*sum_n asumn的贡献,还需要至少 x − a ∗ s u m n x-a*sum_n xasumn的贡献,那么就是在前缀和数组中找到第一个 i i i,使得 s u m i ≥ x − a ∗ s u m n sum_i\ge x-a*sum_n sumixasumn,这时候就用 s t st st表维护一下前缀和数组的区间最值,然后二分找第一个合法的。

l o g 2 x log_2x log2x进行预处理,st表的查询复杂度降至 O ( 1 ) O(1) O(1),代码总的复杂度为 O ( m l o g n l o g n ) O(mlognlogn) O(mlognlogn)
代码:

#define int __int128
#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline int read()
{
	int x = 0,f = 1;
	char ch = gc();
	while(ch < '0' || ch > '9')
	{
		if(ch == '-')
			f = -1;
		ch = gc();
	}
	while(ch >= '0' && ch <= '9')
	{
		x = x * 10 + ch-'0';
		ch = gc();
	}
	return x * f;
}
int st[N][20],a[N],sum[N],lg[N];
int query(int k)
{
	int t = lg[k];
	return max(st[1][t],st[k-(1<<t)+1][t]);
}
void print(int x)
{
	if (!x) return ;
	if (x < 0) putchar('-'),x = -x;
	print(x / 10);
	putchar(x % 10 + '0');
}
signed main()
{
	int t=read();
	for(int i=2; i<N; i++)
		lg[i] = lg[i>>1] + 1;
	while(t--)
	{
		int n=read(),m=read();
		for(int i=1; i<=n; i++) a[i]=read(),sum[i]=sum[i-1]+a[i],st[i][0]=sum[i];
		for(int j=1; (1<<j)<=n; j++)
			for(int i=1; i+(1<<j-1)<=n; i++)
				st[i][j] = max(st[i][j-1],st[i+(1<<j-1)][j-1]);
		while(m--)
		{
			int x=read();
			int l = 0,r = 1e9,ans = 1e18;
			while(l<=r)
			{
				int mid = l+r>>1;
				int y = x - mid * sum[n];
				int ll = 1,rr = n,fg = 0;
				while(ll<=rr)
				{
					int mm = ll + rr >> 1;
					if(query(mm) >= y)
					{
						rr = mm - 1;
						ans = min(ans,mid*n+mm-1);
						fg = 1;
					}
					else
						ll = mm + 1;
				}
				if(fg)
					r = mid - 1;
				else
				{
					if(sum[n]<=0)
						r = mid - 1;
					else l = mid + 1;
				}

			}
			if(ans == 1e18)
				print(-1);
			else
			{
				if(!ans) printf("0");
				else print(ans);
			}
			printf(" ");
		}
		puts("");
	}



	return 0;
}
weixin073智慧旅游平台开发微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
python017基于Python贫困生资助管理系统带vue前后端分离毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值