复习一下线段树优化建图:
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. Jmeter之Dummy Sampler

    Dummy Sampler(Dummy取样器) Dummy Sampler就像是一个模拟器,需要自己填入请求和响应的信息.(原理类似mock服务) 在没有服务的情况下,测试人员依据Dummy Samp ...

  2. 安装consul

    概述consul是google开源的一个使用go语言开发的服务发现.配置管理中心服务.内置了服务注册与发现框架.分布一致性协议实现.健康检查.Key/Value存储.多数据中心方要依赖其他工具(比如Z ...

  3. JavaScript设计模式(装饰者模式)

    一.模拟传统面向对象语言的装饰者模式: 假设我们在编写一个飞机大战的游戏,随着经验值的增加,我们操作的飞机对象可以升级成更厉害的飞机,一开始这些飞机只能发射普通的子弹,升到第二级时可以发射导弹,升到第 ...

  4. java——ArrayList中contains()方法中的疑问

    问题引子: ist<Student> students=new ArrayList<Student>(); students.add(new Student("201 ...

  5. Sublime Text 3配置浏览默认路径为localhost

    1.在 Sublime Text 3 中,安装 SideBarEnhancements 侧边栏增强插件.(注意:安装插件之前需要安装包管理工具,参考这里) 2.SideBarEnhancements ...

  6. vue进阶:基于vue-cli创建项目(搭建手脚架)

    vue-cli安装.创建项目 基于vue-cli创建的项目进行开发 使用vue-cli图形化界面搭建项目 插件与工具 一.vue-cli简介.安装.创建项目 Vue-cli是基于Vue.js进行快速开 ...

  7. GitLab端口冲突 解决办法

        访问gitlab,出现:502 GitLab在使用的过程中,会开启80端口,如果80端口被其他的应用程序占用,则GitLab的该项服务不能使用,所以访问GitLab会失败.大多数皆是此问题.  ...

  8. shell中sed的简单使用

    sed命令行格式为:         sed [-nefri]  ‘command’  输入文本/文件        常用选项:        -n∶取消默认的输出,使用安静(silent)模式.在一 ...

  9. Shell-使用mkfifo实现多任务并发及并发数控制

    以下为代码实现的一个模拟场景:3个生产者,在不断提供服务,处理需求,假设1s处理一个. 20个消费者,在不断消耗供给产品,提交需求,假设3s消耗一个. 情景分析:由于消费者的提交需求能力 和 生产者处 ...

  10. umi+antdpro 2.3

    关于umi接管了路由之后的动态配置. 路由通过 router.js 配置文件自动生成. 在 models/ menu.js中可以获取到,但从这里获取到并过滤之后的其实不是路由配置. 正确过滤方式,通过 ...