求助样例AC,提交全部TLE
查看原帖
求助样例AC,提交全部TLE
285617
黑影洞人楼主2022/8/27 23:33
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 114514
using namespace std;
int head[N],to[N],nxt[N],tot,w[N],e[N],T,n,cnt,mx;
int dfn[N],st[N],top,low[N],co[N],col;
void csh(){
	tot=cnt=top=col=0;
	memset(head,0,sizeof(head));
	memset(dfn,0,sizeof(dfn));
	memset(low,0,sizeof(low));
	memset(co,0,sizeof(co));
}
int add(int u,int v){
	to[++tot]=v;
	nxt[tot]=head[u];
	head[u]=tot;
}
void tarjan(int x){
	st[++top]=x;
	dfn[x]=low[x]=++cnt;
	for(int i=head[x];i;i=nxt[i]){
		int y=to[i];
		if(!dfn[y])tarjan(y),low[x]=min(low[x],low[y]);
		else if(!co[y])low[x]=min(low[x],dfn[y]);
	}
	if(low[x]==dfn[x]){
		co[x]=++col;
		while(st[top]!=x)co[st[top--]]=col;
		top--;
	}
}
signed main(){
	scanf("%d",&T);
	while(T--){
		csh();
		scanf("%d",&n);
		mx=0;
		for(int i=1;i<=n;i++)scanf("%d",&w[i]),mx=max(mx,w[i]);
		for(int i=1;i<=n;i++)scanf("%d",&e[i]),mx=max(mx,w[i]);
		for(int i=1;i<=mx;i++)for(int j=2*i;j<=mx;j+=i)add(i,j);
		for(int i=1;i<=n;i++)add(w[i],e[i]);
		for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
		int ans=0;
		for(int i=1;i<=n;i++)ans+=co[w[i]]==co[e[i]];
		printf("%d\n",ans);
	} 
	return 0;
}


2022/8/27 23:33
加载中...