[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 ...
随机推荐
- 【Todo】各种语言里面的for循环 & loop
会的语言多了,不同语言的语法就会混淆.整理了一下. Java里面: 普通的for循环之外: 有以下格式: for (int x : intarr) { } JS里面: }; for (x in per ...
- C# 将long类型写入二进制文件用bw.Write(num);将其读出用long num= br.ReadInt64();
理由: 因为long类型是 System.Int64 (长整型,占 8 字节,表示 64 位整数,范围大约 -(10 的 19) 次方 到 10 的 19 次方) 而long BinaryReader ...
- FTPClient listFiles 阻塞问题
Android端使用 FTPClient 实现上传文件到到filezilla server(filezilla server部署在阿里云服务器)出现 listFiles阻塞.具体的现象是 Ftp Cl ...
- PHP读取远程文件的4种方法
1. fopen, fread1 if($file = fopen("http://www.example.com/", "r")) {2 while(!feo ...
- pyqt5 学习总结
关于基类 一般的文件都会基于QWidget,QtWidgets.QMainWindow 或QDialog,like this class Example(QWidget): QWidget类是所有用户 ...
- inception安装步骤---自己整理的安装步骤
inception安装步骤---自己整理的安装步骤2015-09-18 15:51 6185人阅读 评论(1) 收藏 举报 分类: inception相关版权声明:本文为博主原创文章,未经博主允许不得 ...
- 【TensorFlow-windows】(五) CNN(卷积神经网络)对cifar10的识别
主要内容: 1.基于CNN的cifar10识别(详细代码注释) 2.该实现中的函数总结 平台: 1.windows 10 64位 2.Anaconda3-4.2.0-Windows-x86_64.ex ...
- 目标检测之harr---点角检测harr
Haar特征与积分图 1. Adaboost方法的引入 1.1 Boosting方法的提出和发展 在了解Adaboost方法之前,先了解一下Boosting方法. 回答一个是与否的问题,随机猜测可以获 ...
- android android:duplicateParentState="true" "false"
今天要做一个效果.组件RelativeLayout上有两个TextView.这两个TextView具有不同的颜色值,如今要的效果是,当RelativeLayout被点击时,整个item有高亮背景. 同 ...
- 【推荐】初级.NET程序员,你必须知道的EF知识和经验
阅读目录 推荐MiniProfiler插件 数据准备 foreach循环的陷进 AutoMapper工具 联表查询统计 性能提升之AsNonUnicode 性能提升之AsNoTracking 多字 ...