T1为什么会T
  • 板块灌水区
  • 楼主Lates
  • 当前回复13
  • 已保存回复13
  • 发布时间2020/12/5 17:27
  • 上次更新2023/11/5 06:37:43
查看原帖
T1为什么会T
119062
Lates楼主2020/12/5 17:27

RT

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define int long long 
using namespace std;
inline int read(){
	register int x=0,v=1,ch=getchar();
	while(!isdigit(ch)){if(ch=='-')v=-1;ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^'0');ch=getchar();};
	return x*v;
}
const int MAX=1e5+5;
struct E{
	int e,next;
}e[MAX];
int cnt=1,head[MAX];
inline void add(int u,int v){
	e[cnt]=(E){v,head[u]};head[u]=cnt++;
}
int n,m,d[MAX],de[MAX];
int ansp[MAX],ansq[MAX];
int u[MAX],v[MAX];
int gcdd(int a,int b){
	return b?gcdd(b,a%b):a;
}
queue<int>q;
int s[MAX];
inline void topsort(){
	for(register int i=1;i<=n;++i)ansp[i]=0,ansq[i]=1;
	for(register int i=1;i<=n;++i)if(!de[i])q.push(i),ansp[i]=1;
	
	while(!q.empty()){
		int x=q.front();q.pop();
		s[++s[0]]=x;
		for(register int i=head[x];i;i=e[i].next){
			--de[e[i].e];
			if(de[e[i].e]==0)q.push(e[i].e);
		}
	}
}
signed main(){
	freopen("water.in","r",stdin);
	freopen("water.out","w",stdout);
	n=read(),m=read();
	for(register int i=1;i<=n;++i){
		d[i]=read();
		for(register int j=1;j<=d[i];++j){
			int u=read();
			add(i,u);
			++de[u];
		}
	}
	topsort();
	for(register int u=1,p,q;u<=n;++u){
		int x=s[u];
		p=ansp[x];
		q=ansq[x]*d[x];
		int g=gcdd(p,q);
		p/=g,q/=g;
		for(register int i=head[x],P,Q,g;i;i=e[i].next){
			P=ansp[e[i].e]*q+ansq[e[i].e]*p;
			Q=ansq[e[i].e]*q;
			g=gcdd(P,Q);
			P/=g,Q/=g;
			ansp[e[i].e]=P;
			ansq[e[i].e]=Q;
		}
	}
	for(register int i=1;i<=n;++i){
		if(!d[i])printf("%lld %lld\n",ansp[i],ansq[i]);
	}
	return 0;
}
2020/12/5 17:27
加载中...