loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点
loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点
链接
思路
用交错关系建出图来,发现可以直接缩点,拓扑统计。
完了吗,不,瓶颈在于边数太多了,线段树优化建图。
细节
建新图要判重。
内存永远算不对
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+7,mod=1e9+7;
ll read() {
ll x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,cnt,id[N<<2],ru[N<<2],ans[N<<2];
ll X[500007],R[500007];
int low[N<<2],dfn[N<<2],stak[N<<2],top,vis[N<<2],belong[N<<2],col,siz[N<<2],mmp;
vector<int> G[N<<2];
queue<int> q;
struct node {int v,nxt;}e[N<<4];
int head[N<<2],tot;
void add(int u,int v) {
e[++tot].v=v;
e[tot].nxt=head[u];
head[u]=tot;
}
namespace seg {
#define ls rt<<1
#define rs rt<<1|1
void build(int l,int r,int rt) {
if(l==r) return id[rt]=l,void();
int mid=(l+r)>>1;
id[rt]=++cnt;
build(l,mid,ls);
build(mid+1,r,rs);
add(id[rt],id[ls]);
add(id[rt],id[rs]);
}
void update(int u,int L,int R,int l,int r,int rt) {
if(L<=l&&r<=R) return add(u,id[rt]),void();
int mid=(l+r)>>1;
if(L<=mid) update(u,L,R,l,mid,ls);
if(R>mid) update(u,L,R,mid+1,r,rs);
}
}
void tarjan(int u) {
dfn[u]=low[u]=++mmp;
vis[u]=1;
stak[++top]=u;
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].v;
if(!dfn[v]) {
tarjan(v);
low[u]=min(low[u],low[v]);
} else if(vis[v]) {
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u]) {
++col;
while(stak[top]!=u) {
belong[stak[top]]=col;
vis[stak[top]]=0;
if(stak[top]<=n) siz[col]++;
top--;
}
belong[stak[top]]=col;
vis[stak[top]]=0;
if(stak[top]<=n) siz[col]++;
top--;
}
}
map<pair<int,int> ,int> Hash;
int main() {
n=cnt=read();
seg::build(1,n,1);
for(int i=1;i<=n;++i) X[i]=read()+(ll)3e18,R[i]=read();
for(int i=1;i<=n;++i) {
int j=upper_bound(X+i,X+1+n,X[i]+R[i])-X-1;
if(j!=i) seg::update(i,i+1,j,1,n,1);
j=lower_bound(X+1,X+i,X[i]-R[i])-X;
if(j!=i) seg::update(i,j,i-1,1,n,1);
}
for(int i=1;i<=cnt;++i)
if(!dfn[i])
tarjan(i);
for(int u=1;u<=cnt;++u) {
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].v;
if(belong[v]!=belong[u]&&!Hash[make_pair(belong[v],belong[u])]) {
Hash[make_pair(belong[v],belong[u])]=1;
G[belong[v]].push_back(belong[u]);
ru[belong[u]]++;
}
}
}
for(int i=1;i<=col;++i) {
if(!ru[i]) {
q.push(i);
siz[i]=siz[i];
}
}
while(!q.empty()) {
int u=q.front();
q.pop();
for(auto v:G[u]) {
siz[v]+=siz[u];
ru[v]--;
if(!ru[v]) q.push(v);
}
}
int ans=0;
for(int i=1;i<=n;++i) {
ans+=1LL*i*siz[belong[i]]%mod;
ans%=mod;
}
printf("%d\n",ans);
}
loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点的更多相关文章
- loj #2255. 「SNOI2017」炸弹
#2255. 「SNOI2017」炸弹 题目描述 在一条直线上有 NNN 个炸弹,每个炸弹的坐标是 XiX_iXi,爆炸半径是 RiR_iRi,当一个炸弹爆炸时,如果另一个炸弹所在位置 X ...
- bzoj5017 [Snoi2017]炸弹 (线段树优化建图+)tarjan 缩点+拓扑排序
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5017 题解 这个题目方法挺多的. 线段树优化建图 线段树优化建图的做法应该挺显然的,一个炸弹能 ...
- 【BZOJ4383】[POI2015]Pustynia 线段树优化建图
[BZOJ4383][POI2015]Pustynia Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r ...
- AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图
AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...
- bzoj3073: [Pa2011]Journeys 线段树优化建图
bzoj3073: [Pa2011]Journeys 链接 BZOJ 思路 区间和区间连边.如何线段树优化建图. 和单点连区间类似的,我们新建一个点,区间->新点->区间. 又转化成了单点 ...
- BZOJ 3073: [Pa2011]Journeys Dijkstra+线段树优化建图
复习一下线段树优化建图:1.两颗线段树的叶子节点的编号是公用的. 2.每次连边是要建两个虚拟节点 $p1,p2$ 并在 $p1,p2$ 之间连边. #include <bits/stdc++.h ...
- bzoj4383 [POI2015]Pustynia 拓扑排序+差分约束+线段树优化建图
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4383 题解 暴力的做法显然是把所有的条件拆分以后暴力建一条有向边表示小于关系. 因为不存在零环 ...
- codeforces 787D - Legacy 线段树优化建图,最短路
题意: 有n个点,q个询问, 每次询问有一种操作. 操作1:u→[l,r](即u到l,l+1,l+2,...,r距离均为w)的距离为w: 操作2:[l,r]→u的距离为w 操作3:u到v的距离为w 最 ...
- Codeforces 1045A Last chance 网络流,线段树,线段树优化建图
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045A.html 题目传送们 - CF1045A 题意 你有 $n$ 个炮,有 $m$ 个敌人,敌人排成一 ...
随机推荐
- ASP.NET Core MVC的Razor视图中,使用Html.Raw方法输出原生的html
我们在ASP.NET Core MVC项目中,有一个Razor视图文件Index.cshtml,如下: @{ Layout = null; } <!DOCTYPE html> <ht ...
- mysql 中 and和or 一起使用和之间的优先级
SELECT address,job_title,education,SUM(recruiting) FROM commerce_jobs WHERE education = '大专' and ( j ...
- C# GDI graphics.DrawImage 的参数问题
graphics.DrawImage(imageSource, new System.Drawing.Point[] { ,), , ), , ), } ); graphics.DrawImage(i ...
- 《JavaEE开发的颠覆者——Spring Boot实战》是一本好书
这本书的风格非常好.每一节都是先点明这一块知识的要点,随后就手把手的做出一个最简明.但有能体现核心的实例(大多只有几个Class) 这样的书用来熟悉一门框架,实在是再好不过.
- JavaSE01:初始Java
java语言的优势 简单性 面向对象 跨平台性(可移植性) 高性能 分布式 动态性 多线程 安全性 健壮性 java最大的特点是跨平台性 Java的跨平台性来源于Java虚拟机(jvm),Java靠在 ...
- SQLi_Labs通关文档【1-65关】
SQLi_Labs通关文档[1-65关] 为了不干扰自己本机环境,SQL-LAB我就用的码头工人,跑起来的,搭建也非常简单,也就两条命令 docker pull acgpiano/sqli-labs ...
- Jnetpcap简述
Jnetpcap简述 最近需要做一个本地网络流量分析的项目,基于 Java 语言,上网查了很多资料,最后利用 Jnetpcap 实现了,这里做个记录. 这里先列一下我用到的工具以及版本: Eclips ...
- Prometheus学习笔记(2)Prometheus部署
目录 Prometheus的安装配置启动 Prometheus的安装配置启动 1.Prometheus二进制安装 Prometheus下载链接:https://prometheus.io/downlo ...
- excel 大文件解析原理实现
问题 目前的excel 不像之前的excel了可以支持的数据量更大,可以支持支持1048576行,16384列. 之前使用poi读取,直接报错,使用excel 事件的方式读取,还有不少的bug,关键是 ...
- 微服务框架---搭建 go-micro环境
1.安装micro 需要使用GO1.11以上版本 #linux 下 export GO111MODULE=on export GOPROXY=https://goproxy.io # windows下 ...