求助unk?
  • 板块CF786B Legacy
  • 楼主Hayzeros
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/11/19 16:20
  • 上次更新2023/10/27 02:22:07
查看原帖
求助unk?
130819
Hayzeros楼主2022/11/19 16:20
#include<cstdio>
#include<queue>
#include<cstring>
#define ll long long
#define mll 0x7f7f7f7f7f7f7f7f
using namespace std;
const int N=1e5+5,D=5e5;
struct node
{
    int v,w,next;
}e[60*N];
priority_queue<pair<ll,int> >que;
int head[N*20],cnt,c,a[N];
ll dis[N*20];
bool f[N*20];
void add(int x,int y,int w)
{
    e[++cnt].v=y; e[cnt].w=w;
    e[cnt].next=head[x]; head[x]=cnt;
}
void build(int k,int l,int r)
{
    if (l==r) {a[l]=k;return;}
    int mid=l+r>>1;
    add(k<<1,k,0); add(k<<1|1,k,0);
    add(k+D,(k<<1|1)+D,0); add(k+D,(k<<1)+D,0);
    build(k<<1,l,mid);
    build(k<<1|1,mid+1,r);
}
void change(int k,int l,int r,int x,int y,int u,int w)
{
    if (l>y||r<x) return;
    if (x<=l&&r<=y) {if (c==2)add(u,k+D,w);else add(k,u+D,w); return;}
    int mid=l+r>>1;
    change(k<<1,l,mid,x,y,u,w);
    change(k<<1|1,mid+1,r,x,y,u,w);
}
void dij(int u)
{
    memset(dis,0x7f,sizeof(dis));
    dis[u]=0; que.push(make_pair(0,u));
    while (que.size())
    {
        int u=que.top().second; que.pop();
        if (f[u]) continue;
        f[u]=1;
        for (int i=head[u];i;i=e[i].next)
        {
            int v=e[i].v,w=e[i].w;
            if (dis[u]+w<dis[v]) dis[v]=dis[u]+w,que.push(make_pair(-dis[v],v));
        }
    }
}
int main()
{
    int n,q,s;
    scanf("%d%d%d",&n,&q,&s);
    build(1,1,n);
    for (int i=1; i<=n; i++) add(a[i],a[i]+D,0),add(a[i]+D,a[i],0);
    while (q--)
    {
        int u,l,r,w;
        scanf("%d",&c);
        if (c==1) scanf("%d%d%d",&u,&l,&w),add(a[u],a[l]+D,w);
        else
        {
            scanf("%d%d%d%d",&u,&l,&r,&w);
            change(1,1,n,l,r,a[u],w);
        }
    }
    dij(a[s]);
    for (int i=1; i<=n; i++) if (dis[a[i]+D]!=mll) printf("%lld ",dis[a[i]+D]);else printf("-1 ");
    return 0;
}

2022/11/19 16:20
加载中...