kruscal重构树 30pts 后面的测试点全WA了
查看原帖
kruscal重构树 30pts 后面的测试点全WA了
509435
liubw_楼主2023/6/23 19:29

或许和这位错误相似,但蒟蒻甚至没有看明白他的错法(悲)

下面是我的30分代码


#include<bits/stdc++.h>
#define ll long long
using namespace std;

template <class T>void read(T &x){
	x=0;
	char c=getchar(),d='0';
	while(c<'0'||c>'9') d=c,c=getchar();
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
	if(d=='-') x=-x;
}
template <class T>void wt(T x){
	if(x/10) wt(x/10);
	putchar(x%10+'0');
}
template <class T>void enter(T x){
	if(x<0) x=-x,putchar('-');
	wt(x),putchar('\n');
}
template <class T>void space(T x){
	if(x<0) x=-x,putchar('-');
	wt(x),putchar(' ');
}

const int N=2e5+10,M=4e5+10;

int T,n,m;

struct edge_star1{
	int head[N],nex[M<<1],val[M<<1],to[M<<1],tot=0;
	void add(int u,int v,int w){
		nex[++tot]=head[u];
		head[u]=tot;
		to[tot]=v;
		val[tot]=w;
	}
	void clear(){
		for(int i=1;i<=n;i++) head[i]=0;
		while(tot){
			nex[tot]=to[tot]=val[tot]=0;
			tot--;
		}
	}
}e1;	// e1_val => distance
int dis[N];
bool vis[N];
struct heap{
	int a,b;
	bool operator < (const heap p) const{
		return b>p.b;
	}
};
void dij(){
	memset(dis,0x7f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	priority_queue<heap> q;
	dis[1]=0;
	q.push((heap){1,dis[1]});
	while(!q.empty()){
		heap x=q.top();
		int u=x.a;	// wow!
		q.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(int t=e1.head[u];t;t=e1.nex[t]){
			int v=e1.to[t];
			if(vis[v]) continue;
			if(dis[v]>dis[u]+e1.val[t]){
				dis[v]=dis[u]+e1.val[t];
				q.push((heap){v,dis[v]});
			}
		}
	}
//	for(int i=1;i<=n;i++) printf(" dis[%d]=%d\n",i,dis[i]);
}

struct Tree{
	int head[N<<1],nex[N<<2],to[N<<2],tot=0,val[N<<1];
	int t_dis[N<<1],f[N<<1][20],dep[N<<1];
	void add(int u,int v){
		nex[++tot]=head[u];
		head[u]=tot;
		to[tot]=v;
	}
	void clear(){
		for(int i=1;i<=n*2;i++) head[i]=0,val[i]=0;
		while(tot){
			nex[tot]=to[tot]=0;
			tot--;
		}
		for(int i=1;i<=n*2;i++){
			dep[i]=0;
			t_dis[i]=0;	// ?
			for(int j=0;j<=19;j++) f[i][j]=0; //...
		}
	}
	void dfs(int pos,int fa){
		dep[pos]=dep[fa]+1;
		f[pos][0]=fa;
		for(int i=1;i<=19;i++){
			f[pos][i]=f[f[pos][i-1]][i-1];
		}
		if(pos<=n) t_dis[pos]=dis[pos];
		else t_dis[pos]=0x7f;
		for(int t=head[pos];t;t=nex[t]) dfs(to[t],pos),t_dis[pos]=min(t_dis[pos],t_dis[to[t]]);
//		printf(" dfs: pos=%d,dis_min=%d\n",pos,t_dis[pos]);
//		printf("	son:");
//		for(int t=head[pos];t;t=nex[t]) printf(" %d",to[t]);
//		putchar('\n');
	}
	int qry(int x,int p){
	//	printf("	qry:x=%d,p=%d,dep[x]=%d,find=",x,p,dep[x]);
		for(int i=19;i>=0;i--){
			if(dep[x]>(1<<i)&&val[f[x][i]]>p) x=f[x][i];
		}
	//	printf("%d\n",x);
		return t_dis[x];
	}
}et;	// reconfigurated tree
struct edge{
	int u,v,dis,alt;	//altitude
	void input(){
		read(u),read(v),read(dis),read(alt);
		e1.add(u,v,dis);
		e1.add(v,u,dis);
	}
	bool operator < (const edge b) const{
		return alt>b.alt;
	}
	void print(){
		printf("e[M]: u=%d,v=%d,dis=%d,alt=%d\n",u,v,dis,alt);
	}
	void clear(){
		u=v=dis=alt=0;
	}
}e[M];
struct UF{	// union find
	int fa[N<<1];
	void init(){
		for(int i=1;i<=n*2;i++) fa[i]=i;
	}
	int find(int x){
		if(x==fa[x]) return x;
		fa[x]=find(fa[x]);
		return fa[x];
	}
	void merge(int x,int y){	// x-->y (siz[x]<=siz[y])
		x=find(x),y=find(y);
		fa[x]=y;
	}
}uf;

void reconfigurate(){
	sort(e+1,e+1+m);
//	for(int i=1;i<=m;i++) e[i].print();	
	int new_p=n+1;
	uf.init();
	for(int i=1;i<=m;i++){
		int x=uf.find(e[i].u),y=uf.find(e[i].v);
		if(x==y) continue;
		uf.merge(x,new_p);
		uf.merge(y,new_p);
		et.add(new_p,x);
		et.add(new_p,y);
		et.val[new_p]=e[i].alt;
		new_p++;
		if(new_p==n<<1) break;
	}
//	printf(" come to dfs\n");
	et.dfs(n*2-1,0);	// ?
}

int main(){
//	freopen("return.in","r",stdin);
//	freopen("return.out","w",stdout);
	read(T);
	while(T--){
		read(n),read(m);
		int u,v,l,a;
		for(int i=1;i<=m;i++) e[i].input();
		dij();
		reconfigurate();
		int q,k,s,ls=0,v0,p0;
		read(q),read(k),read(s);
		while(q--){
			read(v0),read(p0);
			v0=(v0+k*ls-1)%n+1;
			p0=(p0+k*ls)%(s+1);
			ls=et.qry(v0,p0);
			enter(ls);
		}
		for(int i=1;i<=m;i++) e[i].clear();
		e1.clear();
		et.clear();
	//	printf("done\n");
	}
	return 0;
}
/*
2
4 3
1 2 50 1
2 3 100 2
3 4 50 1
5 0 2
3 0
2 1
4 1
3 1
3 2

5 5
1 2 1 2
2 3 1 2
4 3 1 2
5 3 1 2
1 5 2 1
4 1 3
5 1
5 2
2 0
4 0
*/
2023/6/23 19:29
加载中...