关于 NOIP T1
  • 板块学术版
  • 楼主_moorhsum_
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/12/9 21:14
  • 上次更新2023/11/5 06:20:39
查看原帖
关于 NOIP T1
432043
_moorhsum_楼主2020/12/9 21:14

RT

#include<bits/stdc++.h>
using namespace std;
long long n,m,p[100009],q[100009],vis[100009],pipe[100009];
vector<long long> d[100009],end,start;
queue<long long> Q;
long long gcd(long long a,long long b)
{
	if(b==0) return a;
	else return gcd(b,a%b);
}
void add(long long i,long long fenzi,long long fenmu)
{
	long long a=p[i],b=q[i],c=fenzi,e=fenmu;
	long long fenmu2=b*e,fenzi2=a*e+b*c;
	long long temp=fenmu2;
	fenmu2/=gcd(fenmu2,fenzi2);
	fenzi2/=gcd(temp,fenzi2);
	p[i]=fenzi2;
	q[i]=fenmu2;
}
void divide(long long i)
{
	long long fenzi3=p[i],fenmu3=q[i]*d[i].size();
	long long tmp1=fenzi3,tmp2=fenmu3;
	fenzi3/=gcd(tmp1,tmp2);
	fenmu3/=gcd(tmp1,tmp2);
	for(long long j=0;j<d[i].size();j++)
	{
		add(d[i][j],fenzi3,fenmu3);
//		cout<<"第"<<d[i][j]<<"个结点流入"<<fenzi3<<"/"<<fenmu3<<"吨污水"<<endl; 
	}
	p[i]=0;
	q[i]=1;
}
void solve()
{
	while(!Q.empty())
	{
		long long t=Q.front();
		Q.pop();
		if(d[t].size()) divide(t);
		for(long long i=0;i<d[t].size();i++) Q.push(d[t][i]);
	}
	for(long long i=0;i<end.size();i++) cout<<p[end[i]]<<" "<<q[end[i]]<<endl;
}
int main()
{
	freopen("water.in","r",stdin);
	freopen("water.out","w",stdout);
	cin>>n>>m;
	for(long long i=1;i<=n;i++)
	{
		p[i]=0;
		q[i]=1;
	}
	for(long long i=1;i<=n;i++)
	{
		cin>>pipe[i];
		for(long long j=1;j<=pipe[i];j++)
		{
			long long qqqq;
			cin>>qqqq;
			d[i].push_back(qqqq);
			vis[qqqq]=1;
		}
		if(pipe[i]==0) end.push_back(i);
	}
	for(long long i=1;i<=n;i++)
		if(!vis[i]) {start.push_back(i);p[i]=q[i]=1;Q.push(i);}
	solve();
//	divide(1);
//	for(long long i=0;i<start.size();i++) cout<<start[i]<<" ";
//	cout<<endl;
//	for(long long i=0;i<end.size();i++) cout<<end[i]<<" ";
	return 0;
}

为什么爆零

2020/12/9 21:14
加载中...