#2255. 「SNOI2017」炸弹

题目描述

在一条直线上有 NNN 个炸弹,每个炸弹的坐标是 XiX_iX​i​​,爆炸半径是 RiR_iR​i​​,当一个炸弹爆炸时,如果另一个炸弹所在位置 XjX_jX​j​​ 满足:

Xi−Ri≤Xj≤Xi+Ri X_i-R_i\leq X_j \leq X_i+R_iX​i​​−R​i​​≤X​j​​≤X​i​​+R​i​​

那么,该炸弹也会被引爆。

现在,请你帮忙计算一下,先把第 iii 个炸弹引爆,将引爆多少个炸弹呢?

输入格式

第一行,一个数字 NNN,表示炸弹个数。 第 2∼N+12\sim N+12∼N+1 行,每行 222 个数字,表示 XiX_iX​i​​,RiR_iR​i​​,保证 XiX_iX​i​​ 严格递增。

输出格式

一个数字,表示 ∑i=1ni×\sum \limits_{i=1}^n i\times​i=1​∑​n​​i× 炸弹 iii 能引爆的炸弹个数 mod109+7。

样例

样例输入

4
1 1
5 1
6 5
15 15

样例输出

32

样例解释

炸弹 1,2,3,41,2,3,41,2,3,4 分别能引爆 1,3,3,41,3,3,41,3,3,4 个炸弹,所以答案是 1×1+2×3+3×3+4×4=321\times 1+2\times 3+3\times 3+4\times 4=321×1+2×3+3×3+4×4=32。

数据范围与提示

20%20\%20% 的数据:N≤100N\leq 100N≤100
50%50\%50% 的数据:N≤1000N\leq 1000N≤1000
80%80\%80% 的数据:N≤100000N\leq 100000N≤100000
100%100\%100% 的数据:N≤500000N\leq 500000N≤500000,−1018≤Xi≤1018-10^{18}\leq X_i\leq 10^{18}−10​18​​≤X​i​​≤10​18​​,0≤Ri≤2×10180\leq R_i\leq 2\times 10^{18}0≤R​i​​≤2×10​18​​

数据范围与原题相同,但测试数据由本站会员自制,并非原数据。
时限已按照评测机速度调整,原题时限为2000ms,省选评测时调整为4000ms,这里按4000ms调整。

原题评测环境为Windows,栈空间2MB。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 1010
#define mod 1000000007
using namespace std;
long long X[maxn],R[maxn];
int n,head[maxn],num;
bool vis[maxn];
struct node{int to,pre;}e[maxn*maxn];
void Insert(int from,int to){
e[++num].to=to;
e[num].pre=head[from];
head[from]=num;
}
long long qread(){
long long i=,j=;
char ch=getchar();
while(ch<''||ch>''){if(ch=='-')j=-;ch=getchar();}
while(ch<=''&&ch>=''){i=i*+ch-'';ch=getchar();}
return i*j;
}
int bfs(int x){
int res=;
memset(vis,,sizeof(vis));
queue<int>q;q.push(x);vis[x]=;
while(!q.empty()){
int now=q.front();q.pop();
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(!vis[to]){
res++;
vis[to]=;
q.push(to);
}
}
}
return res;
}
int main(){
n=qread();
for(int i=;i<=n;i++)X[i]=qread(),R[i]=qread();
for(int i=;i<=n;i++){
for(int j=i-;j>=;j--){
if(X[i]-R[i]<=X[j])Insert(i,j);
else break;
}
for(int j=i+;j<=n;j++){
if(X[i]+R[i]>=X[j])Insert(i,j);
else break;
}
}
int ans=;
for(int i=;i<=n;i++){
int num=bfs(i);
ans=(ans+1LL*i*num%mod)%mod;
}
printf("%d",ans);
}

50分 暴力

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 500010
#define mod 1000000007
using namespace std;
long long X[maxn],R[maxn];
int n,l[maxn],r[maxn],ans;
long long qread(){
long long i=,j=;
char ch=getchar();
while(ch<''||ch>''){if(ch=='-')j=-;ch=getchar();}
while(ch<=''&&ch>=''){i=i*+ch-'';ch=getchar();}
return i*j;
}
int main(){
n=qread();
for(int i=;i<=n;i++)X[i]=qread(),R[i]=qread();
for(int i=;i<=n;i++){
l[i]=i;
while(l[i]>&&X[i]-X[l[i]-]<=R[i])
l[i]=l[l[i]-],R[i]=max(R[i],R[l[i]]-X[i]+X[l[i]]);
}
for(int i=n;i>=;i--){
r[i]=i;
while(r[i]<n&&X[r[i]+]-X[i]<=R[i])
r[i]=r[r[i]+],l[i]=min(l[i],l[r[i]]);
}
for(int i=;i<=n;i++)ans=(ans+1LL*i*(r[i]-l[i]+)%mod)%mod;
printf("%d",ans);
return ;
}

100分

 

loj #2255. 「SNOI2017」炸弹的更多相关文章

  1. loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点

    loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...

  2. loj #2254. 「SNOI2017」一个简单的询问

    #2254. 「SNOI2017」一个简单的询问 题目描述 给你一个长度为 NNN 的序列 aia_ia​i​​,1≤i≤N1\leq i\leq N1≤i≤N,和 qqq 组询问,每组询问读入 l1 ...

  3. LOJ——#2256. 「SNOI2017」英雄联盟

    https://loj.ac/problem/2256 题目描述 正在上大学的小皮球热爱英雄联盟这款游戏,而且打的很菜,被网友们戏称为「小学生」.现在,小皮球终于受不了网友们的嘲讽,决定变强了,他变强 ...

  4. LOJ2255. 「SNOI2017」炸弹 (线段树)

    本文为线段树做法 (听说可以tarjan缩点+拓扑? 感觉差不多..而且这样看起来方便很多 找到左端点的过程可以看作 点 -> 区间内lowerbound最小的点 -> lowerboun ...

  5. Loj #2256. 「SNOI2017」英雄联盟

    题目 我就是个丝薄 如果要用\(dp_i\)表示凑出\(i\)的最小花费显然不可能的 之后大力猜想能凑出来的状态不会很多,我的暴力也告诉我不是很多,好像也确实不多的样子,大概\(4e4\)左右 但是我 ...

  6. [LOJ#2255][BZOJ5017][Snoi2017]炸弹

    [LOJ#2255][BZOJ5017][Snoi2017]炸弹 试题描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足: ...

  7. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  8. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  9. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

随机推荐

  1. Python Twisted网络编程框架与异步编程入门教程

    原作出处:twisted-intro-cn 作者:Dave 译者:杨晓伟 luocheng likebeta 转载声明:版权归原作出处所有,转载只为让更多人看到这部优秀作品合集,如果侵权,请留言告知 ...

  2. 循序渐进Python3(十三) --1-- django之form表单

    在上一次的代码上做出进一步修改,使之能在页面上显示报错信息. views.py from django.shortcuts import render, HttpResponse from djang ...

  3. Color the ball (线段树的区间更新问题)

    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...

  4. bash&nbsp;shell笔记1&nbsp;脚本基础知识

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/505644 * ...

  5. Python之面向过程和面向对象的区别

    一.面向过程 1.面向过程:核心是过程二字,过程指的是解决问题的步骤,好比如设计一条流水线,是一种机械式的思维方式. 就是程序从上到下一步步执行,一步步从上到下,从头到尾的解决问题 .基本设计思路就是 ...

  6. 201671010127 2016-2017-8 回谈static修饰符

    上周学了泛型程序程序设计技术,再一次接触到了静态方法,那么今天就来谈一下static修饰符. static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块, ...

  7. 管理授权&管理决策&管理组织&管理目标

    [管理授权] 1.如果一个管理者不明白为公司培养人的责任,就很可能成为公司的瓶颈.这个问题的解决在于让管理者学会“授权”,把大部分自己紧抓不放的事情下放给部门内其他人做. 2.为一件事负责和亲自做是两 ...

  8. Docker学习之路(一)

    容器简介 管理程序虚拟化(hypervisor virtualization, HV)是通过中间虚拟运行于物理硬件之上.而容器是直接运行在操作系统内核之上用户空间.因此,容器虚拟化运行也成为“操作系统 ...

  9. Python3 使用selenium库登陆知乎并保存cookie为本地文件

    Python3 使用selenium库登陆知乎并保存cookie为本地文件 学习使用selenium库模拟登陆知乎,并将cookie保存为本地文件,然后供以后(requests模块)使用,用selen ...

  10. Part8-不用内存怎么行_我从内部看内存lesson1