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 思路 区间和区间连边.如何线段树优化建图. 和单点连区间类似的,我们新建一个点,区间->新点->区间. 又转化成了单点 ...
随机推荐
- 软件工程第2次作业——Visual Studio 2017下基于C/C++的VSTS单元测试实践
Write one minute, test all day long. 环境确定 IDE:Microsoft Visual Studio 2017 Community 语言:C++ 单元测试工具:V ...
- SQL Server外连接、内连接、交叉连接
小编在做组织部维护最后收尾工作的时候,遇到了这样一个问题,须要将定性考核得分查出来.定量考核相应的数据查出来并进行得分计算.附加分查出来,最后将这三部分信息汇总之后得到总成绩,假设当中一项成绩没有进行 ...
- linux下开启ftp的21号port
1.先执行vsftpd服务: #service vsftpd start 2.通过iptables开放21号port (1) 先查看iptables设置: #iptables -nL Chain IN ...
- JS实现图片无缝滚动特效;附addEventListener()方法、offsetLeft和offsetWidth属性。
一:html部分 <body> <input id="btn1" type="button" value="向左"> ...
- 九度OJ 1052:找x (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7335 解决:3801 题目描述: 输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数 ...
- Makefile注意点总结
1 "="和":=" "="号赋值时,如果右边的值里面有未展开的变量,要等到整个Makefile的变量处理完之后,再展开,也就是说,如果该未 ...
- cocos2d-js添加百度appx的插屏广告(通过jsb反射机制)
本来一直用的anysdk接入广告,结果从前几天开始,百度商店的审核总是通不过,结果一问才知道:要上传到百度商店就必须要用百度的appx(真的是各种坑,我们这些个人开发者迟早要被你们大公司玩死),没办法 ...
- 性能测试--Jmeter之wordpress示例
Jmeter之wordpress示例 WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理 ...
- mooc课程mit 6.00.1x--problem set3解决方法
RADIATION EXPOSURE 挺简单的一道题,计算函数和算法过程都已经给出,做一个迭代计算就行了. def radiationExposure(start, stop, step): ''' ...
- Linux-3.14.12内存管理笔记【kmalloc与kfree实现】【转】
本文转载自:http://blog.chinaunix.net/uid-26859697-id-5573776.html kmalloc()是基于slab/slob/slub分配分配算法上实现的,不少 ...