[题目链接]

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. 【Todo】各种语言里面的for循环 & loop

    会的语言多了,不同语言的语法就会混淆.整理了一下. Java里面: 普通的for循环之外: 有以下格式: for (int x : intarr) { } JS里面: }; for (x in per ...

  2. C# 将long类型写入二进制文件用bw.Write(num);将其读出用long num= br.ReadInt64();

    理由: 因为long类型是 System.Int64 (长整型,占 8 字节,表示 64 位整数,范围大约 -(10 的 19) 次方 到 10 的 19 次方) 而long BinaryReader ...

  3. FTPClient listFiles 阻塞问题

    Android端使用 FTPClient 实现上传文件到到filezilla server(filezilla server部署在阿里云服务器)出现 listFiles阻塞.具体的现象是 Ftp Cl ...

  4. PHP读取远程文件的4种方法

    1. fopen, fread1 if($file = fopen("http://www.example.com/", "r")) {2 while(!feo ...

  5. pyqt5 学习总结

    关于基类 一般的文件都会基于QWidget,QtWidgets.QMainWindow 或QDialog,like this class Example(QWidget): QWidget类是所有用户 ...

  6. inception安装步骤---自己整理的安装步骤

    inception安装步骤---自己整理的安装步骤2015-09-18 15:51 6185人阅读 评论(1) 收藏 举报 分类: inception相关版权声明:本文为博主原创文章,未经博主允许不得 ...

  7. 【TensorFlow-windows】(五) CNN(卷积神经网络)对cifar10的识别

    主要内容: 1.基于CNN的cifar10识别(详细代码注释) 2.该实现中的函数总结 平台: 1.windows 10 64位 2.Anaconda3-4.2.0-Windows-x86_64.ex ...

  8. 目标检测之harr---点角检测harr

    Haar特征与积分图 1. Adaboost方法的引入 1.1 Boosting方法的提出和发展 在了解Adaboost方法之前,先了解一下Boosting方法. 回答一个是与否的问题,随机猜测可以获 ...

  9. android android:duplicateParentState=&quot;true&quot; &quot;false&quot;

    今天要做一个效果.组件RelativeLayout上有两个TextView.这两个TextView具有不同的颜色值,如今要的效果是,当RelativeLayout被点击时,整个item有高亮背景. 同 ...

  10. 【推荐】初级.NET程序员,你必须知道的EF知识和经验

    阅读目录   推荐MiniProfiler插件 数据准备 foreach循环的陷进 AutoMapper工具 联表查询统计 性能提升之AsNonUnicode 性能提升之AsNoTracking 多字 ...