bzoj5017 炸弹 (线段树优化建图+tarjan+拓扑序dp)
直接建图边数太多,用线段树优化一下
然后缩点,记下来每个点里有多少个炸弹
然后按拓扑序反向dp一下就行了
#include<bits/stdc++.h>
#define pa pair<ll,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=5e5+,maxp=maxn*,maxl=maxn*,P=1e9+;
const ll inf=1e18+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int N;
ll pos[maxn],r[maxn];
int rg[maxn][],id[maxn],ch[maxp][],pct,root;
int eg[maxl][],egh[maxp],ect;
int eg2[maxl][],egh2[maxp],ect2,ine[maxp];
int dfn[maxp],low[maxp],tot,stk[maxp],sh;
int bel[maxp],nct,hav[maxp],hh[maxp];
int val[maxp],rk[maxp];
bool instk[maxp],islef[maxp],to[maxp];
queue<int> q; inline void adeg(int a,int b){
eg[++ect][]=b;eg[ect][]=egh[a];egh[a]=ect;
}
inline void adeg2(int a,int b){
ine[b]++;
eg2[++ect2][]=b;eg2[ect2][]=egh2[a];egh2[a]=ect2;
} void build(int &p,int l,int r){
p=++pct;
if(l==r) id[l]=p,islef[p]=;
if(l<r){
int m=l+r>>;
build(ch[p][],l,m);
build(ch[p][],m+,r);
adeg(p,ch[p][]),adeg(p,ch[p][]);
}
} void conn(int p,int l,int r,int x,int y,int z){
if(x>y) return;
if(x<=l&&r<=y){
adeg(z,p);
}else{
int m=l+r>>;
if(x<=m) conn(ch[p][],l,m,x,y,z);
if(y>=m+) conn(ch[p][],m+,r,x,y,z);
}
} void tarjan(int x){
dfn[x]=low[x]=++tot;
stk[++sh]=x;instk[x]=;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];
if(instk[b]) low[x]=min(low[x],dfn[b]);
else if(!dfn[b]){
tarjan(b);
low[x]=min(low[x],low[b]);
}
}
if(dfn[x]==low[x]){
++nct;
while(sh){
bel[stk[sh]]=nct;
hav[stk[sh]]=hh[nct],hh[nct]=stk[sh];
val[nct]+=islef[stk[sh]];
instk[stk[sh]]=;
sh--;
if(stk[sh+]==x) break;
}
}
} int main(){
//freopen(".in","r",stdin);
int i,j,k;
N=rd();
for(i=;i<=N;i++) pos[i]=rd(),r[i]=rd();
for(i=;i<=N;i++){
rg[i][]=lower_bound(pos+,pos+N+,pos[i]-r[i])-pos;
rg[i][]=upper_bound(pos+,pos+N+,pos[i]+r[i])-pos-;
// printf("%d %d %d\n",i,rg[i][0],rg[i][1]);
}
build(root,,N);
for(i=;i<=N;i++){
conn(root,,N,rg[i][],i-,id[i]);
conn(root,,N,i+,rg[i][],id[i]);
}
for(i=;i<=pct;i++){
if(!dfn[i]) tarjan(i);
}
for(i=;i<=nct;i++){
for(j=hh[i];j;j=hav[j]){
for(k=egh[j];k;k=eg[k][]){
int bb=bel[eg[k][]];if(bb==i) continue;
if(!to[bb]) adeg2(i,bb),to[bb]=;
}
} for(j=hh[i];j;j=hav[j]){
for(k=egh[j];k;k=eg[k][]){
int bb=bel[eg[k][]];
to[bb]=;
}
}
}
int nn=;
for(i=;i<=nct;i++){
if(!ine[i]) q.push(i);
}
while(!q.empty()){
int p=q.front();q.pop();
rk[++nn]=p;
for(i=egh2[p];i;i=eg2[i][]){
int b=eg2[i][];
if(--ine[b]==) q.push(b);
} }
for(i=nct;i;i--){
int p=rk[i];
for(j=egh2[p];j;j=eg2[j][]){
int b=eg2[j][];
val[p]+=val[b];
}
}
ll ans=;
for(i=;i<=N;i++){
ans=(ans+1ll*i*val[bel[id[i]]])%P;
}
printf("%lld\n",ans);
return ;
}
bzoj5017 炸弹 (线段树优化建图+tarjan+拓扑序dp)的更多相关文章
- 【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序
题目描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足: Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆. 现在 ...
- BZOJ5017 [SNOI2017]炸弹 - 线段树优化建图+Tarjan
Solution 一个点向一个区间内的所有点连边, 可以用线段树优化建图来优化 : 前置技能传送门 然后就得到一个有向图, 一个联通块内的炸弹可以互相引爆, 所以进行缩点变成$DAG$ 然后拓扑排序. ...
- bzoj5017 [Snoi2017]炸弹 (线段树优化建图+)tarjan 缩点+拓扑排序
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5017 题解 这个题目方法挺多的. 线段树优化建图 线段树优化建图的做法应该挺显然的,一个炸弹能 ...
- BZOJ5017 炸弹(线段树优化建图+Tarjan+拓扑)
Description 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足: Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被 ...
- 『炸弹 线段树优化建图 Tarjan』
炸弹(SNOI2017) Description 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸 时,如果另一个炸弹所在位置 Xj 满足: Xi−Ri≤Xj≤Xi ...
- Libre OJ 2255 (线段树优化建图+Tarjan缩点+DP)
题面 传送门 分析 主体思路:若x能引爆y,从x向y连一条有向边,最后的答案就是从x出发能够到达的点的个数 首先我们发现一个炸弹可以波及到的范围一定是坐标轴上的一段连续区间 我们可以用二分查找求出炸弹 ...
- 模拟赛T2 线段树优化建图+tarjan+拓扑排序
然而这只是 70pts 的部分分,考场上没想到满分怎么做(现在也不会) code: #include <cstdio> #include <string> #include & ...
- 炸弹:线段树优化建边+tarjan缩点+建反边+跑拓扑
这道题我做了有半个月了...终于A了... 有图为证 一句话题解:二分LR线段树优化建边+tarjan缩点+建反边+跑拓扑统计答案 首先我们根据题意,判断出来要炸弹可以连着炸,就是这个炸弹能炸到的可以 ...
- 【2019.7.26 NOIP模拟赛 T3】化学反应(reaction)(线段树优化建图+Tarjan缩点+拓扑排序)
题意转化 考虑我们对于每一对激活关系建一条有向边,则对于每一个点,其答案就是其所能到达的点数. 于是,这个问题就被我们搬到了图上,成了一个图论题. 优化建图 考虑我们每次需要将一个区间向一个区间连边. ...
随机推荐
- 【JVM.4】调优案例分析与实战
之前已经介绍过处理Java虚拟机内存问题的知识与工具,在处理实际项目的问题时,除了知识与工具外,经验同样是一个很重要的因素.本章会介绍一些具有代表性的案例. 本章的内容推荐还是原文全篇看完的好,实在不 ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十二)Spring集成Redis缓存
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 整合Redis 本来以为类似的Redis教程和整合代码应该会很多,因 ...
- 通过清华TUNA镜像源下载Android源码
建议参考官方教程:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 以下为自己测试时执行的步骤: 1.下载repo $ curl https://mirr ...
- Gitblit版本服务器环境部署记录
Gitblit介绍Gitblit 是一个纯 Java 库用来管理.查看和处理 Git 资料库.相当于 Git 的 Java 管理工具,支持linux系统.Git是分布式版本控制系统,它强调速度.数据一 ...
- Jenkins部署Python项目实战
一.背景 我们工作中常用Jenkins部署Java代码,因其灵活的插件特性,例如jdk,maven,ant等使得java项目编译后上线部署一气呵成,同样对于脚本语言类型如Python上线部署,利用Je ...
- 雅思听听app
最近本人呢,正在紧张的备战雅思考试,因为英语基础很弱,尤其是听力,所以老师推荐了雅思听听这个app,说是特别好使,用了一个多月的,总体来说感觉还是很nice的,但是还有一些小毛病,不过这小毛病瑕不掩瑜 ...
- Linux内核分析——第五章 系统调用
第五章 系统调用 5.1 与内核通信 1.系统调用在用户空间进程和硬件设备之间添加了一个中间层,该层主要作用有三个: (1)为用户空间提供了一种硬件的抽象接口 (2)系统调用保证了系统的稳定和安全 ( ...
- 基于SSH框架的考勤管理系统的设计与实现
基于SSH框架的考勤管理系统的设计与实现
- mysql执行 sql文件遇到USING BTREE ) ENGINE=MyISAM DEFAULT CHARSET=utf8错误
使用navcat在导入别人发的mysql数据的时候,报了下面这个错误: [Err] 1064 - You have an error in your SQL syntax; check the man ...
- Exception while invoking TaskListener: Exception while invoking TaskListener: null
https://community.alfresco.com/thread/225041-exception-while-invoking-tasklistener-null Ok, so the p ...