[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 的书信往来.一 ...
随机推荐
- jquery在页面加载完成后再append的元素事件无效问题
最近遇到一个问题,jquery在页面加载完成后再append的元素,append元素上有onclick事件,但是在append的元素上怎么点击都不会触发onclick事件.就如: <ul cla ...
- 基于网络的 Red Hat 无人值守安装
基于网络的 Red Hat 无人值守安装 本文介绍了 PC 平台上的一种快速 Red Hat Linux 安装方案.它具有很高的自动化程度--用户只需手工启动机器并选择从网络启动,就可以完成整个安装过 ...
- 【AtCoder ARC076】F Exhausted? 霍尔定理+线段树
题意 N个人抢M个椅子,M个椅子排成一排 ,第i个人只能坐[1,Li]∪[Ri,M],问最多能坐多少人 $i$人连边向可以坐的椅子构成二分图,题意即是求二分图最大完美匹配,由霍尔定理,答案为$max( ...
- [BZOJ1339] [Baltic2008] Mafia / 黑手党
Description 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价, 现在警方希望使用最小的代价控制一些车站,使得去掉这些车站后,匪徒无法从原定的 ...
- [CF1041E]Tree Reconstruction
题目大意:有一棵树,现在给你每条树边被去掉时,形成的两个联通块中点的最大的编号分别是多少,问满足条件的树存不存在,存在输出方案 题解:一条边的两个编号中较大的一个一定是$n$,否则无解. 开始构造这棵 ...
- bzoj
准确率爆棚啊,然而
- bzoj 4624 农场种植 fft
4624: 农场种植 Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 48 Solved: 31[Submit][Status][Discuss] D ...
- MySQL实现分页查询
imit 基本实现方式 一般情况下,客户端通过传递 pageNo(页码).pageSize(每页条数)两个参数去分页查询数据库中的数据,在数据量较小(元组百/千级)时使用 MySQL自带的 limit ...
- 【BZOJ4657】tower [网络流]
炮塔 Time Limit: 10 Sec Memory Limit: 256 MB Description Input Output 一行一个整数表示答案. Sample Input 4 5 0 ...
- python3 正则表达式re模块
正则表达式的功能:字符串的模糊匹配查询import re元字符 . ---->匹配除换行符意外的任意字符 ^ ---->匹配行首位置 $ ---->匹配行尾位置 关于重复的元字符 * ...