二分+一维前缀和--连续自然数和(luogu)

目录:

【题目描述】

【AC代码】

【stl中的二分】

【一些闲话】

【题目描述】

【AC代码】

 前缀和+二分

#include <bits/stdc++.h>
#define int long long
using namespace std;
int s[2000005];
signed main()
{
	int n;
	cin>>n;
	for(int i=1;i<n;i++)
	{
		s[i]+=s[i-1]+i;//统计前缀和
	}
	for(int i=1;i<=n;i++)
	{
		int target=s[i]+n;//目标是找到一个值为s[i]+n的前缀和,这样它与s[i]的差值才是n
		int index=lower_bound(s,s+n,target)-s;//stl二分,下文详细讲
		if(s[index]-s[i]==n)//如果存在前缀和值为s[i]+n
		{
			if(index!=i)//题目要求必须有两个数字
			{
				cout<<i+1<<" "<<index<<endl;
			}
		}
	}
	return 0;
}

【stl中的二分】

前提:数组从小到大

lower_bound( begin,end,num);

在数组的begin位置到end-1位置之间,通过二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。这就是为什么index要减s。(s代表数组的首地址)

upper_bound( begin,end,num);

与lower类似,只是它查找的是第一个大于num的数字,并返回地址

【一些闲话】

欢迎各位dalao纠错,提问,博主一定尽力回答

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值