题目描述
WHM摆了N堆石子,但是他有点虚,不想合并这些石子,所以他问了ZYC一个非常简单的问题:从左往右数第k个石子在哪一堆里?现在ZYC把这个问题分享给大家一起开心开心。
输入
输入第一行是一个数N,表示石子堆数。
第二行N个用空格隔开的数a[i],表示从左往右第i堆有多少个石子。
第三行是一个数M,表示有M次询问。
第四行M个用空格隔开的数q[i],表示WHM希望知道第q[i]个石子属于哪一堆。
输出
输出共有M行,每一行表示第q[i]个石子属于哪一堆。
样例输入
2 7 3 4 9
3
1 25 11
样例输出
1
5
3
提示
对于100%的数据,1<=N<=10^6
1<= M <=10^5 1<=ai<=1000。
#pragma GCC optimize ("O3")//无耻的优化hhh
#include<iostream>
#include<cstdio>
using namespace std;
int n,a[1000001],m,q,sum[1000001];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]+=a[i]+sum[i-1];//前缀和
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&q);
int l=1,r=n;//二分初始化
while(l<r)//当左区间<右区间时,继续二分
{
int mid=(l+r)/2;
if(sum[mid]<q) l=mid+1;//如果当前前mid堆的和仍<目标石子,左区间=mid+1,继续二分
else if(sum[mid]>=q) r=mid;//同上,右区间=mid;
}
printf("%d\n",l);//最后l=r,输出哪个都没关系
}
}