社区讨论

50分求条

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@m340cut4
此快照首次捕获于
2024/11/05 13:27
去年
此快照最后确认于
2025/11/04 15:18
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int unsigned long long

using namespace std;

int n,m;
int cnt[100010];
bool vis[100010];
struct pos{
	int up,down;
}a[100010];
vector<int>G[100010],c_G[100010];
queue<int>q;

int gcd(int x,int y){
	return (x%y==0)?y:gcd(y,x%y);
}
void bfs(){
	int k,len,gcdx;
	bool flag;
	pos ax,bx;
	while(!q.empty()){
		k=q.front();
		q.pop();
		flag=1,len=G[k].size(),ax={a[k].up,a[k].down*len};
		gcdx=gcd(ax.up,ax.down);
		ax={ax.up/gcdx,ax.down/gcdx};
		for(int i:G[k]){
			bx=a[i];
			if(bx.up!=0 && bx.down!=0){
				int up=bx.up*ax.down+ax.up*bx.down,down=bx.down*ax.down;
				gcdx=gcd(up,down);
				a[i]={up/gcdx,down/gcdx};
			}
			else a[i]=ax;
			for(int j:c_G[i]) if(!vis[j]) flag=0;
			if(flag && G[i].size() && !vis[i]){
				q.push(i);
				vis[i]=1;
			}
		}
	}
}

signed main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		a[i]={1,1},vis[i]=1;
		q.push(i);
	}
	for(int i=1,x;i<=n;i++){
		cin>>x;
		for(int j=1,v;j<=x;j++){
			cin>>v;
			G[i].push_back(v);
			c_G[v].push_back(i);
		}
	}
	bfs();
	for(int i=1,x,y;i<=n;i++){
		if(!G[i].size()){
			cout<<a[i].up<<' '<<a[i].down<<"\n";
		}
	}
	return 0;
}

回复

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

正在加载回复...