社区讨论

80分求调

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@lo2b7gc2
此快照首次捕获于
2023/10/23 10:59
2 年前
此快照最后确认于
2023/11/03 11:09
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
typedef unsigned long long ull;
using namespace std;
template <class I>
	inline void read(I &cn) {
	        char c; int sig = 1;
	        while(!isdigit(c = getchar())) if(c == '-') sig = 0;
	        if(sig) {cn = c-48; while(isdigit(c = getchar())) cn = (cn<<3)+(cn<<1)+(c-48); }
	        else    {cn = 48-c; while(isdigit(c = getchar())) cn = (cn<<3)+(cn<<1)+(48-c); }
	    }
	    template<typename T>void write(T cn)
		{
			if(cn < 0) { putchar('-'); cn = 0-cn; }
			int wei = 0; T cm = 0;
			do cm = cm*10+cn%10,cn/=10,wei++; while(cn);
			while(wei--) putchar(cm%10+48),cm/=10;
		}
    
const int MAXN=100010;
__int128 n,m;
__int128 ha[MAXN],vis[MAXN];
__int128 sum1[MAXN],sum2[MAXN];
vector<__int128> a[MAXN],b[MAXN];
__int128 GCD(__int128 x,__int128 y){
    return y?GCD(y,x%y):x;
}
void add(__int128 a1,__int128 a2,__int128 b1,__int128 b2,__int128 uu,__int128 vv){
	__int128 gys=GCD(a2,b2);
	__int128 gbs=(a2/gys)*(b2/gys)*gys;//公分母
	a1=a1*(gbs/a2),b1=b1*(gbs/b2);
	__int128 c=a1+b1;
	__int128 gyss=GCD(c,gbs);
	sum1[vv]=c/gyss,sum2[vv]=gbs/gyss;
}
void bfs(__int128 u){
	queue<__int128> q;
	q.push(u);
	while(!q.empty()){
		__int128 s=q.front();q.pop();
		for(__int128 i=0;i<a[s].size();i++){
			__int128 v=a[s][i],f=0;
			for(__int128 k=0;k<b[v].size();k++) if(vis[b[v][k]]==0) f=1; 
			if(f==0&&vis[v]==0){
				for(__int128 j=0;j<b[v].size();j++){
					__int128 w=b[v][j];
					add(sum1[w],sum2[w]*a[w].size(),sum1[v],sum2[v],w,v);
				}
				vis[v]=1;
				q.push(v);
			}
		}
		if(q.empty()) break;
	}
}
signed main(){
	read(n);read(m);
	for(__int128 i=1;i<=n;i++){
		__int128 d;
		read(d);
		if(d==0) ha[i]=-1;//-1为出水口
		for(__int128 j=1;j<=d;j++){
			__int128 x;
			read(x);
			a[i].push_back(x);
			b[x].push_back(i);
			ha[x]=1;//不为入水口
		}
	}
	for(__int128 i=1;i<=n;i++) sum2[i]=1;
	for(__int128 i=1;i<=n;i++)
		if(ha[i]==0) sum1[i]=sum2[i]=1,vis[i]=1,bfs(i);
	for(__int128 i=1;i<=n;i++)
		if(ha[i]==-1)
			write(sum1[i]),puts(" "),write(sum2[i]),puts("\n");
	return 0;
}
/*
10 1
  5 2 3 4 5 6
  2 7 8
  2 8 10
  2 9 7
  1 9
  3 7 8 9
  1 10
  0
 1 10
  0

4 15
11 15


*/

回复

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

正在加载回复...