3073: [Pa2011]Journeys|线段树|BFS

来源:互联网 发布:stl源码剖析 知乎 编辑:程序博客网 时间:2024/05/21 10:52

一种比较暴力的方法就是直接线段树优化建图,跑dijkstra
但是这题的边权都是1可以考虑BFS的方法
首先按照y将所有的边排序,然后按照x的大小插入到线段树中
这样每次询问一个点p下一步能走到哪些点可以直接在线段树中找到x<=p并且y>=p的点
因为已经按照y排序,所以最终线段树中的连边的y是递减的,这样就可以做到线性的BFS

#include<algorithm>#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>#include<vector>#include<cmath>#include<queue>#include<ctime>#include<set>#include<map>#define N 500020#define inf 1e9#define pa pair<int,int>using namespace std;int sc(){    int i=0; char c=getchar();    while(c>'9'||c<'0')c=getchar();    while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();    return i;}struct W{int x,y,l,r,z;}a[N];int dis[N],q[N],fa[N],mark[N];int head[N*10],nxt[N*10],lst[N*10];int n,m,s,l,r,tot;bool cmp(W a,W b){    return a.y<b.y;}void insert(int x,int y){    lst[++tot]=y;nxt[tot]=head[x];head[x]=tot;}int find(int x){    return fa[x]==x?x:fa[x]=find(fa[x]);}void change(int x,int L,int R,int p,int num){    insert(x,num);    if(L==R)return;    int mid=L+R>>1;    if(p<=mid) change(x<<1,L,mid,p,num);    else change(x<<1|1,mid+1,R,p,num);}void cal(int x,int d){    if(a[x].z)return;a[x].z=1;    for(int i=a[x].l;i<=a[x].r;i=find(i))    {        if(!mark[i])        {            mark[i]=1;            q[++r]=i;            dis[i]=d+1;        }        fa[i]=i+1;    }}    void solve(int x,int L,int R,int p){    if(p>=R)    {        for(;a[lst[head[x]]].y>=p;head[x]=nxt[head[x]])            cal(lst[head[x]],dis[p]);        return;    }    int mid=L+R>>1;    solve(x<<1,L,mid,p);    if(p>mid)solve(x<<1|1,mid+1,R,p);}int main(){    n=sc(),m=sc(),q[1]=sc();    for(int i=1;i<=m;i++)    {        ++s;        a[s+1].l=a[s].x=sc();        a[s+1].r=a[s].y=sc();        a[s+1].x=a[s].l=sc();        a[s+1].y=a[s].r=sc();        ++s;    }    sort(a+1,a+s+1,cmp);    for(int i=1;i<=s;i++)        change(1,1,n,a[i].x,i);    mark[q[l=r=1]]=1;    for(int i=1;i<=n;i++)fa[i]=i;    fa[n+1]=n+1;    for(;l<=r;l++)        solve(1,1,n,q[l]);    for(int i=1;i<=n;i++)        printf("%d\n",dis[i]);    return 0;}
0 0
原创粉丝点击