T1 80是啥问题w
  • 板块灌水区
  • 楼主MikukuOvO
  • 当前回复7
  • 已保存回复7
  • 发布时间2020/12/5 19:39
  • 上次更新2023/11/5 06:36:23
查看原帖
T1 80是啥问题w
208081
MikukuOvO楼主2020/12/5 19:39

有人和我一样80吗qwqqwq,慌得一批。。。

#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define B cerr<<"Break Point"<<endl;
#define P(x) cerr<<#x<<" "<<x<<endl;

namespace io
{
	template<class I>
	void gi(I &w)
	{
		int op=1;
		char ch;
		w=0;
		while(!isdigit(ch)) 
		{
			if(ch=='-') op=-1;
			ch=getchar();
		}
		while(isdigit(ch))
		{
			w=w*10+ch-'0';
			ch=getchar();
		}
		w*=op;
	}
}
using io::gi;

const int N=1e5+5;

int n,m,cnt;
int ind[N],oud[N],head[N];
ll val[N],divc[N];
queue<int>q;
struct edge
{
	int to,nxt;
};
edge e[N*10];

ll gcd(ll x,ll y)
{
	if(!y) return x;
	return gcd(y,x%y);
}
void add_egde(int x,int y)
{
	e[++cnt].to=y;
	e[cnt].nxt=head[x];
	head[x]=cnt;
}
void merge(int x)
{
	ll g=gcd(val[x],divc[x]);
	val[x]/=g,divc[x]/=g;
}
int main()
{
	freopen("water.in","r",stdin);
	freopen("water.out","w",stdout);
	gi(n),gi(m);
	for(int i=1;i<=n;++i)
	{
		gi(oud[i]);
		for(int j=1,x;j<=oud[i];++j)
		{
			gi(x);
			++ind[x];
			add_egde(i,x);
		}
	}
	for(int i=1;i<=n;++i) 
	{
		if(!ind[i]) q.push(i),val[i]=1;
		divc[i]=1;
	}
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		if(!oud[x]) continue;
		divc[x]*=oud[x];
		merge(x);
		for(int i=head[x];i;i=e[i].nxt)
		{
			int v=e[i].to;
			--ind[v];
			val[v]=val[x]*divc[v]+val[v]*divc[x];
			divc[v]=divc[v]*divc[x];
			merge(v);
			if(!ind[v]) q.push(v);
		}
	}
	for(int i=1;i<=n;++i) if(!oud[i]) printf("%lld %lld\n",val[i],divc[i]);
	return 0;
}
2020/12/5 19:39
加载中...