题目
解题思路
比赛时,看到这道题目的时候,第一感觉用桶或者什么的。但是我怕时间超限,于是用了一个O(n log n)的做法,先用前缀和算出每一种音的边界,然后在线处理,逐个判断,本可以再优化的。因为只是第一道题,就没必要如此“复杂”。
代码
#include<cstdio>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
int g,n,k,t,a[50011];
int ef(int le,int ri)//二分
{
while (le<ri)
{
int mid=(le+ri)/2;
if (g<=a[mid]&&g>a[mid-1]) return mid;
if (g>a[mid]) le=mid+1; else ri=mid;
}
}
int main()
{
fre(mnotes);
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if (i==1) a[i]--;
t+=a[i]; a[i]=t;
}
a[0]=-1;
for (int i=1;i<=k;i++)
{
scanf("%d",&g);
printf("%d\n",ef(1,n));
}
}