kruscal重构树求助
查看原帖
kruscal重构树求助
100690
lyhqwq楼主2023/1/16 18:57

WA 30pts

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=400005;
const int M=800005;
struct edge{
	int v;
	int nxt;
	int w;
}edge[M];
int head[N],cnt;
int val[N];//重构树点权
struct T{
	int u,v,h;
	bool operator <(const T &rhs)const{
		return h>rhs.h;
	}
}e[M];
int T;
int n,m,q,k,s,tot;
int dis[N],vis[N];
int fa[N];
int f[N][20];
void init(){
	cnt=0;
	memset(head,0,sizeof(head));
}
void addedge(int u,int v,int w){
	edge[++cnt].v=v,edge[cnt].w=w,edge[cnt].nxt=head[u],head[u]=cnt;
}
void dijkstra(){
	memset(vis,0,sizeof(vis));
	memset(dis,0x7f,sizeof(dis));
	priority_queue<pair<int,int> > q;
	q.push(make_pair(1,0));
	dis[1]=0;
	while(!q.empty()){
		int u=q.top().first;
		q.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(int i=head[u];i;i=edge[i].nxt){
			int v=edge[i].v;
			if(dis[v]>dis[u]+edge[i].w){
				dis[v]=dis[u]+edge[i].w;
				if(!vis[v]) q.push(make_pair(v,dis[v]));
			}
		}
	}
}
int find(int x){
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
void kruscal(){
	sort(e+1,e+1+m);
	tot=n;
	for(int i=1;i<=2*n;i++) fa[i]=i;
	for(int i=1;i<=m;i++){
		int fu=find(e[i].u),fv=find(e[i].v);
		if(fu!=fv){
			fa[fu]=fa[fv]=++tot;
			val[tot]=e[i].h;
			dis[tot]=min(dis[fu],dis[fv]);
			f[fu][0]=f[fv][0]=tot;
		}
	}
	for(int j=1;(1<<j)<=tot;j++){
		for(int i=1;i<=tot;i++){
			f[i][j]=f[f[i][j-1]][j-1];
		}
	}
}
signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	scanf("%lld",&T);
	while(T--){
		init();
		scanf("%lld%lld",&n,&m);
		for(int i=1;i<=m;i++){
			int u,v,l,a;
			scanf("%lld%lld%lld%lld",&u,&v,&l,&a);
			addedge(u,v,l);
			addedge(v,u,l);
			e[i].u=u,e[i].v=v,e[i].h=a;
		}
		dijkstra();
		kruscal();
		scanf("%lld%lld%lld",&q,&k,&s);
		int lastans=0;
		while(q--){
			int v,p;
			scanf("%lld%lld",&v,&p);
			v=(v+k*lastans-1)%n+1;
			p=(p+k*lastans)%(s+1);
			for(int i=19;i>=0;i--){
				if(f[v][i]&&val[f[v][i]]>p) v=f[v][i];
			}
			lastans=dis[v];
			printf("ans:%lld\n",dis[v]);
		}
	}
	return 0;
}
2023/1/16 18:57
加载中...