题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3073

建两棵线段树,一棵孩子向父亲连边,是走出去的;一棵父亲向孩子连边,是走进来的。

注意第二棵线段树的叶子向第一棵线段树的叶子连边。

在树上节点间连边的时候,不是 log^2 地直接连,而要新建一个节点作中转点,这样边数就是 2*log 的;连向中转点和连出去的边一部是0一部是1或者全是0.5即可。

注意连无向边。两种方向当然是两个中转点。

边数 3e7 似乎还是小。但能过。更大就开不下了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=4e6+,M=3e7+,K=5e5+;
int n,m,p,tot,hd[N],xnt,to[M],nxt[M],w[M],ls[K<<],rs[K<<],dis[N];
int rt,d0[K],d1[K];
bool vis[N];
priority_queue<pair<int,int> > q;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return fx?ret:-ret;
}
void wrt(int x)
{
if(x<)putchar('-'),x=-x;
if(x<){putchar(x+'');return;}
wrt(x/); putchar(x%+'');
}
void add(int x,int y,int z)
{
to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;w[xnt]=z;
}
void build(int l,int r,int cr,bool fx)
{
if(l==r)
{
if(!fx)d0[l]=cr;
else d1[l]=cr,add(cr,d0[l],);
return;
}
int mid=l+r>>;
ls[cr]=++tot; build(l,mid,ls[cr],fx);
rs[cr]=++tot; build(mid+,r,rs[cr],fx);
if(fx)add(cr,ls[cr],),add(cr,rs[cr],);
else add(ls[cr],cr,),add(rs[cr],cr,);
}
void mdfy(int l,int r,int cr,int L,int R,bool fx)
{
if(l>=L&&r<=R)
{
if(!fx)add(cr,tot,);
else add(tot,cr,);
return;
}
int mid=l+r>>;
if(L<=mid)mdfy(l,mid,ls[cr],L,R,fx);
if(mid<R)mdfy(mid+,r,rs[cr],L,R,fx);
}
int main()
{
n=rdn(); m=rdn(); p=rdn();
tot=; build(,n,,);
rt=++tot; build(,n,rt,);
for(int i=,a,b,c,d;i<=m;i++)
{
a=rdn(); b=rdn(); c=rdn(); d=rdn();
tot++; mdfy(,n,,a,b,); mdfy(,n,rt,c,d,);
tot++; mdfy(,n,,c,d,); mdfy(,n,rt,a,b,);
}
memset(dis,0x3f,sizeof dis);
dis[d1[p]]=; q.push(make_pair(,d1[p]));
while(q.size())
{
int k=q.top().second; q.pop();
if(vis[k])continue; vis[k]=;
for(int i=hd[k],v;i;i=nxt[i])
{
if(dis[v=to[i]]>dis[k]+w[i])
dis[v]=dis[k]+w[i],q.push(make_pair(-dis[v],v));
}
}
for(int i=;i<=n;i++,puts(""))wrt(dis[d1[i]]);
return ;
}

bzoj 3073 [Pa2011]Journeys ——线段树优化连边的更多相关文章

  1. bzoj 3073: [Pa2011]Journeys -- 线段树优化最短路

    3073: [Pa2011]Journeys Time Limit: 20 Sec  Memory Limit: 512 MB Description     Seter建造了一个很大的星球,他准备建 ...

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

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

  3. BZOJ3073: [Pa2011]Journeys(线段树优化建图 Dijkstra)

    题意 \(n\)个点的无向图,构造\(m\)次边,求\(p\)到任意点的最短路. 每次给出\(a, b, c, d\) 对于任意\((x_{a \leqslant x \leqslant b}, y_ ...

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

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

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

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

  6. 【题解】Journeys(线段树优化连边)

    [#3073. Pa2011]Journeys (线段树优化连边) 这张图太直观了,直接讲透了线段树优化连边的原理和正确性. 考虑建立两颗线段树,一颗是外向树,一颗是内向树,相当于网络流建模一样,我们 ...

  7. bzoj 3073 Journeys —— 线段树优化连边

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3073 建两棵线段树,一棵从下往上连边,一棵从上往下连边,叶子节点之间也有连边: 区间向区间连 ...

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

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

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

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

随机推荐

  1. php 字符串内容是数组格式 转换成数组

    一个简单的应用.. 例, $str    =    "array( 'USD'=>'1', 'GBP'=>'0.6494', 'EUR'=>'0.7668' ,'JPY'= ...

  2. 【Unity3D】【NGUI】Atlas的动态创建

    NGUI版本号:3.6.5 1.參见SZUIAtlasMakerRuntimeTest设置对应的值以上值须要提前设置好 2.没有检查是否atlas可以正确创建,自己可以改,增加返回值 3.代码都是在N ...

  3. MySQL的几种登陆方式

    MySQL的几种登陆方式 登录方式一:    [root@001 tmp]# mysql -h 127.0.0.1 -u root -p 这是最标准的登录方式,意指通过tTCP/IP协议进行连接,因为 ...

  4. iptables简易使用教程

    iptables是linux里比较常用的防火墙,也是centos7.0之前的版本默认自带的防火墙. 配置防火墙需特别注意一件事情:如果服务器在异地机房,需要谨慎配置端口,以免造成新配置生效后无法远程登 ...

  5. Socket的UDP协议在erlang中的实现

    现在我们看看UDP协议(User Datagram Protocol,用户数据报协议).使用UDP,互联网上的机器之间可以互相发送小段的数据,叫做数据报.UDP数据报是不可靠的,这意味着如果客户端发送 ...

  6. 调整图像的尺寸 - cvResize() 函数实现

    前言 有时会碰到一张图片太大了,想将它缩小.本文将讲解一个很好用的函数解决这个问题. 图像尺寸调整函数 cvResize() // 图像尺寸调整函数 void Resize ( const CvArr ...

  7. 【BZOJ4569】[Scoi2016]萌萌哒 倍增+并查集

    [BZOJ4569][Scoi2016]萌萌哒 Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条件表示为四 ...

  8. meaven环境变量配置

    首先,先到官网去下载maven.这里是官网的地址:http://maven.apache.org/download.cgi  请选择最新的版本下载,这里咱们下载的是apache-maven-3.1.1 ...

  9. 创建laravel项目

    下载项目到本地 git clone https://github.com/251068550/LaraBlog.git compoer安装 cd LaraBlog composer install 如 ...

  10. Appium移动自动化配置-ios&安卓

    官网安装参考:https://www.npmjs.com/package/appium Appium安装 1.安装nodejs 2.安装appium iOS侧环境安装 1.安装xcode 2.安装Xc ...