线段树优化建图裸题。建两棵线段树,一棵表示入一棵表示出。对题中所给的边新建一个虚拟点,将两段区间拆成线段树上对应区间,出线段树中对应区间所表示的点向虚拟点连边权0的边,虚拟点向入线段树中对应区间所表示的点连边权1的边;线段树上的点之间连边权0的边(表示入的由父亲连向儿子,表示出的由儿子连向父亲),表示相同点的叶子节点(由入连向出)之间连边权0的边。01bfs即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define ll long long
#define N 500010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,S,id[][N],root[],v[][],p[N*],d[N*],t,cnt;
struct data{int to,nxt,len;
}edge[N<<];
struct data2{int l,r;
}tree[][N<<];
deque<int> q;
void addedge(int x,int y,int z){t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].len=z,p[x]=t;}
void build(int &k,int l,int r,int p)
{
k=++cnt;
if (l==r) {id[p][l]=k;return;}
int mid=l+r>>;
build(tree[p][k].l,l,mid,p);
build(tree[p][k].r,mid+,r,p);
if (p==) addedge(tree[p][k].l,k,),addedge(tree[p][k].r,k,);
else addedge(k,tree[p][k].l,),addedge(k,tree[p][k].r,);
}
void find(int &k,int l,int r,int x,int y,int p)
{
if (l==x&&r==y) {v[p][++v[p][]]=k;return;}
int mid=l+r>>;
if (y<=mid) find(tree[p][k].l,l,mid,x,y,p);
else if (x>mid) find(tree[p][k].r,mid+,r,x,y,p);
else find(tree[p][k].l,l,mid,x,mid,p),find(tree[p][k].r,mid+,r,mid+,y,p);
}
void bfs(int S)
{
d[S]=;q.push_back(S);
while (!q.empty())
{
int x=q.front();q.pop_front();
for (int i=p[x];i;i=edge[i].nxt)
if (d[x]+edge[i].len<d[edge[i].to])
{
d[edge[i].to]=d[x]+edge[i].len;
if (edge[i].len) q.push_back(edge[i].to);
else q.push_front(edge[i].to);
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj3073.in","r",stdin);
freopen("bzoj3073.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read(),S=read();
build(root[],,n,);
build(root[],,n,);
for (int i=;i<=m;i++)
{
int a=read(),b=read(),c=read(),d=read();
v[][]=v[][]=;cnt++;
find(root[],,n,a,b,);
for (int x=;x<=v[][];x++) addedge(v[][x],cnt,);
find(root[],,n,c,d,);
for (int x=;x<=v[][];x++) addedge(cnt,v[][x],);
v[][]=v[][]=;cnt++;
find(root[],,n,c,d,);
for (int x=;x<=v[][];x++) addedge(v[][x],cnt,);
find(root[],,n,a,b,);
for (int x=;x<=v[][];x++) addedge(cnt,v[][x],);
}
for (int i=;i<=n;i++) addedge(id[][i],id[][i],);
memset(d,,sizeof(d));bfs(id[][S]);
for (int i=;i<=n;i++) printf("%d\n",d[id[][i]]);
return ;
}

最新文章

  1. 一种简单,轻量,灵活的C#对象转Json对象的方案(续)
  2. iOS引入JavaScriptCore引擎框架(一)
  3. MVC ,Action方法传数据给视图有几种方式?--PS:tempData和Viewbag,还有ViewData之间的区别
  4. C++Primer 第十一章
  5. Matlab 的reshape函数(转)
  6. CSS之可折叠导航
  7. String及其他
  8. FastJSON应用前测试--转载
  9. JS设置Cookie,及COOKIE的限制
  10. Matlab与外部接口:MAT文件基础
  11. [ACM] hdu 4418 Time travel (高斯消元求期望)
  12. php脚本生成google play url的下载链接,下载apk并自动反编译后获取android版本号
  13. 自定义按钮~自适应布局~常见bug
  14. 解决yum命令时出现Error: xz compression not available
  15. crash部分命令用法
  16. maven入门(1-1)maven是什么?
  17. pymysql连接数据库报错:&#39;NoneType&#39; object has no attribute &#39;encoding&#39;
  18. Thinkphp5.0 多图上传名称重复BUG
  19. oracle之 any、some、all 解析
  20. 【洛谷 P1616 疯狂的采药】

热门文章

  1. dedecms左侧导航栏不显示问题
  2. C# 用HttpWebRequest模拟一个虚假的IP伪造ip
  3. ThinkPHP框架目录的介绍
  4. MySQL学习路线图
  5. Python系列8之socket
  6. DedeCMS V5.7sp2最新版本parse_str函数SQL注入漏洞
  7. 332. Reconstruct Itinerary
  8. IDEA中SVN的使用
  9. 第6模块 web框架口述题
  10. 2007: [Noi2010]海拔