听说开long long能拿90分,哪位大佬看看为啥我只拿了60分啊·
查看原帖
听说开long long能拿90分,哪位大佬看看为啥我只拿了60分啊·
250224
撒野君楼主2022/10/18 21:06

我这个程序测试就只AC了6个,但是排除掉我没有用高精度~~(好吧其实是我嫌麻烦懒得打,后面再加上去)~~,我想问下,别的大佬说long long能弄到90分,为啥我才60呀,是哪里有问题吗!!!

#include<bits/stdc++.h>
using namespace std;
struct fs{
	long long up=0;
	long long down=1;
};
long long n,m;
fs ans[100001];
fs js;
struct zhan{
	long long in=0;
	long long PLN; //Pipe Lines number;
	long long firstare[5]={0};
	long long off=1;
};
zhan tp[100001];
int gys(long long UP,long long DOWN){
	if(UP%DOWN==0){
		return DOWN;
	} 
	return gys(DOWN,UP%DOWN);
} 
 
void add(struct fs a,struct fs fir,long long I,long long J){
	if(a.down==fir.down){
	    ans[tp[I].firstare[J]-1].up=a.up+fir.up;
	    long long GYS=gys(ans[tp[I].firstare[J]-1].up,ans[tp[I].firstare[J]-1].down);
	    ans[tp[I].firstare[J]-1].up/=GYS;
	    ans[tp[I].firstare[J]-1].down/=GYS;
	    return;
	}else{
	    fs zc;
	    zc.up=fir.up;
	    zc.down=fir.down;
		ans[tp[I].firstare[J]-1].up=zc.up*a.down+zc.down*a.up;
		ans[tp[I].firstare[J]-1].down=zc.down*a.down;
		long long gcd=gys(ans[tp[I].firstare[J]-1].up,ans[tp[I].firstare[J]-1].down);
		ans[tp[I].firstare[J]-1].up/=gcd;
		ans[tp[I].firstare[J]-1].down/=gcd;
	} 
}                                                                                        
int main(){
	cin>>n>>m;
	for(int i=0;i<n;i++){
		long long point;
		cin>>point;
		tp[i].PLN=point;
		//cout<<" "<<i<<" "<<endl;
		for(int j=0;j<point;j++){
			int out;
			cin>>out;
			tp[out-1].in++;//
			tp[i].firstare[j]=out; 
		}
	}
	long long CBW=n;
	//js.up=1;
	for(long long i=0;i<n;i++){
		if(tp[i].in==0){
			ans[i].up=1;
		}
	}
	for(int i=0;i<n&&CBW!=0;i++){
		if((tp[i].in==0)&&(tp[i].off==1)){ 
		    if(tp[i].firstare[0]==0){
		    	CBW--;
		    	tp[i].off--;
		    	continue;
			}
			tp[i].off--;
			for(long long j=0;j<tp[i].PLN;j++){
				js.up=ans[i].up;
				js.down=ans[i].down*tp[i].PLN;
				add(js,ans[tp[i].firstare[j]-1],i,j);
				if(tp[tp[i].firstare[j]-1].in!=0)
				    tp[tp[i].firstare[j]-1].in--; 
			}
			CBW--;
		}
		if(i==n-1){
		    if(CBW!=0){
		    	i=0;
			}
			else break;
		}	      
	}
	for(int i=0;i<n;i++){
		if(tp[i].PLN==0)
	        cout<<ans[i].up<<" "<<ans[i].down<<endl;
	}
	return 0;
} 
2022/10/18 21:06
加载中...