【BZOJ3073】[Pa2011]Journeys

Description

Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路。N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a,b),(c,d)表示,对于任意两个国家x,y,如果a<=x<=b,c<=y<=d,那么在xy之间建造一条道路。Seter保证一条道路不会修建两次,也保证不会有一个国家与自己之间有道路。
Seter好不容易建好了所有道路,他现在在位于P号的首都。Seter想知道P号国家到任意一个国家最少需要经过几条道路。当然,Seter保证P号国家能到任意一个国家。
注意:可能有重边

Input

第一行三个数N,M,P。N<=500000,M<=100000。
后M行,每行4个数A,B,C,D。1<=A<=B<=N,1<=C<=D<=N。

Output

N行,第i行表示P号国家到第i个国家最少需要经过几条路。显然第P行应该是0。

Sample Input

5 3 4
1 2 4 5
5 5 4 4
1 1 3 3

Sample Output

1
1
2
0
1

题解:珍爱生命,远离vector!珍爱生命,远离cfree!

ZZ一上午就跟这道题耗上了,一开始想用线段树维护一堆vector,然后用并查集+BFS来搞,结果就死在了vector的删除操作上啊~,各种奇葩错误信息直接将cfree搞炸了,然后卸载+重启+重装了n次也不好使,于是默默回归gdb。。。

于是最后还是放弃,学了用线段树优化建图+Dijkstra,具体方法:

建立两棵线段树,A树从所有节点向父亲连边,B树从所有节点向儿子连边,从B树的所有叶子向A树的所有叶子连边,边权都是0。

对于每个操作,新建节点c,从A中对应的节点向c连边,从c向B中对应节点连边,边权都是${1\over2}$

然后跑Dijkstra就行了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <utility>
#define mp(A,B) make_pair(A,B)
#define lson (x<<1)
#define rson (x<<1|1)
using namespace std;
const int maxn=500010;
typedef pair<int,int> pii;
int n,m,S,tot,cnt;
int vis[5000000],dis[5000000],pos[maxn];
int to[30000000],next[30000000],val[30000000],head[5000000];
priority_queue<pii> pq;
int rd()
{int ret=0,f=1;   char gc=getchar();while(gc<'0'||gc>'9')  {if(gc=='-')f=-f;  gc=getchar();}while(gc>='0'&&gc<='9')  ret=ret*10+gc-'0',gc=getchar();return ret*f;
}
void add(int a,int b,int c)
{to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
}
struct sag
{void build(int l,int r,int x,int flag){if(l==r){if(!flag)    pos[l]=x;else  add(x+4*n,x,0);return ;}int mid=l+r>>1;build(l,mid,lson,flag),build(mid+1,r,rson,flag);if(flag)   add(x+4*n,lson+4*n,0),add(x+4*n,rson+4*n,0);else    add(lson,x,0),add(rson,x,0);}void updata(int l,int r,int x,int a,int b,int c,int flag){if(a<=l&&r<=b){if(!flag) add(x,c,1);else add(c,x+4*n,1);return ;}int mid=l+r>>1;if(a<=mid)  updata(l,mid,lson,a,b,c,flag);if(b>mid)  updata(mid+1,r,rson,a,b,c,flag);}
}s1,s2;
int main()
{n=rd(),m=rd(),S=rd();int i,a,b,c,d;memset(head,-1,sizeof(head));s1.build(1,n,1,0),s2.build(1,n,1,1);tot=n<<3;for(i=1;i<=m;i++){a=rd(),b=rd(),c=rd(),d=rd();s1.updata(1,n,1,a,b,++tot,0),s2.updata(1,n,1,c,d,tot,1);s1.updata(1,n,1,c,d,++tot,0),s2.updata(1,n,1,a,b,tot,1);}memset(dis,0x3f,sizeof(dis));pq.push(mp(0,pos[S])),dis[pos[S]]=0;int u;while(!pq.empty()){u=pq.top().second,pq.pop();if(vis[u]) continue;vis[u]=1;for(i=head[u];i!=-1;i=next[i])if(dis[to[i]]>dis[u]+val[i])dis[to[i]]=dis[u]+val[i],pq.push(mp(-dis[to[i]],to[i]));}for(i=1;i<=n;i++) printf("%d\n",dis[pos[i]]>>1);return 0;
}

转载于:https://www.cnblogs.com/CQzhangyu/p/7016611.html

【BZOJ3073】[Pa2011]Journeys 线段树+堆优化Dijkstra相关推荐

  1. P6348 [PA2011]Journeys 线段树优化建图 区间连区间

    传送门 文章目录 题意: 思路: 题意: 每次连接[a,b][a,b][a,b]与[c,d][c,d][c,d]之间所有点,让后跑最短路. 思路: 比普通的优化建图能简单点,我们只需要加两个虚点之间边 ...

  2. 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra

    题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...

  3. bzoj 3040: 最短路(road)(堆优化dijkstra)

    3040: 最短路(road) Time Limit: 60 Sec  Memory Limit: 200 MB Submit: 2811  Solved: 933 [Submit][Status][ ...

  4. HDU1535 Invitation Cards(链式前向星+堆优化dijkstra)[C++]

    目录 题目及翻译 题面 输入 输出 输入样例 输出样例 题目思路 注意事项 AC代码 C++ 题目及翻译 题面 In the age of television, not many people at ...

  5. 【bzoj2259】[Oibh]新型计算机 堆优化Dijkstra

    题目描述 Tim正在摆弄着他设计的"计算机",他认为这台计算机原理很独特,因此利用它可以解决许多难题.  但是,有一个难题他却解决不了,是这台计算机的输入问题.新型计算机的输入也很 ...

  6. 重返天梯-L3-028 森森旅游 (30 分) (堆优化dijkstra+multiset)

    题目描述 重返天梯-L3-028 森森旅游 (30 分)原题链接 森森决定从 1 号城市出发,到 n 号城市去.他打算在出发前准备一些现金,并在途中的某个城市将剩余现金 全部 换成旅游金后继续旅游,直 ...

  7. BZOJ 2118 墨墨的等式 堆优化Dijkstra

    题目大意:给定nn个物品,每个物品有一个非负价值,问[L,R][L,R]区间内有多少价值可以被凑出来 好题!!! 如果物品数量可以为负,显然求个gcdgcd就行了 现在物品数量必须非负 任选一个ai& ...

  8. 【bzoj4070】[Apio2015]雅加达的摩天楼 set+堆优化Dijkstra

    题目描述 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 "doge&q ...

  9. BZOJ3073: [Pa2011]Journeys

    题解: 暴力建图当然gg 我们考虑用线段树分块建图的思想 因为涉及到两个区间 对着建图 一个线段树不够 考虑用两个线段树 一个作为出树(出树儿子向父亲连边) 一个作为入树(父亲向儿子连边) 每次出树向 ...

最新文章

  1. Android学习笔记--WIFI的操作
  2. mysql master-slave_mysql 同步 master-slave
  3. 启明云端分享| ESP32-C6是乐鑫首款低功耗、高性价比的 Wi-Fi 6 和蓝牙 5 SoC,一起来看看C6还有哪些重要功能
  4. Uboot启动流程分析
  5. mysql 数据库存储表情
  6. 如何突破瓶颈又释放工作量? 深度剖析《闪耀暖暖》游戏从2D到3D的美术开发过程
  7. 关闭数据执行保护(DEP)
  8. 拉链法导致的链表过深问题为什么不用二叉查找树代替,而选择红黑树?为什么不一直使用红黑树?
  9. Nginx负载均衡+转发策略
  10. HTML和CSS面试问题总结,html和css面试总结
  11. 谈谈JavaScript中的数组、集合及效率
  12. 从XKCD网站下载自动所有漫画图片---python实现
  13. iar编译工程的map怎么看使用flash大小_ESP8266_08基于flash的数据掉电保护
  14. 找零钱问题系列之动态规划
  15. SQL注入常用WAF绕过姿势
  16. qq接收不了文件显示服务器拒绝,QQ提示服务器拒绝了您发送离线文件怎么办
  17. 备份一下mysql笔记
  18. winpe修复计算机无法启动,巧用PE修复系统启动故障
  19. DataGrip连接Mysql报08S01解决方案
  20. 调用sleep后,我做了一个噩梦

热门文章

  1. 关于TableLayoutPanel里放入控件无法将Dock设为Fill的解决办法
  2. C# - list数据填充到Dataset里
  3. c语言编程输入年月日判断是否合法,C语言程序设计:输入年月日判断这是这一年中的第几天...
  4. 做服务器_码迷SEO:细数那些做SEO巨坑的服务器们
  5. 设置默认settings文件_Django 学习笔记系列 之 settings.py 设定
  6. beanutils工具类_16 个超级实用的 Java 工具类!
  7. 地域和地方的区别_商标、品牌、LOGO,三者区别在哪里?
  8. pb打印选择页数_要想打印不卡纸,卡纸原因要了解
  9. python如何对两个矩阵进行拼接_Python合并两个numpy矩阵
  10. servlet的的生命周期和使用