社区讨论

60求调

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@m2k3uka0
此快照首次捕获于
2024/10/22 15:09
去年
此快照最后确认于
2025/11/04 16:32
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int flag[15],w[maxn][4000];
bool judge[maxn],maybe[maxn];
struct fenshu{
	unsigned long long  fenzi;
	unsigned long long  fenmu;
}ans[maxn];
long long gcd(unsigned long long  a,unsigned long long  b){
	if(b==0)return a;
	return gcd(b,a%b);
}
void he(int x,fenshu b){
	if(ans[x].fenmu==0)ans[x].fenmu=b.fenmu,ans[x].fenzi=b.fenzi;
	else {
		unsigned long long p1=ans[x].fenmu,q1=ans[x].fenzi,q2=b.fenzi,p2=b.fenmu,math1=gcd(p1,p2);
		if(math1==1){
			ans[x].fenmu=p1*p2;
			ans[x].fenzi=(p1*q2)+(p2*q1);
		}
		else {
			unsigned long long math2=p1*p2/math1;
			ans[x].fenmu=math2;
			ans[x].fenzi=q1*(math2/p1)+q2*(math2/p2);
		}
		unsigned long long math3=gcd(ans[x].fenmu,ans[x].fenzi);
		ans[x].fenmu/=math3;
		ans[x].fenzi/=math3;
	}
}
void jian(int i){
	int zhen=0;
	if(ans[i].fenzi==ans[i].fenmu){
		ans[i].fenzi=1,ans[i].fenmu=1;
		return;
	}
	if(ans[i].fenzi>ans[i].fenmu)zhen=ans[i].fenzi/ans[i].fenmu;
	unsigned long long n=gcd(ans[i].fenmu,ans[i].fenzi);
	ans[i].fenmu/=n;
	ans[i].fenzi/=n;
	ans[i].fenzi+=ans[i].fenmu*zhen;
}
int main(){
//	freopen("water.in","r",stdin);
//	freopen("water.out","w",stdout);
	int n,m,x[maxn]={},sum=1;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",x+i);
		for(int j=1;j<=x[i];j++){
			scanf("%d",&w[i][j]);
			judge[w[i][j]]=1;
		}
	}
	for(int i=1;i<=n;i++)if(judge[i]==0)flag[sum]=i,sum++,maybe[i]=1;
	for(int i=1;i<=n;i++){
		bool wy=1;
		if(x[i]==0)continue;
		for(int k=1;k<sum;k++)if(flag[k]==i){
			fenshu time;
			time.fenmu=x[i],time.fenzi=1;
			for(int j=1;j<=x[i];j++){
				he(w[i][j],time);
			}
			ans[flag[k]].fenmu=0;
			wy=0;
			break; 
		}
		if(wy==1){
			fenshu time;
			time.fenmu=ans[i].fenmu*x[i],time.fenzi=ans[i].fenzi;
			for(int j=1;j<=x[i];j++){
				he(w[i][j],time);
			}
			ans[i].fenmu=0;
			maybe[i]=1;
		}
	}
	for(int i=1;i<=n;i++){
		if(maybe[i]==0){
			jian(i);
			printf("%lld %lld",ans[i].fenzi,ans[i].fenmu);
			printf("\n");
		}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}
不改算法该怎样优化? 硬模拟到60已经很逆天了

回复

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

正在加载回复...