目录:
【题目描述】
【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纠错,提问,博主一定尽力回答