[题目链接]

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的更多相关文章

  1. MSCRM 2011 操作大全

    CRM字段类型:货币:new Money(Decimal){SQL更新Money类型字段,需要同时更新_base字段,存在汇率差的时候值不同}查找:new EntityReference(object ...

  2. BZOJ2348: [Baltic 2011]Plagiarism

    2348: [Baltic 2011]Plagiarism Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 304  Solved: 141[Submit ...

  3. BZOJ3188: [Coci 2011]Upit

    3188: [Coci 2011]Upit Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 72  Solved: 24[Submit][Status] ...

  4. 【BZOJ2395】[Balkan 2011]Timeismoney

    [BZOJ2395][Balkan 2011]Timeismoney 题面 \(darkbzoj\) 题解 如果我们只有一个条件要满足的话直接最小生成树就可以了,但是现在我们有两维啊... 我们将每个 ...

  5. bzoj 3073: [Pa2011]Journeys -- 线段树优化最短路

    3073: [Pa2011]Journeys Time Limit: 20 Sec  Memory Limit: 512 MB Description     Seter建造了一个很大的星球,他准备建 ...

  6. Image Processing and Analysis_8_Edge Detection:Edge and line oriented contour detection State of the art ——2011

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  7. [C#项目开源] MongoDB 可视化管理工具 (2011年10月-至今)

    正文 该项目从2011年10月开始开发,知道现在已经有整整5年了.MongoDB也从一开始的大红大紫到现在趋于平淡. MongoCola这个工具在一开始定位的时候只是一个Windows版本的工具,期间 ...

  8. BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3028  Solved: 1460[Submit][Sta ...

  9. Step by step Dynamics CRM 2011升级到Dynamics CRM 2013

    原创地址:http://www.cnblogs.com/jfzhu/p/4018153.html 转载请注明出处 (一)检查Customizations 从2011升级到2013有一些legacy f ...

随机推荐

  1. open-falcon的邮件报警

    mail-provider提供http邮件服务,和邮件服务器打通 falcon-sender 负责收集falcon的邮件,然后通过mail-provider发送出去 mail-provider 把sm ...

  2. linux中断子系统:中断号的映射与维护初始化mmap过程

    本文均属自己阅读源代码的点滴总结.转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:gzzaigcn2009@163.com 写在前沿: 好久好久没有静下心来整理一些东西了 ...

  3. R语言数据分析系列之五

    R语言数据分析系列之五 -- by comaple.zhang 本节来讨论一下R语言的基本图形展示,先来看一张效果图吧. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi ...

  4. TNS-01201: Listener cannot find executablen 错误

    近期在启动监听器的时候收到了TNS-01201: Listener cannot find executable...的错误提示.这个错误还真是一个一直没有碰到过的错误.咋一看还真不明确是怎么一回事呢 ...

  5. 日常沟通的 3 种模式zz

    一.日常沟通的 3 种模式 根据NLP (Neuro-Linguistic Programming,神经语言程序学),日常沟通的 3 种模式分别是:上堆.下切和平行,它们是什么意思呢? 1.上堆 意思 ...

  6. wmware搬家

    由于D盘空间不足D:\Users\Documents\Virtual Machines文件夹剪切至E:\Virtual Machines. 先关闭虚拟机 然后剪切 直接通过icon无法打开 先运行E: ...

  7. 08 comet反向ajax

    一:HTTP协议与技久链接+分块传输---->反向ajax 反向ajax又叫comet, server push,服务器推技术. 应用范围: 网页聊天服务器,, 新浪微博在线聊天,google ...

  8. 第 2 章 第 9 题 顺序 & 二分搜索效率分析问题

    问题分析 顺序搜索的时间复杂度是O( n ),二分搜索的时间复杂度级别是O( lgn ).但这并不代表二分的时间开销就一定比顺序的小,因为二分搜索有个前提:元素必须要是有序的.如果仅仅为了二分搜索几个 ...

  9. 【上】安全HTTPS-全面具体解释对称加密,非对称加密,数字签名,数字证书和HTTPS

    一,对称加密 所谓对称加密.就是它们在编码时使用的密钥e和解码时一样d(e=d),我们就将其统称为密钥k. 对称加解密的步骤例如以下: 发送端和接收端首先要共享同样的密钥k(即通信前两方都须要知道相应 ...

  10. android-async-http框架

    android-async-http 简单介绍:An asynchronous, callback-based Http client for Android built on top of Apac ...