[bzoj5017][Snoi2017]炸弹 tarjan缩点+线段树优化建图+拓扑
5017: [Snoi2017]炸弹
Time Limit: 30 Sec Memory Limit: 512 MB
Submit: 608 Solved: 190
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 1
5 1
6 5
15 15
Sample Output
HINT
Source
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<algorithm>
#define maxn 500005
#define ll long long
#define mod 1000000007
using namespace std;
inline ll read() {
char ch=getchar();ll x=,f=;
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
return x*f;
}
int n,rt;
ll s[maxn*],a[maxn*],id[maxn*],tsz;
struct seg {int s[];ll mn,mx;}t[maxn*];
struct Edge {int fr,to,nxt;}e[maxn*];
int head[maxn*],sz;
void addedge(int u,int v) {e[sz].fr=u;e[sz].nxt=head[u];e[sz].to=v;head[u]=sz++;}
void build(int l,int r,int &x) {
x=++tsz;
if(l==r) {id[l]=x;t[x].mn=t[x].mx=l;return;}
int mid=l+r>>;
build(l,mid,t[x].s[]);build(mid+,r,t[x].s[]);
if(t[x].s[]) addedge(x,t[x].s[]);
if(t[x].s[]) addedge(x,t[x].s[]);
t[x].mn=l;t[x].mx=r;
return ;
}
void add(int l,int r,int x,int L,int R,int p) {
if(L<=l&&R>=r) {if(id[p]==x) return;addedge(id[p],x);return;}
int mid=l+r>>;
if(L<=mid) add(l,mid,t[x].s[],L,R,p);
if(R>mid) add(mid+,r,t[x].s[],L,R,p);
return;
}
bool inq[maxn*];
ll dfn[maxn*],low[maxn*],tim,q[maxn*],top,lm[maxn*],rm[maxn*];
int bel[maxn*],scc;
void tarjan(int x) {
dfn[x]=low[x]=++tim;q[++top]=x;inq[x]=;
for(int i=head[x];i>=;i=e[i].nxt) {
int to=e[i].to;
if(!dfn[to]){
tarjan(to);low[x]=min(low[x],low[to]);
}else if(inq[to]) low[x]=min(low[x],dfn[to]);
}
if(dfn[x]==low[x]) {
scc++;
lm[scc]=214748364700000000ll;
ll now;
do {
now=q[top--];inq[now]=;bel[now]=scc;
lm[scc]=min(lm[scc],t[now].mn);rm[scc]=max(rm[scc],t[now].mx);
}while(now!=x);
}
}
ll rd[maxn*];
int main() {
//freopen("bomb9.in","r",stdin);
memset(head,-,sizeof(head));
n=read();
for(int i=;i<=n;i++) {s[i]=read();a[i]=read();}
build(,n,rt);
for(int i=;i<=n;i++) {
int now=lower_bound(s+,s+n+,s[i])-s,L=lower_bound(s+,s+n+,s[i]-a[i])-s,R=upper_bound(s+,s+n+,s[i]+a[i])-s-;
if(L==R) continue;add(,n,,L,R,i);
}
for(int i=;i<=tsz;i++) if(!dfn[i]) {tarjan(i);}
int tmp=sz;sz=;memset(head,-,sizeof(head));
for(int i=;i<tmp;i++) {
int u=bel[e[i].fr],v=bel[e[i].to];
if(u==v) continue;
rd[v]++;addedge(u,v);
}
int hd=,tl=;
for(int i=;i<=scc;i++) if(!rd[i]) q[tl++]=i;
while(hd!=tl) {
int now=q[hd++];
for(int i=head[now];i>=;i=e[i].nxt) {
int to=e[i].to;rd[to]--;
if(!rd[to]) q[tl++]=to;
}
}
for(int i=scc;i>=;i--) {
int now=q[i];
for(int j=head[now];j>=;j=e[j].nxt) {
int to=e[j].to;
lm[now]=min(lm[now],lm[to]);rm[now]=max(rm[now],rm[to]);
}
}
ll ans=;
for(int i=;i<=n;i++) {
ans+=(ll)i*(rm[bel[id[i]]]-lm[bel[id[i]]]+);ans%=mod;
}
printf("%lld\n",ans);
}
[bzoj5017][Snoi2017]炸弹 tarjan缩点+线段树优化建图+拓扑的更多相关文章
- BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序
BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序 Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息 ...
- [POI2015][bzoj4383] Pustynia [线段树优化建图+拓扑排序]
题面 bzoj权限题传送门 luogu传送门 思路 首先,这个题目显然可以从所有小的点往大的连边,然后如果没环就一定可行,从起点(入读为0)开始构造就好了 但是问题来了,如果每个都连的话,本题中边数是 ...
- 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)
题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...
- bzoj5017 [Snoi2017]炸弹 (线段树优化建图+)tarjan 缩点+拓扑排序
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5017 题解 这个题目方法挺多的. 线段树优化建图 线段树优化建图的做法应该挺显然的,一个炸弹能 ...
- BZOJ5017 [SNOI2017]炸弹 - 线段树优化建图+Tarjan
Solution 一个点向一个区间内的所有点连边, 可以用线段树优化建图来优化 : 前置技能传送门 然后就得到一个有向图, 一个联通块内的炸弹可以互相引爆, 所以进行缩点变成$DAG$ 然后拓扑排序. ...
- 【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序
题目描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足: Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆. 现在 ...
- 【2019.7.26 NOIP模拟赛 T3】化学反应(reaction)(线段树优化建图+Tarjan缩点+拓扑排序)
题意转化 考虑我们对于每一对激活关系建一条有向边,则对于每一个点,其答案就是其所能到达的点数. 于是,这个问题就被我们搬到了图上,成了一个图论题. 优化建图 考虑我们每次需要将一个区间向一个区间连边. ...
- 【ARC069F】Flags 2-sat+线段树优化建图+二分
Description 数轴上有 n 个旗子,第 ii 个可以插在坐标 xi或者 yi,最大化两两旗子之间的最小距离. Input 第一行一个整数 N. 接下来 N 行每行两个整数 xi, ...
- 【BZOJ3681】Arietta 树链剖分+可持久化线段树优化建图+网络流
[BZOJ3681]Arietta Description Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中.但是她从未停止过和恋人 Velding 的书信往来.一 ...
随机推荐
- 除了基本类型,其余类型基本上大部分new出来 java.sql 包下面要不需要new
除了基本类型,其余类型基本上大部分new出来 java.sql 包下面要不需要new
- 计蒜客16495 Truefriend(fwt)
#include <iostream> #include <cstring> #include <cstdio> using namespace std; type ...
- [洛谷P2839][国家集训队]middle
题目大意:给你一个长度为$n$的序列$s$.$Q$个询问,问在$s$中的左端点在$[a,b]$之间,右端点在$[c,d]$之间的子段中,最大的中位数. 强制在线. 题解:区间中位数?二分答案,如果询问 ...
- [洛谷P3254]圆桌问题
题目大意:有$m$个单位,每个单位有$r_i$个代表,有$n$张餐桌,每张餐桌可容纳$c_i$个代表.要求同一个单位的代表不在同一个餐桌就餐.若可以,输出$1$以及其中一种方案,否则输出$0$ 题解: ...
- C&C++——C函数与C++函数相互调用问题
C C++相互调用 在项目中融合C和C++有时是不可避免的,在调用对方的功能函数的时候,或许会出现这样那样的问题,但只要我的C代码和我的C++代码分别都能成功编译,那其他就不是问题.近来在主程序是C语 ...
- 遇到问题---java---git下载的maven项目web用tomcat发布时不带子项目
遇到的情况是用git下载maven项目,然后用mvn eclipse:eclipse命令标记为eclipse项目之后,使用maven插件导入之后用tomcat发布运行,发现maven关联的几个子项目没 ...
- axios超时重发
axios的超时是在response中处理的,所以要在response中添加拦截器: axios.interceptors.response.use(undefined, function axios ...
- [学习笔记]对未来做出承诺的DP小结
这是一种DP状态设计方法. 有些题,当你必须以一个顺序往后填的话,然而后面的填法会对之前产生影响,那么,不妨在之前就对未来怎么填做出承诺. 通俗的讲,就是对未来打一个表. 然后后面填的时候,直接查表转 ...
- ionic2 手风琴效果
user.ts import { Component } from '@angular/core';import { IonicPage, NavController, NavParams } fro ...
- bzoj 5094 [Lydsy1711月赛]硬盘检测 概率dp
[Lydsy1711月赛]硬盘检测 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 273 Solved: 75[Submit][Status][Dis ...