【BZOJ3073】[Pa2011]Journeys 线段树+堆优化Dijkstra
【BZOJ3073】[Pa2011]Journeys
Description
Input
Output
Sample Input
1 2 4 5
5 5 4 4
1 1 3 3
Sample Output
1
2
0
1
题解:珍爱生命,远离vector!珍爱生命,远离cfree!
ZZ一上午就跟这道题耗上了,一开始想用线段树维护一堆vector,然后用并查集+BFS来搞,结果就死在了vector的删除操作上啊~,各种奇葩错误信息直接将cfree搞炸了,然后卸载+重启+重装了n次也不好使,于是默默回归gdb。。。
于是最后还是放弃,学了用线段树优化建图+Dijkstra,具体方法:
建立两棵线段树,A树从所有节点向父亲连边,B树从所有节点向儿子连边,从B树的所有叶子向A树的所有叶子连边,边权都是0。
对于每个操作,新建节点c,从A中对应的节点向c连边,从c向B中对应节点连边,边权都是${1\over2}$
然后跑Dijkstra就行了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <utility>
#define mp(A,B) make_pair(A,B)
#define lson (x<<1)
#define rson (x<<1|1)
using namespace std;
const int maxn=500010;
typedef pair<int,int> pii;
int n,m,S,tot,cnt;
int vis[5000000],dis[5000000],pos[maxn];
int to[30000000],next[30000000],val[30000000],head[5000000];
priority_queue<pii> pq;
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void add(int a,int b,int c)
{
to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
}
struct sag
{
void build(int l,int r,int x,int flag)
{
if(l==r)
{
if(!flag) pos[l]=x;
else add(x+4*n,x,0);
return ;
}
int mid=l+r>>1;
build(l,mid,lson,flag),build(mid+1,r,rson,flag);
if(flag) add(x+4*n,lson+4*n,0),add(x+4*n,rson+4*n,0);
else add(lson,x,0),add(rson,x,0);
}
void updata(int l,int r,int x,int a,int b,int c,int flag)
{
if(a<=l&&r<=b)
{
if(!flag) add(x,c,1);
else add(c,x+4*n,1);
return ;
}
int mid=l+r>>1;
if(a<=mid) updata(l,mid,lson,a,b,c,flag);
if(b>mid) updata(mid+1,r,rson,a,b,c,flag);
}
}s1,s2;
int main()
{
n=rd(),m=rd(),S=rd();
int i,a,b,c,d;
memset(head,-1,sizeof(head));
s1.build(1,n,1,0),s2.build(1,n,1,1);
tot=n<<3;
for(i=1;i<=m;i++)
{
a=rd(),b=rd(),c=rd(),d=rd();
s1.updata(1,n,1,a,b,++tot,0),s2.updata(1,n,1,c,d,tot,1);
s1.updata(1,n,1,c,d,++tot,0),s2.updata(1,n,1,a,b,tot,1);
}
memset(dis,0x3f,sizeof(dis));
pq.push(mp(0,pos[S])),dis[pos[S]]=0;
int u;
while(!pq.empty())
{
u=pq.top().second,pq.pop();
if(vis[u]) continue;
vis[u]=1;
for(i=head[u];i!=-1;i=next[i])
if(dis[to[i]]>dis[u]+val[i])
dis[to[i]]=dis[u]+val[i],pq.push(mp(-dis[to[i]],to[i]));
}
for(i=1;i<=n;i++) printf("%d\n",dis[pos[i]]>>1);
return 0;
}
【BZOJ3073】[Pa2011]Journeys 线段树+堆优化Dijkstra的更多相关文章
- bzoj3073: [Pa2011]Journeys 线段树优化建图
bzoj3073: [Pa2011]Journeys 链接 BZOJ 思路 区间和区间连边.如何线段树优化建图. 和单点连区间类似的,我们新建一个点,区间->新点->区间. 又转化成了单点 ...
- BZOJ3073: [Pa2011]Journeys(线段树优化建图 Dijkstra)
题意 \(n\)个点的无向图,构造\(m\)次边,求\(p\)到任意点的最短路. 每次给出\(a, b, c, d\) 对于任意\((x_{a \leqslant x \leqslant b}, y_ ...
- 【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 建两棵线段树,一棵孩子向父亲连边,是走出去的:一棵父亲向孩子连边,是走进来的. 注意第 ...
- 【bzoj4016】[FJOI2014]最短路径树问题 堆优化Dijkstra+DFS树+树的点分治
题目描述 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多条长度最短的路径,则选择经过的顶点序列字典序最小的那条路径( ...
- BZOJ_3073_[Pa2011]Journeys_线段树优化建图+BFS
BZOJ_3073_[Pa2011]Journeys_线段树优化建图+BFS Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N ...
- BZOJ3073 Journeys - 线段树优化建边
传送门 题意: Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路: ...
- BZOJ 3040 最短路 (堆优化dijkstra)
这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为 ...
随机推荐
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何配置虚拟轴 TC3
在Motion上添加一个NC Task 在Axis上右击添加一个轴,类型为Continuous Axis 在PLC上右击添加新项,然后添加一个PLC项目 在引用中添加TC2_MC2的库引用 ...
- JSP--百度百科
JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它[1] 是由Sun Microsystems公司倡导.许多公司参与一起建立的一种动 ...
- 【Python3 爬虫】01_简单页面抓取
运行平台:Winodows 10 Python版本:Python 3.4.2 IDE:Sublime text3 网络爬虫 网络爬虫,也叫网络蜘蛛(Web Spider),如果把互联网比喻成一个蜘蛛网 ...
- OgnlValueStack:49 - Error setting expression 'sfjmyh.zdyx6' with value '[Ljava.lang.String;@28d320d6'
作过户管理流程时,提交表单后控制台显示如下错误 : WARN com.opensymphony.xwork2.ognl. OgnlValueStack:60 - Error setting expre ...
- asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(六)—— 简单过滤器的使用
有些同学喜欢在测试或运行项目时,直接跳转页面到Home/Index下,但本次项目直接输入Home/Index则会报错 因为home/index中有个user.name参数,如果启动项目后直接跳转到ho ...
- Cocos2dx3.0过渡篇 globalZOrder()与localZOrder()
这篇博客的标题本想叫“...3.0新的渲染...介绍”,最后还是拉不下这个脸.为啥?觉得自己对渲染的认识还是过于表面,谈不上理解.当然了,这并不影响这篇博客继续写下去.下面看一段3.0Release ...
- 查看电脑CPU核心数的方法
查看电脑CPU核心数的方法: 方法一: 同时按下[Ctrl+Shift+Esc]组合快捷键打开任务管理器: 点击[性能]就可以看出是几核CPU了: 方法二: 在计算机图标上面点击右键,选择“管理”: ...
- sql笔记 获取指定数据库下的所有表
SELECT Name FROM 数据库名称..SysObjects Where XType='U' ORDER BY Name XType='U' 标识查询用户创建的表 S为系统创建的表
- springboot学习(四) 日志管理
1.简介 Spring Boot内部日志系统使用的是Commons Logging,但开放底层的日志实现.默认为会Java Util Logging, Log4J, Log4J2和Logback提供配 ...
- ipk CONTROL 目录的作用
CONTROL文件夹下的文件意义preinst - shell script,在ipk包开始安装前执行;postinst - shell script,在ipk包安装后执行; ...