bzoj 3073 [Pa2011]Journeys ——线段树优化连边
题目: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 ——线段树优化连边的更多相关文章
- bzoj 3073: [Pa2011]Journeys -- 线段树优化最短路
3073: [Pa2011]Journeys Time Limit: 20 Sec Memory Limit: 512 MB Description Seter建造了一个很大的星球,他准备建 ...
- 【bzoj3073】[Pa2011]Journeys 线段树优化建图+堆优化Dijkstra
题目描述 Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a, ...
- BZOJ3073: [Pa2011]Journeys(线段树优化建图 Dijkstra)
题意 \(n\)个点的无向图,构造\(m\)次边,求\(p\)到任意点的最短路. 每次给出\(a, b, c, d\) 对于任意\((x_{a \leqslant x \leqslant b}, y_ ...
- BZOJ_3073_[Pa2011]Journeys_线段树优化建图+BFS
BZOJ_3073_[Pa2011]Journeys_线段树优化建图+BFS Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N ...
- 【BZOJ3073】[Pa2011]Journeys 线段树+堆优化Dijkstra
[BZOJ3073][Pa2011]Journeys Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在 ...
- 【题解】Journeys(线段树优化连边)
[#3073. Pa2011]Journeys (线段树优化连边) 这张图太直观了,直接讲透了线段树优化连边的原理和正确性. 考虑建立两颗线段树,一颗是外向树,一颗是内向树,相当于网络流建模一样,我们 ...
- bzoj 3073 Journeys —— 线段树优化连边
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3073 建两棵线段树,一棵从下往上连边,一棵从上往下连边,叶子节点之间也有连边: 区间向区间连 ...
- BZOJ 3073: [Pa2011]Journeys Dijkstra+线段树优化建图
复习一下线段树优化建图:1.两颗线段树的叶子节点的编号是公用的. 2.每次连边是要建两个虚拟节点 $p1,p2$ 并在 $p1,p2$ 之间连边. #include <bits/stdc++.h ...
- bzoj3073: [Pa2011]Journeys 线段树优化建图
bzoj3073: [Pa2011]Journeys 链接 BZOJ 思路 区间和区间连边.如何线段树优化建图. 和单点连区间类似的,我们新建一个点,区间->新点->区间. 又转化成了单点 ...
随机推荐
- SpringMvc自动代理
自动配置的好处是不需要挨个 实现[org.springframework.aop.framework.ProxyFactoryBean] ,只需要 advisor 配置和 <bean id=&q ...
- EF获取DbContext中已注册的所有实体类型
/// <summary> /// 获取DbContext中已注册的实体类型 /// </summary> /// <typeparam name="T&quo ...
- webpy使用mysql数据库操作(web.database)
webpy_web.database模块 webpy框架中使用mysql管理数据库有两种方法,一种是使用python里面的MySQLdb模块: import MySQLdb 还有一种就是用webpy自 ...
- android菜鸟学习笔记17----Android数据存储(一)文件读写
假如有如下需求,要求能够记录用户输入的用户名和密码,下次登录时,能直接获取之前保存的用户名密码,并在相应的EditText中显示. 要保存用户输入的数据,最先想到的应该就是文件读写了. 通过对andr ...
- 转义字符\r \n \t \b 截图
- HTML 学习笔记 JQuery(DOM 操作3)
设置和获取HTML 文本 和 值 1.html()方法 类似于JavaScript中的innerHTML属性,可以用来读取或者设置某个元素中的HTML内容 例子 <html> <he ...
- Django框架打印orm转换过程中的sql_模型层
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBU ...
- linux怎么设置vsftp用户访问目录权限
1.在指定的目录创建文件夹(访问的目录): mkdir picture 2.创建一个用户组(zdhgroup): groupadd zdhgroup 3.创建一个用户并指定路径和组: useradd ...
- PHP上传视频
https://github.com/chaping/plupload_docs 这下载 lupload有以下功能和特点: 1.拥有多种上传方式:HTML5.flash.silverlight以及传统 ...
- Qt — tableWidget插入复选框
之前不太了解Qt中的相关控件,一直尝试直接在tableview上增加复选框. 但相对来说,在tableview增加复选框的工作量与麻烦程度远超tableWidget. 接下来是如何在Qt的tableW ...