社区讨论

60分求调

P7113[NOIP2020] 排水系统参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lp0jjjrx
此快照首次捕获于
2023/11/16 09:57
2 年前
此快照最后确认于
2023/11/16 13:44
2 年前
查看原帖

如题:

CPP
#include<bits/stdc++.h>
#define int unsigned long long
#define re register int
using namespace std;
const int N=1e5+5;
int n,m,ru[N];
int mu[N],zi[N];//分母,分子
vector<int>g[N];
inline void zhi(int x,int y){
	int minn=__gcd(zi[x],mu[x]);
	zi[x]/=minn,mu[x]/=minn;
	minn=__gcd(zi[y],mu[y]);
	zi[y]/=minn,mu[y]/=minn;
}
inline void jia(int x,int y){
	zhi(x,y);
	zi[y]=zi[x]*mu[y]+zi[y]*mu[x];
	mu[y]=mu[y]*mu[x];
	zhi(x,y);
}
inline void topo(){
	stack<int>s;
	for(re i=1;i<=n;i++){
		if(ru[i]==0)s.push(i);
	}
	while(!s.empty()){
		int u=s.top();
		s.pop();
		int ss=g[u].size();
		if(ss)mu[u]=mu[u]*ss;
		for(auto v:g[u]){
			ru[v]--;
			jia(u,v);
			if(ru[v]==0)s.push(v);
		}
		if(ss)zi[u]=0;
	}
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(re i=1;i<=n;i++){
		mu[i]=1;
		int d,a;
		scanf("%lld",&d);
		for(re j=1;j<=d;j++){
			scanf("%lld",&a);
			g[i].push_back(a);
			ru[a]++;
		}
	}
	for(re i=1;i<=m;i++)zi[i]=1;
	topo();
	for(re i=1;i<=n;i++){
		if(zi[i]!=0){
			int minn=__gcd(zi[i],mu[i]);
			printf("%lld %lld\n",(zi[i]/minn),(mu[i]/minn));
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...