bzoj 3073 Journeys —— 线段树优化连边
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3073
建两棵线段树,一棵从下往上连边,一棵从上往下连边,叶子节点之间也有连边;
区间向区间连边时,可以新建一个节点,log2n 条边就能变成 2logn 条边;
注意区间向区间连边也要连反边,别忘了连反边时 ++cnt !
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define mid ((l+r)>>1)
using namespace std;
int const xxn=5e5+,xn=4e6+,xm=3e7+;
int n,m,hd[xn],ct,to[xm],nxt[xm],w[xm],dis[xn];
int rt[],cnt,ls[xxn<<],rs[xxn<<],st[xxn],ed[xxn];
bool vis[xn];
struct N{
int d,id;
bool operator < (const N &y) const
{return d==y.d?id<y.id:d>y.d;}
};
priority_queue<N>q;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
int gt[];
void wr(int x)
{
if(!x){puts(""); return;}
if(x<)putchar('-'),x=-x;
int t=;
while(x)gt[++t]=x%,x/=;
for(int i=t;i;i--)putchar(gt[i]+'');
puts("");
}
void add(int x,int y,int z){to[++ct]=y; nxt[ct]=hd[x]; w[ct]=z; hd[x]=ct;}
void build(int x,int l,int r,bool tp)
{
if(l==r)
{
if(!tp)st[l]=x; else ed[l]=x;
return;
}
ls[x]=++cnt; rs[x]=++cnt;
build(ls[x],l,mid,tp); build(rs[x],mid+,r,tp);
if(!tp)add(ls[x],x,),add(rs[x],x,);
else add(x,ls[x],),add(x,rs[x],);
}
void link(int x,int l,int r,int L,int R,int c,bool tp)
{
if(l>=L&&r<=R)
{
if(!tp)add(x,c,); else add(c,x,);
return;
}
if(mid>=L)link(ls[x],l,mid,L,R,c,tp);
if(mid<R)link(rs[x],mid+,r,L,R,c,tp);
}
void dij(int s)
{
memset(dis,0x3f,sizeof dis);
dis[s]=; q.push((N){,s});
while(q.size())
{
int x=q.top().id; q.pop();
if(vis[x])continue; vis[x]=;
for(int i=hd[x],u;i;i=nxt[i])
if(dis[u=to[i]]>dis[x]+w[i])
dis[u]=dis[x]+w[i],q.push((N){dis[u],u});
}
}
int main()
{
n=rd(); m=rd(); int p=rd();
rt[]=++cnt; build(rt[],,n,);
rt[]=++cnt; build(rt[],,n,);
for(int i=;i<=n;i++)add(ed[i],st[i],);
for(int i=,a,b,c,d;i<=m;i++)
{
a=rd(); b=rd(); c=rd(); d=rd(); int t=++cnt;
link(rt[],,n,a,b,t,); link(rt[],,n,c,d,t,);
t=++cnt;//!!!
link(rt[],,n,c,d,t,); link(rt[],,n,a,b,t,);
}
dij(ed[p]);
for(int i=;i<=n;i++)wr(dis[ed[i]]);
return ;
}
bzoj 3073 Journeys —— 线段树优化连边的更多相关文章
- 【题解】Journeys(线段树优化连边)
[#3073. Pa2011]Journeys (线段树优化连边) 这张图太直观了,直接讲透了线段树优化连边的原理和正确性. 考虑建立两颗线段树,一颗是外向树,一颗是内向树,相当于网络流建模一样,我们 ...
- 【bzoj3073】[Pa2011]Journeys 线段树优化建图+堆优化Dijkstra
题目描述 Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a, ...
- bzoj 3073: [Pa2011]Journeys -- 线段树优化最短路
3073: [Pa2011]Journeys Time Limit: 20 Sec Memory Limit: 512 MB Description Seter建造了一个很大的星球,他准备建 ...
- bzoj 3073 [Pa2011]Journeys ——线段树优化连边
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3073 建两棵线段树,一棵孩子向父亲连边,是走出去的:一棵父亲向孩子连边,是走进来的. 注意第 ...
- BZOJ3073: [Pa2011]Journeys(线段树优化建图 Dijkstra)
题意 \(n\)个点的无向图,构造\(m\)次边,求\(p\)到任意点的最短路. 每次给出\(a, b, c, d\) 对于任意\((x_{a \leqslant x \leqslant b}, y_ ...
- BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)
BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...
- 【BZOJ3073】[Pa2011]Journeys 线段树+堆优化Dijkstra
[BZOJ3073][Pa2011]Journeys Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在 ...
- bzoj千题计划311:bzoj5017: [Snoi2017]炸弹(线段树优化tarjan构图)
https://www.lydsy.com/JudgeOnline/problem.php?id=5017 暴力: 对于每一个炸弹,枚举所有的炸弹,看它爆炸能不能引爆那个炸弹 如果能,由这个炸弹向引爆 ...
- BZOJ 3790 神奇项链(回文自动机+线段树优化DP)
我们预处理出来以i为结尾的最长回文后缀(回文自动机的构建过程中就可以求出)然后就是一个区间覆盖,因为我懒得写贪心,就写了线段树优化的DP. #include<iostream> #incl ...
随机推荐
- P1067 多项式输出 (模拟)
题目描述 一元nn次多项式可用如下的表达式表示: 其中,a_i x^i 称为i次项,ai 称为i次项的系数.给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式: 多项式中自变量 ...
- 2017-10-23学大伟业Day1
T1 叉叉 题目名称 叉叉 程序文件名 cross 输入文件名 cross.in 输出文件名 cross.out 每个测试点时限 1秒 内存限制 128MB 测试点数目 10 每个测试点分值 10 是 ...
- spark再总结
1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduce的通用的并行计算框架. dfsSpark基于mapreduce算法实现的分布式计算,拥有HadoopM ...
- FFT/NTT模板 既 HDU1402 A * B Problem Plus
@(学习笔记)[FFT, NTT] Problem Description Calculate A * B. Input Each line will contain two integers A a ...
- systemtap-note-6-userspace-stack-backtrace
http://nanxiao.me/systemtap-note-6-userspace-stack-backtrace/
- 通过BSSID和无线流量传输后门Payload
本文将探讨无线接入点(AP)和BSSID(MAC地址AP).我们不借助文件系统加密和文件系统中(仅内存中)的硬编码Payload即可获得后门Payload,通过该方法可绕过所有的杀软,可以不使用Pay ...
- [scrapy]Item Loders
Items Items就是结构化数据的模块,相当于字典,比如定义一个{"title":"","author":""},i ...
- [React] Create and import React components with Markdown using MDXC
In this lesson I demonstrate how to use the library MDXC to create and import React components with ...
- 在运行hadoop是出现Master的9000端口拒绝访问的情况
出现9000端口拒绝访问的情况有可能是防火墙没有开放9000端口,可以选择关闭防火墙或者卸载防火墙,如果还是无法解决这种情况可能是因为hadoop的启动顺序不对. 应该按照如下得顺序启动 Step2: ...
- 教你如何在MySql中导入大小超过2M的数据库文件
我的个人实践是:phpmyadmin 导出 utf-8 的 insert 模式的 abc.sql ftp abc.sql 到服务器 ssh 到服务器 mysql -u abc -p use KKK(数 ...