loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点

链接

loj

思路

用交错关系建出图来,发现可以直接缩点,拓扑统计。

完了吗,不,瓶颈在于边数太多了,线段树优化建图。

细节

建新图要判重。

内存永远算不对

代码

#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」炸弹 线段树优化建图,拓扑,缩点的更多相关文章

  1. loj #2255. 「SNOI2017」炸弹

    #2255. 「SNOI2017」炸弹 题目描述 在一条直线上有 NNN 个炸弹,每个炸弹的坐标是 XiX_iX​i​​,爆炸半径是 RiR_iR​i​​,当一个炸弹爆炸时,如果另一个炸弹所在位置 X ...

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

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

  3. 【BZOJ4383】[POI2015]Pustynia 线段树优化建图

    [BZOJ4383][POI2015]Pustynia Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r ...

  4. AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图

    AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...

  5. bzoj3073: [Pa2011]Journeys 线段树优化建图

    bzoj3073: [Pa2011]Journeys 链接 BZOJ 思路 区间和区间连边.如何线段树优化建图. 和单点连区间类似的,我们新建一个点,区间->新点->区间. 又转化成了单点 ...

  6. BZOJ 3073: [Pa2011]Journeys Dijkstra+线段树优化建图

    复习一下线段树优化建图:1.两颗线段树的叶子节点的编号是公用的. 2.每次连边是要建两个虚拟节点 $p1,p2$ 并在 $p1,p2$ 之间连边. #include <bits/stdc++.h ...

  7. bzoj4383 [POI2015]Pustynia 拓扑排序+差分约束+线段树优化建图

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4383 题解 暴力的做法显然是把所有的条件拆分以后暴力建一条有向边表示小于关系. 因为不存在零环 ...

  8. 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 最 ...

  9. Codeforces 1045A Last chance 网络流,线段树,线段树优化建图

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045A.html 题目传送们 - CF1045A 题意 你有 $n$ 个炮,有 $m$ 个敌人,敌人排成一 ...

随机推荐

  1. jmeter(二十七)分布式压测注意事项

    之前的博客:jemter(二十三):分布式测试简略的介绍了利用jmeter做分布式测试的方法,当时只是介绍了背景和原因,以及基本的配置操作,有同学说写得不够详细. 正好今年双十一,我司的全链路压测,也 ...

  2. Wireshark教程之二:Wireshark捕获数据分析

    使用 Wireshark 选择需要抓包的网络方式,并设置过滤器条件,当有数据通信后即可抓到对应的数据包,这里将分析其每一帧数据包的结构. 以HTTP协议为例,一帧数据包一般包括以下几个部分: Fram ...

  3. 关于BASE 24 ,BASE 64原理以及实现程序

    关于BASE 24 ,BASE 64原理以及实现程序 来源 https://wangye.org/blog/archives/5/ 可能很多人听说过Base64编码,很少有人听说过Base24编码,B ...

  4. 使用 HttpWebRequest 类做 POST 请求没有应反

    这几天给系统做第三方集成, 需要调用另一个软件的一个接口, 通过 HTTP 的方式调用,调用代码也挺简单的: string serviceUrl = string.Format("{0}/{ ...

  5. CORS-跨域资源共享 解决跨域问题

    1.什么是跨域? a.test.com 和 b.test.com 是两个不同的域,而处于安全机制考虑,JS只能访问与所在页面同一个域(相同协议.域名.端口)的内容,但是我们在项目开发时,经常遇到一个页 ...

  6. 在vue-cli中如何安装scss,并全局引入scss

    在vue-cli脚手架采用scss正确的使用姿势 步骤一: 安装node-sass.sass-loader.style-loader npm install node-sass --save-dev ...

  7. Java 流程控制 之 分支结构——条件判断语句

    一.判断语句 1.判断语句1-- 单 if 语句(单分支结构) 语法格式: if(条件表达式){ 语句体; }  执行流程: 首先判断条件表达式看其结果是 true 还是 false: 如果是 tru ...

  8. 在现有的mysql主从基础上,搭建mycat实现数据的读写分离

    环境准备:MySQL服务器做好主从复制:centos6的系统 主:192.168.164.131 从:192.168.164.144 mycat服务器:192.168.164.141 a.将MySQL ...

  9. 使用jmeter 设计流程发起测试

    业务场景 需要实现用户在登录后,能够持续的发起流程. 需要注意的点: 1.使用不同的用户登录. 2.登录后发起可以持续的发起流程. 实现步骤 1.先使用badboy 录制脚本. 2.使用jmeter ...

  10. 《linux就该这么学》课堂笔记07 while、case、计划任务、用户增删改查命令

    while条件循环语句 while 条件测试操作 do 命令序列 done  case条件测试语句 case 变量值 in 模式一) 命令序列1 ;; 模式二) 命令序列2 ;; *) 默认命令序列 ...