[题目链接]

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. Android 设定横屏,禁止屏幕旋转,Activity重置 [更新视频播放器相关]

    1. 设定屏幕方向 当指定了屏幕的方向后(非SCREEN_ORIENTATION_UNSPECIFIED),屏幕就不会自己主动的旋转了 有2中方式控制屏幕方向: 1.1 改动AndroidManife ...

  2. mysql: expire_logs_days设置后无效问题

    Sina blog - MySQL的 expire_logs_days 和 PURGE MASTER LOGS 无效问题

  3. C#给指定doc文件写入宏

    private void InsertMacro() { Word.Application oWord; Word.Document oDoc; VBIDE.VBComponent oModule; ...

  4. response响应和User-Agent历史

    返回百度的源码,没有任何伪装: response是服务器响应的类文件,除了支持文件操作的方法以外,还支持以下方法:

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

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

  6. 2016最新手机号码正则、身份证JS正则表达式

    js最新手机号码.身份证正则表达式   身份证正则: //身份证正则表达式(15位) isIDCard1=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1] ...

  7. .NET 4.0 WCF WebConfig aspNetCompatibilityEnabled 属性

    近来被一个问题困扰了好久,好好的一个WCF后台服务,在发布机器上可用.在自己机器上没法跑起来. 一直提示兼容性问题,后来在网上找来解决方案,但问题依旧.没办法又从客户的服务器上重新把配置内容 拿下来审 ...

  8. poj3034--Whac-a-Mole(dp)

    题目链接:id=3034">点击打开链接 题目大意:砸地鼠游戏,n*n的方格,锤子每次最多移动d,地鼠在t时刻出如今(x,y)时间.维持一个单位时间,不会在同一时间同一位置出现两仅仅老 ...

  9. PHP网站加网站访问量统计

    新建cnt.php <?php $n=file_get_contents('cnt.txt'); $n++; file_put_contents('cnt.txt',$n); echo &quo ...

  10. 浅谈 SOAP

    http://www.ibm.com/developerworks/cn/xml/x-sisoap/ 本文对 SOAP 作了一个初步介绍,给出几个简单示例:接着比较 CORBA,DCOM/COM 与 ...