#P2481. 糖果共享(share)
糖果共享(share)
Description
【问题描述】
Jimmy 要和其他同学们一起分享老师带来的糖果了!可是,老师不想让同学们这么快就领到糖果,于是决定跟大家玩一个分享糖果的游戏。
老师让 n 个同学们围成一圈坐在一起。接下来,对于第 i 个同学,老师会在第 ti 秒发给TA 一份糖果;每次得到糖果之后,第 i 个同学会固定等待 pi 秒,然后把糖果分给身旁的第i + 1 个同学(特殊的情况是,第 n 个同学会把糖果分给第 1 个同学)。注意每个同学既可以从老师那里得到糖果,也可以从旁边的同学那里得到糖果,而且老师发的糖果足够多,同学们只要收到了糖果,就一定能将糖果分出去。同学们的分糖果动作非常快,可以认为是不占用时间的。
在参与游戏的同时,Jimmy 很想知道他的几个好朋友们最快什么时候能得到糖果。你能帮帮他吗?
【输入格式】
第一行一个整数 n,表示同学们的数量。
第二行 n 个整数 t1, t2, · · · , tn,表示每个同学收到老师给的糖果的时刻。
第三行 n 个整数 p1, p2, · · · , pn,表示每个同学收到糖果之后、将糖果分出去之前等待的
时间。
第四行一个整数 q,表示 Jimmy 的询问数量。
接下来 q 行,每行一个整数 xi,表示 Jimmy 想问第 xi 个同学最快什么时候能得到糖
果。
【输出格式】
输出共 q 行,每行一个整数,表示每个询问对应的答案。
【样例 1 输入】
3
3 10 100
4 1 5
2
2
3
【样例 1 输出】
7
8
【样例 1 解释】
以下是游戏开始后,每个时刻发生的事件:
1. 第 3 秒,第 1 个同学领到了老师给的一份糖果;
2. 第 7 秒,第 1 个同学将糖果分给了第 2 个同学(糖果是老师给的);
3. 第 8 秒,第 2 个同学将糖果分给了第 3 个同学(糖果是第 1 个同学给的);
4. 第 10 秒,第 2 个同学领到了老师给的一份糖果;
5. 第 11 秒,第 2 个同学将糖果分给了第 3 个同学(糖果是老师给的);
6. 第 13 秒,第 3 个同学领到了老师给的一份糖果;
可知,第 2 个同学最快在第 7 秒得到了糖果;第 3 个同学最快在第 8 秒得到了糖果。
接下来,游戏还会继续下去,同学们还会继续互相分糖果,但是不会再改变 Jimmy 问
题的答案了。
【样例 2 输入】
4
1 1 1 1
100 100 100 100
3
3
4
1
【样例 2 输出】
1
1
1
【样例 3 输入】
4
1 2 4 7
1 2 3 4
4
3
3
2
4
【样例 3 输出】
4
4
2
7
【样例 4 输入】
8
50 22 63 28 91 60 64 27
84 87 78 16 94 36 87 93
8
1
2
3
4
5
6
7
8
【样例 4 输出】
50
22
63
28
44
60
64
27
【测试点约束】
对于 30% 的数据,保证 $1 ≤ n, q ≤ 5000$。
对于 100% 的数据,保证 $1 ≤ n, q ≤ 2 × 10^5,1 ≤ t_i, p_i ≤ 10^9,1 ≤ x_i ≤ n$。
Hint
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
LL t[N], p[N], ans[N];
int main()
{
int n;scanf("%d", &n);
for (int i = 1; i <= n; i++)scanf("%lld", &t[i]);
for (int i = 1; i <= n; i++)scanf("%lld", &p[i]);
ans[1] = t[1];
for (LL i = n, x = 0; i > 1; i--){
x = x + p[i];
if (t[i] + x < ans[1])ans[1] = t[i] + x;
}
for (int i = 2; i <= n; i++){
ans[i] = ans[i - 1] + p[i - 1];
if (t[i] < ans[i])ans[i] = t[i];
}
int q;scanf("%d", &q);
for (int i = 1, x; i <= q; i++){
scanf("%d", &x);
printf("%lld\n", ans[x]);
}
return 0;
}
相关
在下列比赛中: