【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;
}

最新文章

  1. Union-Find 检测无向图有无环路算法
  2. [bootstrap]bootstrap2如何引导div垂直居中
  3. SVG Drawing Animation - SVG 绘制动画
  4. HDInsight - 1,简介
  5. &lt;jsp:include&gt;和&lt;%@include file=&quot;&quot;%&gt;区别【131031】
  6. nginx rewrite 指令last break区别最详细的解释
  7. 【kAriOJ】离散数学春季学期编程测试 1
  8. Mongo中更新总结
  9. 前端开发 Grunt 之 Connect
  10. Apache CXF实现Web Service(2)——不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service
  11. 【Todo】CSDN的《问底》系列-学习
  12. C# 目录与文件管理
  13. flume日志采集
  14. Js根据class名替换html标签内容 ,在某标签前后添加内容
  15. Android几行代码实现实时监听微信聊天
  16. 【DevOps敏捷开发动手实验】开源文档 v2015.2 stable 版发布
  17. [HDU5969] 最大的位或
  18. (转)RBAC权限模型——项目实战
  19. 解决tomcat同时部署两个SpringBoot应用提示InstanceAlreadyExistsException
  20. canvas-8clip.html

热门文章

  1. Apache 配置:是否显示文件列表
  2. lodash 判断相等 eq isEqual
  3. SVN学习(二)——SVN 提交、更新、解决冲突等操作步骤
  4. Hibernate单向“一对一”关联
  5. xcode7.1.1不能真机调试ios9.2系统设备的解决方法
  6. 217. Contains Duplicate【easy】
  7. Unable to use slave&#39;s temporary directory /tmp - Can&#39;t create/write to file &#39;/tmp/SQL_LOAD-&#39; (Errcode: 17)
  8. codeblocks如何watch数组
  9. vue 声明响应式属性
  10. 配置LANMP环境(4)-- 安装MYSQL与安装相关软件,配置