[PA 2011] Journeys
[题目链接]
https://www.lydsy.com/JudgeOnline/problem.php?id=3073
[算法]
考虑线段树优化建图
建立两棵线段树 , 一棵为入树 , 一棵为出树 ,连边时 , 我们只需建立超级点S , 将区间[A , B]与点S连边 , 点S与区间[C , D]连边
然后使用01BFS或Dijkstra算法求解最短路即可
时间复杂度 : O(NlogN)
[代码]
#include<bits/stdc++.h>
using namespace std;
#define MAXN 500010
const int inf = 1e9;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull; struct Node
{
int lc , rc;
} a[MAXN * ]; int cnt , tot , n , m , P;
int root[] , head[MAXN * ] , dist[MAXN * ] , to[MAXN * ] , nxt[MAXN * ];
bool visited[MAXN * ] , w[MAXN * ]; template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
inline void addedge(int u , int v , int c)
{
++cnt;
to[cnt] = v;
w[cnt] = c;
nxt[cnt] = head[u];
head[u] = cnt;
}
inline void buildA(int &now , int l , int r)
{
if (l != r) now = ++tot;
else
{
now = l;
return;
}
int mid = (l + r) >> ;
buildA(a[now].lc , l , mid);
buildA(a[now].rc , mid + , r);
addedge(a[now].lc , now , );
addedge(a[now].rc , now , );
}
inline void buildB(int &now , int l , int r)
{
if (l != r) now = ++tot;
else
{
now = l;
return;
}
int mid = (l + r) >> ;
buildB(a[now].lc , l , mid);
buildB(a[now].rc , mid + , r);
addedge(now , a[now].lc , );
addedge(now , a[now].rc , );
}
inline void updateB(int now , int l , int r , int ql , int qr , int s)
{
if (l == ql && r == qr)
addedge(s , now , );
else
{
int mid = (l + r) >> ;
if (mid >= qr) updateB(a[now].lc , l , mid , ql , qr , s);
else if (mid + <= ql) updateB(a[now].rc , mid + , r , ql , qr , s);
else
{
updateB(a[now].lc , l , mid , ql , mid , s);
updateB(a[now].rc , mid + , r , mid + , qr , s);
}
}
}
inline void updateA(int now , int l , int r , int ql , int qr , int s)
{
if (l == ql && r == qr)
addedge(now , s , );
else
{
int mid = (l + r) >> ;
if (mid >= qr) updateA(a[now].lc , l , mid , ql , qr , s);
else if (mid + <= ql) updateA(a[now].rc , mid + , r , ql , qr , s);
else
{
updateA(a[now].lc , l , mid , ql , mid , s);
updateA(a[now].rc , mid + , r , mid + , qr , s);
}
}
}
inline void dijkstra(int S)
{
priority_queue< pair<int , int> , vector< pair<int , int> > , greater< pair<int , int> > > q;
for (int i = ; i <= tot; i++) dist[i] = inf;
q.push(make_pair( , S));
dist[S] = ;
while (!q.empty())
{
int cur = q.top().second;
q.pop();
if (visited[cur]) continue;
visited[cur] = true;
for (int i = head[cur]; i; i = nxt[i])
{
int v = to[i] , c = w[i];
if (dist[cur] + c < dist[v])
{
dist[v] = dist[cur] + c;
q.push(make_pair(dist[v] , v));
}
}
}
} int main()
{ read(n); read(m); read(P);
tot = n;
buildA(root[] , , n);
buildB(root[] , , n);
for (int i = ; i <= m; i++)
{
int A , B , C , D;
read(A); read(B); read(C); read(D);
updateA(root[] , , n , A , B , ++tot);
updateB(root[] , , n , C , D , tot);
updateA(root[] , , n , C , D , ++tot);
updateB(root[] , , n , A , B , tot);
}
dijkstra(P);
for (int i = ; i <= n; i++) printf("%d\n" , dist[i] >> ); return ; }
[PA 2011] Journeys的更多相关文章
- MSCRM 2011 操作大全
CRM字段类型:货币:new Money(Decimal){SQL更新Money类型字段,需要同时更新_base字段,存在汇率差的时候值不同}查找:new EntityReference(object ...
- BZOJ2348: [Baltic 2011]Plagiarism
2348: [Baltic 2011]Plagiarism Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 304 Solved: 141[Submit ...
- BZOJ3188: [Coci 2011]Upit
3188: [Coci 2011]Upit Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 72 Solved: 24[Submit][Status] ...
- 【BZOJ2395】[Balkan 2011]Timeismoney
[BZOJ2395][Balkan 2011]Timeismoney 题面 \(darkbzoj\) 题解 如果我们只有一个条件要满足的话直接最小生成树就可以了,但是现在我们有两维啊... 我们将每个 ...
- bzoj 3073: [Pa2011]Journeys -- 线段树优化最短路
3073: [Pa2011]Journeys Time Limit: 20 Sec Memory Limit: 512 MB Description Seter建造了一个很大的星球,他准备建 ...
- Image Processing and Analysis_8_Edge Detection:Edge and line oriented contour detection State of the art ——2011
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
- [C#项目开源] MongoDB 可视化管理工具 (2011年10月-至今)
正文 该项目从2011年10月开始开发,知道现在已经有整整5年了.MongoDB也从一开始的大红大紫到现在趋于平淡. MongoCola这个工具在一开始定位的时候只是一个Windows版本的工具,期间 ...
- BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]
2440: [中山市选2011]完全平方数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3028 Solved: 1460[Submit][Sta ...
- Step by step Dynamics CRM 2011升级到Dynamics CRM 2013
原创地址:http://www.cnblogs.com/jfzhu/p/4018153.html 转载请注明出处 (一)检查Customizations 从2011升级到2013有一些legacy f ...
随机推荐
- Rebuild account Windows 10 in Domain
cmd ‘administrator’Regedit 1. Check User Profiles HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\C ...
- cucumber 使用资料
1.cucumber reporting github:https://github.com/damianszczepanik/cucumber-reporting 配置:详细参考上述地址描述 a.添 ...
- uva 11127(暴力)
题意:给出一个字符串,包含0.1.*,当中×是能够替换成0或者1的,假设字符串的某个子串S有SSS这种连续反复3次出现,不是Triple-free串,问给出的字符串能够形成多少个非Triple-fre ...
- OpenCV入门笔记(一) Linux下的安装
关于OpenCV,有中文的官方站点.里面翻译了官网的教程和API等.中文官方Tutorials见这里:[Tutorials] 一.Ubuntu下的安装 能够选择直接从库里安装,或者手动编译安装,请參考 ...
- 关于CUDA两种API:Runtime API 和 Driver API
CUDA 眼下有两种不同的 API:Runtime API 和 Driver API,两种 API 各有其适用的范围. 高级API(cuda_runtime.h)是一种C++ ...
- vue native
1.示例 <el-icon icon="Setting" size="sm" @click.native="ceshi">< ...
- ollydbg快速定位方便调试
在ollydbg调试的时候,会看到大量的汇编代码(远多于源代码),代码中有大量的函数嵌套调用,调试起来周期很长,难度比较大. 所以我们希望能快速定位到代码,以下是快速定位的四种方法: 1.Goto命令 ...
- Spring Cloud(十一):Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式
上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制,但其实Zuul还有更多的应用场景,比如:鉴权.流量转发.请求统计等等,这些功能都可以使用Zuul来实现. Zuul的核心 Filter是Zuu ...
- PHP获取IP
<?php $iipp = $_SERVER["REMOTE_ADDR"]; echo $iipp ; ?>
- go map 线程不安全 安全措施
go map 线程不安全 安全措施