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

#include <bits/stdc++.h>
#define N 8000034
#define ls t[x].lson
#define rs t[x].rson
#define inf 1000000000
#define setIO(s) freopen(s".in","r",stdin) ,freopen(s".out","w",stdout)
using namespace std;
int edges,tot,n,m,s,rtin,rtout;
int hd[N],to[N],nex[N],val[N],d[N],done[N];
void addedge(int u,int v,int c)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,val[edges]=c;
}
int newnode()
{
return ++tot;
}
struct Node
{
int lson,rson;
}t[N];
struct P
{
int u,dis;
P(int u=0,int dis=0):u(u),dis(dis){}
bool operator<(P b) const
{
return b.dis<dis;
}
};
priority_queue<P>q;
namespace segin
{
void build(int l,int r,int &x)
{
if(l==r)
{
x=l;
return;
}
else
{
x=newnode();
}
int mid=(l+r)>>1;
if(l<=mid) build(l,mid,ls),addedge(x,ls,0);
if(r>mid) build(mid+1,r,rs),addedge(x,rs,0);
}
void Add(int l,int r,int x,int L,int R,int p)
{
if(l>=L&&r<=R)
{
addedge(p,x,0);
return;
}
int mid=(l+r)>>1;
if(L<=mid) Add(l,mid,ls,L,R,p);
if(R>mid) Add(mid+1,r,rs,L,R,p);
}
};
namespace segout
{
void build(int l,int r,int &x)
{
if(l==r)
{
x=l;
return;
}
else
{
x=newnode();
}
int mid=(l+r)>>1;
if(l<=mid) build(l,mid,ls),addedge(ls,x,0);
if(r>mid) build(mid+1,r,rs),addedge(rs,x,0);
}
void Add(int l,int r,int x,int L,int R,int p)
{
if(l>=L&&r<=R)
{
addedge(x,p,0);
return;
}
int mid=(l+r)>>1;
if(L<=mid) Add(l,mid,ls,L,R,p);
if(R>mid) Add(mid+1,r,rs,L,R,p);
}
};
void Add(int l1,int r1,int l2,int r2,int w)
{
int p1=newnode(),p2=newnode();
addedge(p1,p2,w);
segout::Add(1,n,rtout,l1,r1,p1);
segin::Add(1,n,rtin,l2,r2,p2);
}
void Dijkstra()
{
for(int i=0;i<N;++i) d[i]=inf;
for(d[s]=0,q.push(P(s,0));!q.empty();)
{
P e=q.top();
q.pop();
int u=e.u;
if(done[u]) continue;
done[u]=1;
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(d[v]>d[u]+val[i])
{
d[v]=d[u]+val[i];
q.push(P(v,d[v]));
}
}
}
}
int main()
{
int i,j;
// setIO("input");
scanf("%d%d%d",&n,&m,&s);
tot=n;
segin::build(1,n,rtin);
segout::build(1,n,rtout);
for(i=1;i<=m;++i)
{
int l1,r1,l2,r2;
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
Add(l1,r1,l2,r2,1);
Add(l2,r2,l1,r1,1);
}
Dijkstra();
for(i=1;i<=n;++i) printf("%d\n",d[i]);
return 0;
}

  

BZOJ 3073: [Pa2011]Journeys Dijkstra+线段树优化建图的更多相关文章

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

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

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

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

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

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

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

    loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...

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

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

  6. BZOJ 4276 [ONTAK2015]Bajtman i Okrągły Robin 费用流+线段树优化建图

    Description 有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2],...,[b[i]-1,b[i]]这么多段长度为1时间中选出一个时间进行抢劫,并计划抢 ...

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

  8. CF786B Legacy 线段树优化建图

    问题描述 CF786B LG-CF786B 题解 线段树优化建图 线段树的一个区间结点代表 \([l,r]\) 区间点. 然后建立区间点的时候就在线段树上建边,有效减少点的个数,从而提高时空效率. 优 ...

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

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

随机推荐

  1. 数值优化(Numerical Optimization)学习系列-目录

    数值优化(Numerical Optimization)学习系列-目录 置顶 2015年12月27日 19:07:11 下一步 阅读数 12291更多 分类专栏: 数值优化   版权声明:本文为博主原 ...

  2. Lua的API函数

    1. 基础库 我们在整个教程中使用了各种主题下的基本库. 下表提供了相关页面的链接,并列出了本Lua教程各部分所涵盖的功能. 编号 库/方法 作用 1 错误处理 包括错误处理函数,如断言, 错误,如L ...

  3. 进阶Java编程(13)反射与Annotation

    1,反射取得Annotation信息 从JDK1.5之后Java提供了Annotation技术支持,这种技术为项目的编写带来了新的模型,而后经过了十年的发展,Annotation的技术得到了非常广泛的 ...

  4. Power BI 行级别安全性 (RLS)

    在 Power BI Desktop 中定义角色和规则 你可以在 Power BI Desktop 中定义角色和规则. 发布到 Power BI 时,它还会发布角色定义. 若要定义安全角色,请执行以下 ...

  5. Bootstrap3基础教程 03 导航栏

    Bootstrap导航栏 创建一个默认的导航栏的步骤如下: 1.向 <nav> 标签添加 class .navbar..navbar-default. 2.向上面的元素添加 role=&q ...

  6. postman传数组参数,二维数组,多维数组

    一维数组: 传递: 接收: 二维数组: 传递: 接收: 依此类推,

  7. vuex用法

    // 配置vuex的步骤 // 1. 运行 cnpm i vuex -S // 2. 导入包 import Vuex from 'vuex' // 3. 注册vuex到vue中 Vue.use(Vue ...

  8. linux递归查找目录下所有文件夹以及文件

    相对于ls或者ll,可能find在这个时候更加给力 先看我的目录结构 tree命令是查看目录的结构,而且最后会列出所有的directory的数目以及文件夹的数目...好像我们接下来要做的就没有必要了, ...

  9. vue+ckEditor5

    1.安装依赖 "@ckeditor/ckeditor5-build-balloon": "^10.1.0", "@ckeditor/ckeditor5 ...

  10. Win10带有网络连接的安全模式怎么开启?

    安全模式是在Windows系统中不加载第三方设备驱动程序的情况下启动电脑,从而可以方便的检测与修复电脑系统的错误,比如在安全模式下可以删除某些顽固的文件.查杀病毒.修复系统故障.卸载恶意软件等.不过在 ...