报错信息
91 Wrong Answer
#1 Wrong Answer 14ms 15.6 MiB
#1 Accepted 15ms 15.7 MiB
#2 Accepted 14ms 15.6 MiB
#3 Accepted 15ms 15.7 MiB
#4 Accepted 16ms 15.7 MiB
#5 Accepted 15ms 15.6 MiB
#6 Accepted 67ms 17.2 MiB
#7 Accepted 64ms 17.1 MiB
#8 Accepted 68ms 17.2 MiB
#9 Accepted 274ms 23.1 MiB
#10 Accepted 245ms 22.6 MiB
问题描述
在一条直线上有 NN 个炸弹,每个炸弹的坐标是 X_iX
i
,爆炸半径是 R_iR
i
,当一个炸弹爆炸时,如果另一个炸弹所在位置 X_jX
j
满足:
X_i-R_i\leq X_j \leq X_i+R_i
X
i
−R
i
≤X
j
≤X
i
+R
i
那么,该炸弹也会被引爆。
现在,请你帮忙计算一下,先把第 ii 个炸弹引爆,将引爆多少个炸弹呢?
输入
第一行,一个数字 NN,表示炸弹个数。
第 2\sim N+12∼N+1 行,每行 22 个数字,表示 X_iX
i
,R_iR
i
,保证 X_iX
i
严格递增。
输出
一个数字,表示 \sum \limits_{i=1}^n i\times
i=1
∑
n
i× 炸弹 ii 能引爆的炸弹个数 \mod 10^9+7mod10
9
+7。
样例
输入数据 1
4
1 1
5 1
6 5
15 15
输出数据 1
32
我的代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e6+10;
ll a[maxn], b[maxn], c[maxn], d[maxn];
int main(){
ll n, sum = 0;
// memset(a, 0, sizeof(a));
// memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
memset(d, 0, sizeof(d));
scanf("%lld", &n);
for(ll i = 1; i <= n; i++){
scanf("%lld %lld", &a[i], &b[i]);
c[i] = d[i] = i;
}
for(ll i = 1; i <= n; i++){
while(c[i] > 1 && a[i] - a[c[i]-1] <= b[i]){
c[i] = c[c[i]-1];
b[i] = max(b[i], b[c[i]] - (a[i] - a[c[i]]));
}
}
for(ll i = n; i >= 1; i--){
while(d[i] < n && a[d[i]+1] - a[i] <= b[i]){
d[i] = d[d[i]+1];
c[i] = min(c[i], c[d[i]]);
}
}
for(ll i = 1; i <= n ; i++){
sum = (sum + i * (d[i] - c[i] + 1)) % 1000000007;
}
printf("%lld", sum);
}
for嵌套太多层了