BZOJ 3073: [Pa2011]Journeys Dijkstra+线段树优化建图
复习一下线段树优化建图:
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+线段树优化建图的更多相关文章
- bzoj3073: [Pa2011]Journeys 线段树优化建图
bzoj3073: [Pa2011]Journeys 链接 BZOJ 思路 区间和区间连边.如何线段树优化建图. 和单点连区间类似的,我们新建一个点,区间->新点->区间. 又转化成了单点 ...
- 【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\ ...
- loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点
loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...
- bzoj4383 [POI2015]Pustynia 拓扑排序+差分约束+线段树优化建图
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4383 题解 暴力的做法显然是把所有的条件拆分以后暴力建一条有向边表示小于关系. 因为不存在零环 ...
- 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时间中选出一个时间进行抢劫,并计划抢 ...
- 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 最 ...
- CF786B Legacy 线段树优化建图
问题描述 CF786B LG-CF786B 题解 线段树优化建图 线段树的一个区间结点代表 \([l,r]\) 区间点. 然后建立区间点的时候就在线段树上建边,有效减少点的个数,从而提高时空效率. 优 ...
- Codeforces 1045A Last chance 网络流,线段树,线段树优化建图
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045A.html 题目传送们 - CF1045A 题意 你有 $n$ 个炮,有 $m$ 个敌人,敌人排成一 ...
随机推荐
- luogu P3959(2017noipTG D2T2
luogu P3959(2017noipTG D2T2 不知道为什么,这两天见了好多伪装成图的dp题,这道也是. 最短路只有40分,实际上可以从数据范围n<=12看出来是状压dp. soluti ...
- Codeforces 1238G. Adilbek and the Watering System
传送门 最关键的想法就是每个位置一定用的是当前能用的最便宜的水,因为到后面可能有更便宜的 然后其他还没用上的水我们也留着,假装此时已经买了,但是如果发现后面有更优的再反悔也不迟 每相邻两个朋友之间我们 ...
- lua与c的交互(运用)
(1)lua程序 (2)C++程序(头文件) extern "C" { #include "lua.h" #include "lual ...
- Java Web DNS域名解析
一.什么是DNS DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串 ...
- asp.net 7.分页
分页 SQL: select * from( select *,row_number()over(order by id) as num from T_userInfo) as t 数据层(UserI ...
- 解决tomcat端口冲突
1.根据8080端口号查找占用8080端口的进程 netstat -ano|findstr " 进程id:6352 2.根据进程ID查找进程名字 tasklist|findstr " ...
- 如何调试Python程序 通过IDLE
在python3.3环境下 1.写一个简单地Python源文件,比如test.py,内容如下: import sys, osdef test(arg1, arg2): print "begi ...
- centos7安装配置NFS文件共享存储
一,环境介绍 本实验使用了两台centos7虚拟机,其中 服务器:192.168.1.188 客户端:192.168.1.189 二,实验步骤 192.168.1.1 ...
- HBASE学习笔记(一)
一.数据库OLAP和OLTP简单的介绍比较 1.OLTP:on-line transaction processing在线事务处理,应用在传统关系型数据库比较多,执行日常基本的事务处理,比如数据库记录 ...
- MySQL添加唯一索引
1 语法如下 ALTER TABLE `t_user` ADD unique(`username`);