真不知道哪错了/fn
#include<bits/stdc++.h>
#include<queue>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
const ll MAXN=3e5+5;
int n,q,s,op,x,y;
ll z;
int _l,_r;
vector<pair<int,ll> > E[MAXN];
void add_edge(int From,int To,ll Len){
E[From].push_back(make_pair(To,Len));
return;
}
ll pos[MAXN*8];
struct node{
int id;
ll now_dis;
bool operator < (const node &oth)const{
return now_dis<oth.now_dis;
}
}t;
int l[MAXN*8],r[MAXN*8],lson[MAXN*8],rson[MAXN*8],cnt,rt_in,rt_out;
ll dis[MAXN*8];
bool vis[MAXN*8];
void build_in(int &id,int L,int R){
id=++cnt;
l[id]=L,r[id]=R;
if(L==R){
pos[L]=id;
return;
}
int mid=(L+R)>>1;
build_in(lson[id],L,mid);
build_in(rson[id],mid+1,R);
add_edge(id,lson[id],0);
add_edge(id,rson[id],0);
return;
}
void build_out(int &id,int L,int R){
if(L==R){
id=pos[L];
return;
}
id=++cnt;
l[id]=L,r[id]=R;
int mid=(L+R)>>1;
build_out(lson[id],L,mid);
build_out(rson[id],mid+1,R);
add_edge(lson[id],id,0);
add_edge(rson[id],id,0);
return;
}
void add_in(int id,int L,int R,int UL,int UR,int pos,ll delta){
if(L>R||UR<L||R<UL)return;
if(UL<=L&&R<=UR){
add_edge(pos,id,delta);
return;
}
int mid=(L+R)>>1;
if(UL<=mid)add_in(lson[id],L,mid,UL,UR,pos,delta);
if(UR>mid)add_in(rson[id],mid+1,R,UL,UR,pos,delta);
return;
}
void add_out(int id,int L,int R,int UL,int UR,int pos,ll delta){
if(L>R||UR<L||R<UL)return;
if(UL<=L&&R<=UR){
add_edge(id,pos,delta);
return;
}
int mid=(L+R)>>1;
if(UL<=mid)add_out(lson[id],L,mid,UL,UR,pos,delta);
if(UR>mid)add_out(rson[id],mid+1,R,UL,UR,pos,delta);
return;
}
void dijkstra(int st){
priority_queue<node> pq;
for(int i=1;i<=(n<<3);i++)dis[i]=1e18;
dis[st]=0;
pq.push((node){st,0});
while(pq.size()){
t=pq.top();
pq.pop();
if(t.now_dis>dis[t.id])continue;
for(pair<int,ll> x:E[t.id]){
if(dis[x.first]>dis[t.id]+x.second){
dis[x.first]=dis[t.id]+x.second;
pq.push((node){x.first,dis[x.first]});
// vis[e[i].v]=1;
}
}
}
}
inline ll read(){
ll x = 0, y = 1, c = getchar();
while (c>'9' || c<'0') { if (c == '-')y = -1; c = getchar(); }
while (c >= '0'&&c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
return x * y;
}
int main(){
n=read(),q=read(),s=read();
build_in(rt_in,1,n);
build_out(rt_out,1,n);
for(int i=1;i<=q;i++){
op=read();
if(op==1){
x=read(),y=read(),z=read();
add_edge(pos[x],pos[y],z);
}
else if(op==2){
x=read(),_l=read(),_r=read(),z=read();
add_in(rt_in,1,n,_l,_r,pos[x],z);
}
else{
x=read(),_l=read(),_r=read(),z=read();
add_out(rt_out,1,n,_l,_r,pos[x],z);
}
}
dijkstra(pos[s]);
for(int i=1;i<=n;i++){
if(dis[pos[i]]!=1e18)printf("%lld ",dis[pos[i]]);
else printf("-1 ");
}
return 0;
}
跑的巨慢