求调
查看原帖
求调
1023189
wangtairan114楼主2024/5/16 20:13

样例没过,输出0 29 12,求调

#include <bits/stdc++.h>
using namespace std;
#define min(a,b) ((a)>(b)?(b):(a))
#define max(a,b) ((a)<(b)?(b):(a))
#define INF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define sc scanf
#define pr printf
#define v1 first
#define v2 second
#define f(nm1,nm2,nm3) for(int nm1=nm2; nm1<= nm3; nm1++)
#define lowbit(x) (x&(-x))
#define int long long
#define lson k*2,l,mid
#define rson k*2+1,mid+1,r
int n,q,s;
const int sz=1e5+5;
const int len=4e5+5;
vector<pair<int,int>> v[sz*9];
unordered_map<int,int> mp;
void build(int k,int l,int r)
{
    if(l==r)
    {
        mp[l]=k;
        v[k].push_back({k+len,0});
        v[k+len].push_back({k,0});
        return;
    }
    v[k].push_back({k*2,0});
    v[k].push_back({k*2+1,0});
    v[k*2+len].push_back({k+len,0});
    v[k*2+1+len].push_back({k+len,0});
    int mid=(l+r)>>1;
    build(lson);
    build(rson);
}
void add1(int x,int y,int w)
{
    v[mp[x]].push_back({mp[y],w});
}
int nowl,nowr;
void add2(int k,int l,int r,int x,int w)
{
    if(nowl<=l&&r<=nowr)
    {
        v[mp[x]+len].push_back({k,w});
        return;
    }
    int mid=(l+r)>>1;
    if(mid>=nowl)
    {
        add2(lson,x,w);
    }
    if(mid<nowr)
    {
        add2(rson,x,w);
    }
}
void add3(int k,int l,int r,int x,int w)
{
    if(nowl<=l&&r<=nowr)
    {
        v[k+len].push_back({mp[x],w});
        return;
    }
    int mid=(l+r)>>1;
    if(mid>=nowl)
    {
        add3(lson,x,w);
    }
    if(mid<nowr)
    {
        add3(rson,x,w);
    }
}
bool b[sz*9];
int dis[sz*9];
void dijkstra()
{
    memset(dis,INF,sizeof(dis));
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
    b[mp[s]]=1;
    dis[mp[s]]=0;
    q.push({0,mp[s]});
    while(!q.empty())
    {
        int nm=q.top().v2;
        q.pop();
        for(int i=0; i < v[nm].size(); i++)
        {
            int xx=v[nm][i].v1;
            int w=v[nm][i].v2;
            if(!b[xx]&&w+dis[nm]<dis[xx])
            {
                b[xx]=1;
                dis[xx]=w+dis[nm];
                q.push({dis[xx],xx});
            }
        }
    }
}
signed main()
{
    sc("%lld%lld%lld",&n,&q,&s);
    build(1,1,n);
    while(q--)
    {
        int op;
        sc("%lld",&op);
        if(op==1)
        {
            int x,y,w;
            sc("%lld%lld%lld",&x,&y,&w);
            add1(x,y,w);
        }
        else if(op==2)
        {
            int x,w;
            sc("%lld%lld%lld%lld",&x,&nowl,&nowr,&w);
            add2(1,1,n,x,w);
        }
        else
        {
            int x,w;
            sc("%lld%lld%lld%lld",&x,&nowl,&nowr,&w);
            add3(1,1,n,x,w);
        }
    }
    dijkstra();
    for(int i=1; i <= n; i++)
    {
        int res=min(dis[mp[i]+len],dis[mp[i]]);
        pr("%lld ",(res==INF)?(-1ll):res);
    }
    return 0;
}
2024/5/16 20:13
加载中...