同样的代码为什么几次评测结果不一样?
查看原帖
同样的代码为什么几次评测结果不一样?
234913
GBLoi楼主2020/12/8 23:12

RT.

本机跑满分,开了O2也是满分。
然而

并且每次 tle 的点都有所不同。

#include<set>
#include<map>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef long double LD;

const int N=1e6+5;

int one[N],idx;
int ver[N],Next[N];
inline void AddEdge(int a,int b)
{
	Next[++idx]=one[a];
	one[a]=idx;
	ver[idx]=b;
}

struct Frac
{
	LL a;
	LL c[6];
	// a/b ;
}f[N];

inline Frac add(Frac x,Frac y)
{
	Frac z;
	int i;
	for(i=2;i<=5;i++) 
		z.c[i]=min(x.c[i],y.c[i]);
	Frac x0=x,y0=y;
	for(i=2;i<=5;i++) {
		int cnt=y0.c[i]-z.c[i];
		while(cnt--) x.a*=i;
	}
	for(i=2;i<=5;i++) {
		int cnt=x0.c[i]-z.c[i];
		while(cnt--) y.a*=i;
	}
	Frac res;
	for(i=2;i<=5;i++) 
		res.c[i]=x.c[i]+y.c[i]-z.c[i];
	res.a=x.a+y.a;
	
	for(i=2;i<=5;i++) 
		while(res.c[i]&&(res.a%i)==0) 
			res.c[i]--,res.a/=i;
	return res;
}

int n,m;
int din[N],dout[N];

queue<int> q;

void topsort()
{
	while(q.size()) q.pop();
	int i;
	int x,y;
	
	for(i=1;i<=m;i++) f[i].a=1;
	for(i=1;i<=n;i++) 
		if(din[i]==0) 
			q.push(i);
	
	while(q.size()) {
		x=q.front(); q.pop();
		
		Frac z=f[x];
		if(dout[x]==2) z.c[2]++;
		else if(dout[x]==3) z.c[3]++;
		else if(dout[x]==4) z.c[2]+=2;
		else if(dout[x]==5) z.c[5]++;
			
		for(i=one[x];i;i=Next[i]) {
			y=ver[i];
			
			f[y]=add(f[y],z);
			din[y]--;
			if(din[y]==0) q.push(y);
		}
	}
}

int main()
{
	int i,j;
	int y;
	
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++) {
		scanf("%d",&dout[i]);
		for(j=1;j<=dout[i];j++) {
			scanf("%d",&y);
			AddEdge(i,y);
			din[y]++;
		}
	}
	
	topsort();
	
	for(i=1;i<=n;i++) 
		if(dout[i]==0) {
			LD z=1;
			for(j=1;j<=5;j++) 
				for(int k=f[i].c[j];k>=1;k--)
					z*=j;
					
			printf("%lld %.0lf\n",f[i].a,(double)z);
		}
			
	return 0;
}
2020/12/8 23:12
加载中...