求求大佬帮助菜鸡QAQ
查看原帖
求求大佬帮助菜鸡QAQ
85346
2017haha23333楼主2020/12/8 00:47

卑微30分,在线求助

#include<cstdio>
#include<cmath>
using namespace std;
int head[100010],nxt[200010],to[200010],top=0;
int dui[500010],num=0,bj[100010]={0},chu[100010];
int p[100010],q[100010];
void add(int x,int y){
	top++;
	to[top]=y;
	nxt[top]=head[x];
	head[x]=top;
}
void up(int i){
	if(i==1)	return;
	if(bj[dui[i/2]]>bj[dui[i]]){
		dui[i]+=dui[i/2];
		dui[i/2]=dui[i]-dui[i/2];
		dui[i]=dui[i]-dui[i/2];
		up(i/2);
	}
}
void down(int i){
	if(i*2>num)	return;
	int j=i*2;
	if(j<num && bj[dui[j]]>bj[dui[j+1]])	j++;
	if(bj[dui[i]]>bj[dui[j]]){
		dui[i]+=dui[j];
		dui[j]=dui[i]-dui[j];
		dui[i]=dui[i]-dui[j];
		down(j);
	}
}
int gcd(int x,int y){
	if(y==0)  return x;
	return gcd(y,x%y);
}
int main(){
	int k,n,m,a,x,y;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&k);
		chu[i]=k;
		while(k){
			scanf("%d",&a);
			add(i,a);
			bj[a]++;
			k--;
		}
	}
	//printf("\n      %d\n",to[nxt[1]]);
	for(int i=1;i<=n;i++){
		num++;
		dui[i]=i;
		up(i);
		q[i]=1;
		if(bj[i]==0)	p[i]=1;
		else			p[i]=0;
	}
	for(int i=1;i<=n;i++)
	//printf("%d\n",bj[i]);
	while(num!=0){
	//	printf("\n\n%d %d\n",dui[1],bj[dui[1]]);
		while(bj[dui[1]]==-1 && num>0){
			dui[1]=dui[num];
			num--;
			down(1);
		}
		if(num==0) break;
		x=dui[1];bj[x]--;
		dui[1]=dui[num];num--;down(1);
		if(chu[x]==0)	continue;
		
	
		q[x]=q[x]*chu[x];
		k=gcd(p[x],q[x]);
		p[x]=p[x]/k;
		q[x]=q[x]/k;
		for(int i=head[x];i;i=nxt[i]){
			//printf("%d ",to[i]);
			k=gcd(q[x],q[to[i]]);
			//printf("%d %d %d %d",p[x],q[x],p[to[i]],q[to[i]]);
			p[to[i]]=q[x]/k*p[to[i]]+q[to[i]]/k*p[x];
			q[to[i]]=q[to[i]]/k*q[x];
			
			k=gcd(p[to[i]],q[to[i]]);
			p[to[i]]=p[to[i]]/k;
			q[to[i]]=q[to[i]]/k;
			
			//printf(" %d %d\n",p[to[i]],q[to[i]]);
			bj[to[i]]--;
			num++;dui[num]=to[i];up(num);
		}
		
		
	//for(int i=1;i<=n;i++)
	//printf("%d ",bj[i]);
	}
	for(int i=1;i<=n;i++)
		if(chu[i]==0)	
		printf("%d %d\n",p[i],q[i]);
}

2020/12/8 00:47
加载中...