刚学线段树优化建图,一直在第五个测试点出错:
Wrong Answer.wrong answer 44th numbers differ - expected: '366561691', found: '309478608'
已经开了 long long 和 20 倍大小的数组了,五次提交均在这个点出错,求各位大佬指点(用 SPFA 纯属个人喜好)
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=200000+5;
int head[maxn*16],nxt[maxn*16],ver[maxn*16],len[maxn*16],tot;
inline void add(int x,int y,int v){
tot++,ver[tot]=y,len[tot]=v,nxt[tot]=head[x],head[x]=tot;
}
namespace segtree{
int in[maxn*8],out[maxn*8],used;
void build(int root,int l,int r){
if(l==r)return in[root]=out[root]=l,void();
int mid=(l+r)>>1;
build(root*2,l,mid),build(root*2+1,mid+1,r);
out[root]=++used,in[root]=++used;
add(out[root*2],out[root],0),add(out[root*2+1],out[root],0);
add(in[root],in[root*2],0),add(in[root],in[root*2+1],0);
}
void addin(int ql,int qr,int root,int l,int r,int qx,int w){
if(ql<=l&&r<=qr)return add(qx,in[root],w);
int mid=(l+r)>>1;
if(ql<=mid)addin(ql,qr,root*2,l,mid,qx,w);
if(qr>mid)addin(ql,qr,root*2+1,mid+1,r,qx,w);
}
void addout(int ql,int qr,int root,int l,int r,int qx,int w){
if(ql<=l&&r<=qr)return add(out[root],qx,w);
int mid=(l+r)>>1;
if(ql<=mid)addout(ql,qr,root*2,l,mid,qx,w);
if(qr>mid)addout(ql,qr,root*2+1,mid+1,r,qx,w);
}
}
using namespace segtree;
int d[maxn*16];
bool vis[maxn*16];
void spfa(int s){
queue<int> q;
memset(d,0x7f,sizeof(d));
memset(vis,0,sizeof(vis));
d[s]=0,vis[s]=1,q.push(s);
while(!q.empty()){
int x=q.front();q.pop();
vis[x]=0;
for(int i=head[x];i;i=nxt[i]){
int to=ver[i],v=len[i];
if(d[to]>d[x]+v){
d[to]=d[x]+v;
if(!vis[to])vis[to]=1,q.push(to);
}
}
}
}
signed main(){
int n,q,s;cin>>n>>q>>s;used=n,build(1,1,n);
while(q--){
int op,x,y,z,v;
cin>>op>>x>>y>>z;
if(op==1)add(x,y,v);
if(op==2)cin>>v,addin(y,z,1,1,n,x,v);
if(op==3)cin>>v,addout(y,z,1,1,n,x,v);
}
spfa(s);
for(int i=1;i<=n;i++)cout<<(d[i]==0x7f7f7f7f7f7f7f7fll?-1:d[i])<<' ';
}