Descrição do título
FJ vai ensinar sua vaca a tocar uma música, composta por N (1 <= N <= 50.000) sílabas, numeradas de 1 a N, e deve ser tocada na ordem de 1 a N, e A sílaba dura B_i (1 <= B_i <= 10.000) batimentos, os batimentos são contados de 0, então a primeira sílaba é tocada do batimento 0 ao batimento B_1-1, de B_1 ao B_1 + B_2-1 É a segunda sílaba, e assim por diante.
Recentemente, as vacas não estão interessadas em tocar piano, elas se sentem muito chatas. Portanto, para manter as vacas focadas, FJ fez perguntas a Q (1 <= Q <= 50.000), o formato da pergunta é "qual sílaba é tocada no décimo ritmo",
cada pergunta corresponde a um T_i (0 <= T_i <= Número total de batidas-1) Por favor, ajude a vaca a resolvê-la.
Entrada
Na primeira linha, insira dois números inteiros separados por espaço N e Q.
Linhas 2 a N + 1 cada linha contém um número inteiro B_i linha
N + 2-N + Q + 1 linha cada linha contém um número inteiro T_i
Saída
A saída possui Q linhas e cada linha gera a resposta para a pergunta correspondente.
Entrada de amostra
3 5
2
1
3
2
3
4
0
1
Saída de amostra
2
3
3
1
1
Análise
É fácil pensar em violência, mas isso atinge o tempo limite.
Solução positiva: encontre o binário a [x] após o prefixo de um array e a pesquisa binária e produza mid ou l.
Código ativado
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,q,a[100001];
int main()
{
freopen("mnotes.in","r",stdin);
freopen("mnotes.out","w",stdout);
cin>>n>>q;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]=a[i-1]+a[i];//前缀和
}
for(register int i=1;i<=q;i++)
{
int x;
scanf("%d",&x);
x++;
int l=1,r=n,ff=0,mid;
while(l<=r)//二分找a[x]
{
mid=(l+r)/2;
if(a[mid]>x)
{
r=mid-1;
}
if(a[mid]<x)
{
l=mid+1;
}
if(a[mid]==x)
{
printf("%d\n",mid);
ff=1;
break;
}
}
if(!ff) printf("%d\n",l);
}
fclose(stdin);
fclose(stdout);
return 0;
}