Description

在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足: 
Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆。 
现在,请你帮忙计算一下,先把第 i 个炸弹引爆,将引爆多少个炸弹呢? 

Input

第一行,一个数字 N,表示炸弹个数。 
第 2∼N+1行,每行 2 个数字,表示 Xi,Ri,保证 Xi 严格递增。 
N≤500000
−10^18≤Xi≤10^18
0≤Ri≤2×10^18

Output

一个数字,表示Sigma(i*炸弹i能引爆的炸弹个数),1<=i<=N mod10^9+7。 

如果一个炸弹能引爆另一个,就对应连一条有向边,询问即为查询每个点能到达的点中最左和最右分别是哪一个。由于边数较多,需要线段树优化建图,然后用tarjan将强连通分量缩点,缩点后在得到的DAG上逆拓扑序递推一下。时间复杂度O(nlogn),空间复杂度O(n)(线段树上的区间连边不需要记录,只要动态计算即可)。

#include<bits/stdc++.h>
typedef long long i64;
const int P=1e9+,N=5e5+;
char buf[N*],*ptr=buf-;
i64 _(){
i64 x=;
int c=*++ptr,f=;
while(c<)c=='-'?f=-:,c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x*f;
}
int n,mx,tk=,ss[<<|],sp=,ans=;
i64 xs[N],rs[N];
void mins(int&a,int b){if(a>b)a=b;}
void maxs(int&a,int b){if(a<b)a=b;}
struct node{
int l,r,dfn,low;
bool in;
void chk0(node&w){
mins(l,w.l),maxs(r,w.r);
}
void chk1(node&w){
mins(low,w.low);
chk0(w);
}
void chk2(node&w){
if(w.in)mins(low,w.dfn);
chk0(w);
}
}ns[<<|];
void tj(int);
void tje(int w,int u){
if(!ns[u].dfn){
tj(u);
ns[w].chk1(ns[u]);
}else ns[w].chk2(ns[u]);
}
void tj(int w){
ns[w].dfn=ns[w].low=++tk;
ns[w].in=;
ss[++sp]=w;
if(!ns[w].l)ns[w].l=n+;
if(w<mx){
tje(w,w<<);
tje(w,w<<^);
}else{
for(int l=mx+ns[w].l-,r=mx+ns[w].r+;r-l>;l>>=,r>>=){
if(~l&)tje(w,l+);
if(r&)tje(w,r-);
}
}
if(ns[w].dfn==ns[w].low){
int u;
do{
ns[u=ss[sp--]].in=;
ns[u].chk0(ns[w]);
}while(u!=w);
}
}
int main(){
fread(buf,,sizeof(buf),stdin);
n=_();
for(int i=;i<=n;++i)xs[i]=_(),rs[i]=_();
for(mx=;mx<=n+;mx<<=);
for(int i=;i<=n;++i){
ns[mx+i].l=std::lower_bound(xs+,xs+n+,xs[i]-rs[i])-xs;
ns[mx+i].r=std::upper_bound(xs+,xs+n+,xs[i]+rs[i])-xs-;
}
tj();
for(int i=;i<=n;++i){
node&w=ns[mx+i];
ans=(ans+i64(i)*(w.r-w.l+))%P;
}
printf("%d\n",ans);
return ;
}

bzoj5017: [Snoi2017]炸弹的更多相关文章

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

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

  2. [bzoj5017][Snoi2017]炸弹 tarjan缩点+线段树优化建图+拓扑

    5017: [Snoi2017]炸弹 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 608  Solved: 190[Submit][Status][ ...

  3. BZOJ5017 Snoi2017炸弹(线段树+强连通分量+缩点+传递闭包)

    容易想到每个炸弹向其能引爆的炸弹连边,tarjan缩点后bitset传递闭包.进一步发现每个炸弹能直接引爆的炸弹是一段连续区间,于是线段树优化建图即可让边的数量降至O(nlogn).再冷静一下由于能间 ...

  4. bzoj千题计划311:bzoj5017: [Snoi2017]炸弹(线段树优化tarjan构图)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5017 暴力: 对于每一个炸弹,枚举所有的炸弹,看它爆炸能不能引爆那个炸弹 如果能,由这个炸弹向引爆 ...

  5. BZOJ5017 [SNOI2017]炸弹 - 线段树优化建图+Tarjan

    Solution 一个点向一个区间内的所有点连边, 可以用线段树优化建图来优化 : 前置技能传送门 然后就得到一个有向图, 一个联通块内的炸弹可以互相引爆, 所以进行缩点变成$DAG$ 然后拓扑排序. ...

  6. BZOJ5017 [Snoi2017]炸弹[线段树优化建边+scc缩点+DAG上DP/线性递推]

    方法一: 朴素思路:果断建图,每次二分出一个区间然后要向这个区间每个点连有向边,然后一个环的话是可以互相引爆的,缩点之后就是一个DAG,求每个点出发有多少可达点. 然后注意两个问题: 上述建边显然$n ...

  7. bzoj5017 [Snoi2017]炸弹 (线段树优化建图+)tarjan 缩点+拓扑排序

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5017 题解 这个题目方法挺多的. 线段树优化建图 线段树优化建图的做法应该挺显然的,一个炸弹能 ...

  8. [SNOI2017]炸弹[线段树优化建图]

    [SNOI2017]炸弹 线段树优化建图,然后跑一边tarjan把点全部缩起来,炸一次肯定是有连锁反应的所以整个连通块都一样-于是就可以发现有些是只有单向边的不能忘记更新,没了. #include & ...

  9. BZOJ5017题解SNOI2017炸弹--玄学递推

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5017 分析 老师讲课谈到了这道题,课上想出了个连边建图然后乱搞的操作,被老师钦定的递推方 ...

随机推荐

  1. CodeForces - 441D: Valera and Swaps(置换群)

    A permutation p of length n is a sequence of distinct integers p1, p2, ..., pn (1 ≤ pi ≤ n). A permu ...

  2. Mac电脑使用:您的安全性偏好设置仅允许安装来自App Store和被认可的开发者的应用(解决方法)

    在10ms加速器上下载了MAC客户端ShadowsocksX,打开软件,提示打不开,因为来自身份不明的开发者. 以下为解决办法: Step1:打开dock栏里面的“系统偏好设置” Step2:在系统偏 ...

  3. react写单选按钮或table标签

    首先,原理是一样的: class Loca_choose_wrap extends Component{ constructor(){ super(); this.state={ port_name: ...

  4. C语言--第三周作业评分和总结(5班)

    作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1073 一.评分要求 要求1 完成PTA第三周所有题(20分). 要求2 4道 ...

  5. XML映射配置文件

    XML映射配置文件 http://www.mybatis.org/mybatis-3/configuration.html Type Handlers 类型处理器 每当MyBatis在Prepared ...

  6. stack 的一些用法

    #include<bits/stdc++.h> using namespace std; int32_t main() { stack<int> st; st.push(); ...

  7. mac电脑读写NTFS格式的移动硬盘命令

    diskutil info /Volumes/SAMSUNG | grep UUID echo "UUID=38EBE5E4-016F-44B7-9D55-BB4AF6DC3E1D none ...

  8. Spring MVC里面xss攻击的预防

    关于xss的介绍可以看 Asp.net安全架构之1:xss(跨站脚本)和 腾讯微博的XSS攻击漏洞 网页, 具体我就讲讲Spring MVC里面的预防: 第一种方法,使用Spring MVC web. ...

  9. java 标准输入输出System.in与System.out

    System.in System.in 是 InputStream 类的实例对象,该对象的创建是由本地(native)方法完成的. public static final InputStream in ...

  10. Java ThreadPoolTaskExecutor使用

    1. 配置 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http:/ ...