MnZn 玄关求调主席树
查看原帖
MnZn 玄关求调主席树
761125
Milthm楼主2024/8/31 14:04

第四个点 WA 了,最短路长度不对,不知道为什么

#include<bits/stdc++.h>
#define N 200005
#define int long long
#define pi pair<int,int>
const int mod=1e9+7,base=2;
using namespace std;
int n,m,s,t,h[N],num,b[N],idx,dis[N],vis[N],ans[N],top,pre[N];
struct edge{
	int u,v,w,nxt;
}e[N*2];
void add(int u,int v,int w){
	e[++num]={u,v,w,h[u]};h[u]=num;
}
int a[N*40],lc[N*40],rc[N*40],c[N*40];
void pushup(int x,int l,int r,int mid){
	a[x]=(a[lc[x]]+a[rc[x]]*b[mid-l+1])%mod;
	c[x]=c[lc[x]]&c[rc[x]];
}
int build(int l,int r,int v){
	int x=++idx;
	if(l==r){
		a[x]=v;c[x]=(v==1);return x;
	}
	int mid=(l+r)>>1;
	lc[x]=build(l,mid,v);
	rc[x]=build(mid+1,r,v);
	pushup(x,l,r,mid);
	return x;
}
void update0(int x,int &y,int l,int r,int ql,int qr){
 	if(ql<=l&&r<=qr){
		y=0;return;
	}
	if(!y)y=++idx; 
	a[y]=a[x];c[y]=c[x];lc[y]=lc[x];rc[y]=rc[x];
	int mid=(l+r)>>1;
	if(ql<=mid)update0(lc[x],lc[y],l,mid,ql,qr);
	if(qr>mid)update0(rc[x],rc[y],mid+1,r,ql,qr);
	pushup(y,l,r,mid);
}
void update1(int x,int &y,int l,int r,int k){
	y=++idx;
	if(l==r){
		a[y]=c[y]=1;return;
	}
	a[y]=a[x];c[y]=c[x];lc[y]=lc[x];rc[y]=rc[x];
	int mid=(l+r)>>1;
	if(k<=mid)update1(lc[x],lc[y],l,mid,k);
	else update1(rc[x],rc[y],mid+1,r,k);
	pushup(y,l,r,mid);
}
int Find(int x,int l,int r,int ql,int qr){
	if(ql>r||qr<l||c[x])return -1;
	if(!a[x])return max(l,ql);
	int mid=(l+r)>>1,ans=Find(lc[x],l,mid,ql,qr);
	if(ans==-1)ans=Find(rc[x],mid+1,r,ql,qr);
	return ans;
}
bool cmp(int x,int y,int l,int r){
	if(l==r)return a[x]<a[y];
	int mid=(l+r)>>1;
	if(rc[x]==rc[y])return cmp(lc[x],lc[y],l,mid);
	else return cmp(rc[x],rc[y],mid+1,r);
}
int add(int x,int w){
	int tmp=0,rr=Find(x,1,N-5,w,N-5);
	update1(x,tmp,1,N-5,rr);
	if(rr>w)update0(tmp,tmp,1,N-5,w,rr-1);
	return tmp;
}
bool operator<(pi a,pi b){
	return cmp(a.first,b.first,1,N-5);
}
priority_queue<pi,vector<pi>,greater<pi> >q;
void dijkstra(){
	int tmp=build(1,N-5,1);
	for(int i=1;i<=n;++i)dis[i]=tmp;
	dis[s]=build(1,N-5,0);q.push({dis[s],s});
	while(!q.empty()){
		pi c=q.top();q.pop();
		int u=c.second;
		if(vis[u])continue;
		vis[u]=1;
		for(int i=h[u];i;i=e[i].nxt){
			int v=e[i].v,tmp=add(dis[u],e[i].w);
			if(cmp(tmp,dis[v],1,N-5)){
				dis[v]=tmp;pre[v]=u;
				if(!vis[v])q.push({dis[v],v});
			}
		}
	}
}
void dfs(int u){
	if(u!=s)dfs(pre[u]);
	ans[++top]=u;
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	b[0]=1;
	for(int i=1;i<N;++i)b[i]=b[i-1]*base%mod;
	cin>>n>>m;
	for(int i=1;i<=m;++i){
		int u,v,w;cin>>u>>v>>w;++w;
		add(u,v,w);add(v,u,w);
	}
	cin>>s>>t;
	dijkstra();
	if(!vis[t])return cout<<-1,0;
	cout<<a[dis[t]]<<'\n';
	dfs(t);
	cout<<top<<'\n';
	for(int i=1;i<=top;++i)cout<<ans[i]<<" ";
	return 0;
}
2024/8/31 14:04
加载中...