线段树优化建图裸题。建两棵线段树,一棵表示入一棵表示出。对题中所给的边新建一个虚拟点,将两段区间拆成线段树上对应区间,出线段树中对应区间所表示的点向虚拟点连边权0的边,虚拟点向入线段树中对应区间所表示的点连边权1的边;线段树上的点之间连边权0的边(表示入的由父亲连向儿子,表示出的由儿子连向父亲),表示相同点的叶子节点(由入连向出)之间连边权0的边。01bfs即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define ll long long
#define N 500010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,S,id[][N],root[],v[][],p[N*],d[N*],t,cnt;
struct data{int to,nxt,len;
}edge[N<<];
struct data2{int l,r;
}tree[][N<<];
deque<int> q;
void addedge(int x,int y,int z){t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].len=z,p[x]=t;}
void build(int &k,int l,int r,int p)
{
k=++cnt;
if (l==r) {id[p][l]=k;return;}
int mid=l+r>>;
build(tree[p][k].l,l,mid,p);
build(tree[p][k].r,mid+,r,p);
if (p==) addedge(tree[p][k].l,k,),addedge(tree[p][k].r,k,);
else addedge(k,tree[p][k].l,),addedge(k,tree[p][k].r,);
}
void find(int &k,int l,int r,int x,int y,int p)
{
if (l==x&&r==y) {v[p][++v[p][]]=k;return;}
int mid=l+r>>;
if (y<=mid) find(tree[p][k].l,l,mid,x,y,p);
else if (x>mid) find(tree[p][k].r,mid+,r,x,y,p);
else find(tree[p][k].l,l,mid,x,mid,p),find(tree[p][k].r,mid+,r,mid+,y,p);
}
void bfs(int S)
{
d[S]=;q.push_back(S);
while (!q.empty())
{
int x=q.front();q.pop_front();
for (int i=p[x];i;i=edge[i].nxt)
if (d[x]+edge[i].len<d[edge[i].to])
{
d[edge[i].to]=d[x]+edge[i].len;
if (edge[i].len) q.push_back(edge[i].to);
else q.push_front(edge[i].to);
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj3073.in","r",stdin);
freopen("bzoj3073.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read(),S=read();
build(root[],,n,);
build(root[],,n,);
for (int i=;i<=m;i++)
{
int a=read(),b=read(),c=read(),d=read();
v[][]=v[][]=;cnt++;
find(root[],,n,a,b,);
for (int x=;x<=v[][];x++) addedge(v[][x],cnt,);
find(root[],,n,c,d,);
for (int x=;x<=v[][];x++) addedge(cnt,v[][x],);
v[][]=v[][]=;cnt++;
find(root[],,n,c,d,);
for (int x=;x<=v[][];x++) addedge(v[][x],cnt,);
find(root[],,n,a,b,);
for (int x=;x<=v[][];x++) addedge(cnt,v[][x],);
}
for (int i=;i<=n;i++) addedge(id[][i],id[][i],);
memset(d,,sizeof(d));bfs(id[][S]);
for (int i=;i<=n;i++) printf("%d\n",d[id[][i]]);
return ;
}

BZOJ3073 PA2011Journeys(线段树+bfs)的更多相关文章

  1. BZOJ3073 Journeys - 线段树优化建边

    传送门 题意: Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路: ...

  2. 【BZOJ3073】[Pa2011]Journeys 线段树+堆优化Dijkstra

    [BZOJ3073][Pa2011]Journeys Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在 ...

  3. “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】

    黑白图像直方图 发布时间: 2017年7月9日 18:30   最后更新: 2017年7月10日 21:08   时间限制: 1000ms   内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...

  4. cf276E 两棵线段树分别维护dfs序和bfs序,好题回头再做

    搞了一晚上,错了,以后回头再来看 /* 对于每次更新,先处理其儿子方向,再处理其父亲方向 处理父亲方向时无法达到根,那么直接更新 如果能达到根,那么到兄弟链中去更新,使用bfs序 最后,查询结点v的结 ...

  5. Codeforces Round #442 (Div. 2)A,B,C,D,E(STL,dp,贪心,bfs,dfs序+线段树)

    A. Alex and broken contest time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  6. 【8.26校内测试】【重构树求直径】【BFS模拟】【线段树维护DP】

    题目性质比较显然,相同颜色联通块可以合并成一个点,重新建树后,发现相邻两个点的颜色一定是不一样的. 然后发现,对于一条链来说,每次把一个点反色,实际上使点数少了2个.如下图 而如果一条链上面有分支,也 ...

  7. HDU5957 Query on a graph(拓扑找环,BFS序,线段树更新,分类讨论)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5957 题意:D(u,v)是节点u和节点v之间的距离,S(u,v)是一系列满足D(u,x)<=k的点 ...

  8. hdu-2586 How far away ?(lca+bfs+dfs+线段树)

    题目链接: How far away ? Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Ot ...

  9. BZOJ_3073_[Pa2011]Journeys_线段树优化建图+BFS

    BZOJ_3073_[Pa2011]Journeys_线段树优化建图+BFS Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N ...

随机推荐

  1. [转]Nginx伪静态配置和常用Rewrite伪静态规则集锦

    Nginx伪静态配置和常用Rewrite伪静态规则集锦 作者: 字体:[增加 减小] 类型:转载 时间:2014-06-10 我要评论 伪静态是一种可以把文件后缀改成任何可能的一种方法,如果我想把ph ...

  2. golang 三个点的用法

    已经忘了这是第几次查这个用法了,还是记一下吧~ ^ _ ^ 本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/137 ...

  3. ESP32 学习笔记 - 环境搭建

    打开终端 输入命令 sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-seria ...

  4. P3305 [SDOI2013]费用流

    题目描述 Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量. 一个合法的网络流方案必须满足: ...

  5. No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser").警告解决方法

    在使用BeautifulSoup库时出现该警告,虽然不影响正常运行,但强迫症不能忍啊!! 详细警告信息如下: UserWarning: No parser was explicitly specifi ...

  6. Java集合类面试题

    java.util包中包含了一系列重要的集合类,而对于集合类,主要需要掌握的就是它的内部结构,以及遍历集合的迭代模式. 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最 ...

  7. java容器操作一

    List l = new ArrayList(); l.add(1); l.add("ne"); // 获取 System.out.println(l.get(0)); // 判断 ...

  8. 【IIS】 常见问题

    [IIS] 常见问题 1. IIS 安装 .Net FrameWork 4.0 开始->所有程序->附件->鼠标右键点击“命令提示符”->以管理员身份运行->%windi ...

  9. oracle 游标例子

    CREATE OR REPLACE PROCEDURE PRC_WAP_ACTIVEUSERS(RETCODE OUT VARCHAR2) /***************************** ...

  10. 时屏蔽ios和android下点击元素时出现的阴影

    -webkit-tap-highlight-color -webkit-tap-highlight-color:rgba(255,255,255,0)