社区讨论

八十分代码求条

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@losl4mus
此快照首次捕获于
2023/11/10 20:19
2 年前
此快照最后确认于
2023/11/10 21:29
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
struct tt{
	__int128 p,q;
}sum[1000000+5];
__int128 tl[1000000+5],n,m,head[1000000+5],cnt,d[1000000+5],in[1000000+5],top[1000000+5],ccnt;
struct ttt{
	__int128 data,nxt;
}rd[1000000*5+5];
void add(__int128 x,__int128 y){
	rd[++cnt].data=y;
	rd[cnt].nxt=head[x];
	head[x]=cnt;
}
__int128 gcd(__int128 a,__int128 b){
	return b?gcd(b,a%b):a;
}
queue<__int128> q;
tt addd(tt a,tt b){
	tt ans;
	__int128 z1,z2,m1,m2,l,g,g2;
	z1=a.p,z2=b.p,m1=a.q,m2=b.q;
	g=gcd(m1,m2);
	l=m1*m2*g;
	ans.p=(z1*l/m1)+(z2*l/m2);
	ans.q=l;
	g2=gcd(ans.p,ans.q);
	ans.p/=g2;
	ans.q/=g2;
	return ans;
}
inline void read(__int128 &s)
{
    s=0;
    char c=' ';
    while(c>'9'||c<'0') c=getchar();
    while(c>='0'&&c<='9')
    {
        s=s*10+c-'0';
        c=getchar();
    }
}
void write(__int128 x){
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
int main(){
//	freopen("water9.in","r",stdin);
//	freopen("nb.out","w",stdout);
	read(n),read(m);
	for(__int128 i=1;i<=n;i++){
		read(d[i]);
		for(__int128 j=1,x;j<=d[i];j++){
			read(x); 
			add(i,x);
			in[x]++;
		}
	}
	for(__int128 i=1;i<=n;i++)
		if(!in[i]){
			sum[i].p=sum[i].q=1;
			q.push(i);
		}else{
			sum[i].p=0;
			sum[i].q=1;
		}
	while(q.size()){
		__int128 x=q.front();
		top[++ccnt]=x;
		q.pop();
		for(__int128 i=head[x];i;i=rd[i].nxt){
			__int128 y=rd[i].data;
			in[y]--;
			if(!in[y])q.push(y);
		}
	}
	for(__int128 i=1,x,g;i<=ccnt;i++){
		x=top[i];
		tt tmp;
		tmp.p=sum[x].p;
		tmp.q=sum[x].q*d[x];
		if(d[x]==0)continue;
		g=gcd(tmp.p,tmp.q);
		tmp.p/=g;
		tmp.q/=g;
		for(__int128 j=head[x];j;j=rd[j].nxt){
			__int128 y=rd[j].data;
			sum[y]=addd(sum[y],tmp);
			sum[y].p/=gcd(sum[y].p,sum[y].q);
			sum[y].q/=gcd(sum[y].p,sum[y].q);
		}
	}
	for(__int128 i=1,g;i<=n;i++)
		if(!d[i]){
			g=gcd(sum[i].p,sum[i].q);
			sum[i].p/=g,sum[i].q/=g;
			write(sum[i].p);
			printf(" ");
			write(sum[i].q);
			printf("\n");
		}
	return 0;
} 

回复

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

正在加载回复...