社区讨论
八十分代码求条
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 条回复,欢迎继续交流。
正在加载回复...