求助 WA on #5: 线段树优化建图
  • 板块CF786B Legacy
  • 楼主AzusaShirasu智能机娘
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/8/24 12:30
  • 上次更新2023/10/27 13:53:56
查看原帖
求助 WA on #5: 线段树优化建图
188950
AzusaShirasu智能机娘楼主2022/8/24 12:30

刚学线段树优化建图,一直在第五个测试点出错:

Wrong Answer.wrong answer 44th numbers differ - expected: '366561691', found: '309478608'

已经开了 long long2020 倍大小的数组了,五次提交均在这个点出错,求各位大佬指点(用 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])<<' ';
}
2022/8/24 12:30
加载中...