Music Notes(前缀和+二分)

链接:https://ac.nowcoder.com/acm/contest/1077/I
来源:牛客网

Music Notes
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
FJ is going to teach his cows how to play a song. The song consists of N (1 <= N <= 50,000) notes, and the i-th note lasts for Bi (1 <= Bi <= 10,000) beats (thus no song is longer than 500,000,000 beats). The cows will begin playing the song at time 0; thus, they will play note 1 from time 0 through just before time B1, note 2 from time B1 through just before time B1 + B2, etc.
However, recently the cows have lost interest in the song, as they feel that it is too long and boring. Thus, to make sure his cows are paying attention, he asks them Q (1 <= Q <= 50,000) questions of the form, “In the interval from time T through just before time T+1, which note should you be playing?” The cows need your help to answer these questions which are supplied as Ti (0 <= Ti <= end_of_song).
Consider this song with three notes of durations 2, 1, and 3 beats:
Beat: 0 1 2 3 4 5 6 …
|----|----|----|----|----|----|— …
1111111111 : :
22222: :
333333333333333:

Here is a set of five queries along with the resulting answer:
Query Note

2 2
3 3
4 3
0 1
1 1

输入描述:

  • Line 1: Two space-separated integers: N and Q
  • Lines 2…N+1: Line i+1 contains the single integer: Bi
  • Lines N+2…N+Q+1: Line N+i+1 contains a single integer: Ti
    输出描述:
  • Lines 1…Q: Line i of the output contains the result of query i as a single integer.
    示例1
    输入
    复制
    3 5
    2
    1
    3
    2
    3
    4
    0
    1

输出
复制

2
3
3
1
1

/*
这题时这场比赛的弱化版,下一题是强化版,这份代码均适用。
x先余前缀最大和,
然后二分第一个大于等于,
后面特判一下,如果等于的话,res+1即可。

*/

#include <iostream>

using namespace std;
const int MAXN = 5e4+5;
int s[MAXN];
int main()
{
    int n,q;
    cin>>n>>q;
    int x;
    s[0] = 0;
    for(int i = 1; i <= n; i++)
    {
        cin>>x;
        s[i] = s[i-1] + x;
    }
    while(q--)
    {
        cin>>x;
        x %= s[n];
        int l = 1, r = n,res = 0;
        while(l <= r)
        {
            int mid = (l + r) >> 1;
            if(x <= s[mid])
            {
                res = mid;
                r = mid - 1;
            }
            else l = mid + 1;
        }
        int ans = 0;
        if(x < s[res])
            ans = res;
        else
            ans = res + 1;
        cout<<ans<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leo Bliss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值