紀中週末訓練 2020.09.19【NOIP提高B組】模擬 T1:音樂節拍

2020-09-20 11:00:36

音樂節拍

Description

FJ準備教他的奶牛彈奏一首歌曲,歌曲由N(1<=N<=50,000)種音節組成,編號為1到N,而且一定按照從1到N的順序進行彈奏,第i種音節持續B_i(1<=B_i<=10,000)個節拍,節拍從0開始計數,因此從節拍0到節拍B_1-1彈奏的是第1種音節,從B_1到B_1+B_2-1彈奏的是第2種音節,依此類推。
  最近奶牛對彈琴不感興趣了,他們感覺太枯燥了。所以為了保持奶牛們注意力集中,FJ提出Q(1<=Q<=50,000)個問題,問題的格式都是「第T次節拍彈奏的是哪種音節」
  每個問題對應一個T_i(0<=T_i<=節拍總數-1)請你幫奶牛來解決。

Input

第一行輸入兩個空格隔開的整數N和Q
第2至N+1行每行包含一個整數 B_i
第N+2-N+Q_1行每行包含一個整數T_i

Output

輸出有Q行,每行輸出對應問題的答案。

Sample Input

3 5
2
1
3
2
3
4
0
1

Sample Output

2
3
3
1
1

反思&題解

比賽&正解思路: 求出每個節拍的區間,之後將詢問排一下序,列舉區間判斷輸出就行了(二分會更快,比賽的時候第一個想到的就是二分,結果調了挺久沒調出來我太弱了QAQ
反思: 普及T2難度的題目,不切還有臉見人???

CODE

#include<bits/stdc++.h>
using namespace std;
struct arr
{
	int x,num;
}t[50005];
int n,q,jp[50005][2],b[50005],ans[50005];
bool cmp(arr u,arr v)
{
	return u.x<v.x;
}
int main()
{
	freopen("mnotes.in","r",stdin);
	freopen("mnotes.out","w",stdout);
	scanf("%d%d",&n,&q);
	int i;
	jp[0][1]=-1;
	for (i=1;i<=n;i++)
	{
		scanf("%d",&b[i]);
		jp[i][0]=jp[i-1][1]+1;
		jp[i][1]=jp[i][0]-1+b[i];
	}
	for (i=1;i<=q;i++)
	{
		scanf("%d",&t[i].x);
		t[i].num=i;
	}
	sort(t+1,t+1+q,cmp);
	int j=1;
	for (i=1;i<=n;i++)
	{
		while (t[j].x>=jp[i][0] && t[j].x<=jp[i][1])
		{
			ans[t[j].num]=i;
			j++;
			if (j>q) break;
		}
		if (j>q) break;
	}
	for (i=1;i<=q;i++)
		printf("%d\n",ans[i]);
	return 0;
}