HDU 5910Advanced Traffic System

来源:互联网 发布:淘宝卖家贴吧怎么引流 编辑:程序博客网 时间:2024/05/16 07:05

由于边数太多且大多相同我们考虑用点去扩展
类似想法就是把原来的边看做点 原来的点看做一群边 把原来这个点附近的边代表的点相连 把加边操作挂上线段树上 然后类似Dij做一遍 并查集处理做过的点

#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>#include<queue>#include<stack>using namespace std;char c;inline void read(int&a){a=0;do c=getchar();while(c<'0'||c>'9');while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();}struct Chain{    Chain*next;    int no;};struct Node{    int l,r;    Chain*C;}T[400001];struct Side{    int A,B,dx,C,D,dy,w;}Li[60001];void Build(int place,int l,int r){    T[place].l=l,T[place].r=r,T[place].C=NULL;    if(l^r)        Build(place<<1,l,l+r>>1),        Build(place<<1|1,(l+r>>1)+1,r);}void Add(int place,int l,int r,int no){    if(T[place].l>=l&&T[place].r<=r)        {            Chain*tp=new Chain;            tp->next=T[place].C;            tp->no=no;T[place].C=tp;            return;        }    int Mid=T[place<<1].r;    if(l<=Mid)Add(place<<1,l,r,no);    if(r>Mid)Add(place<<1|1,l,r,no);}vector<int>R;bool Vis[100001];void S(int place,int r){    for(Chain*&tp=T[place].C;tp;tp=tp->next)        if(!Vis[tp->no])R.push_back(tp->no);    if(T[place].l==T[place].r)return;    int Mid=T[place<<1].r;    if(r<=Mid)return S(place<<1,r);    return S(place<<1|1,r);}int Dis[90001];int u[301][301];priority_queue<pair<int,int> ,vector<pair<int,int> > ,greater<pair<int,int> > >Q;int f[302][302];inline void Extend(int x,int y,int dis){    if(f[x][y]^y)return;    f[x][y]=y+1;    int n=u[x][y];    Dis[n]=dis;    R.clear();    S(1,n);    for(int i=0;i<R.size();i++)        {            Vis[R[i]]=true;            Q.push(make_pair(dis+Li[R[i]].w,R[i]));        }}int F(int x,int y){return f[x][y]==y?y:f[x][y]=F(x,f[x][y]);}int main(){    int T;    read(T);    while(T--)    {        int n,m,e,sx,sy;        read(n),read(m),read(e),read(sx),read(sy);          memset(Dis,-1,sizeof(Dis));        memset(Vis,0,sizeof(Vis));        Build(1,1,n*m);        for(int i=1;i<=n;i++)        for(int j=1;j<=m+1;j++)f[i][j]=j;        for(int i=1;i<=n;i++)        for(int j=1;j<=m;j++)            read(u[i][j]);        for(int i=1;i<=e;i++)        {            int L,R;            read(L),read(R),read(Li[i].A),read(Li[i].B),read(Li[i].dx),read(Li[i].C),read(Li[i].D),read(Li[i].dy),read(Li[i].w);            Add(1,L,R,i);        }        while(!Q.empty())Q.pop();        Extend(sx,sy,0);        while(!Q.empty())        {            pair<int,int>t=Q.top();Q.pop();            int x=t.second,y=t.first,a=Li[x].A,b=Li[x].B,dx=Li[x].dx,dy=Li[x].dy,c=Li[x].C,d=Li[x].D;            for(int i=a;i<=b;i+=dx)                for(int j=c;;)                {                    j=F(i,j);                    j=((j-c)/dy+((j-c)%dy>0))*dy+c;                    if(j>d)break;                    Extend(i,j,y);                }        }        for(int i=1;i<=n*m;i++)printf("%d%c",Dis[i],i<n*m?' ':'\n');    }    return 0;}
0 0
原创粉丝点击