最后一个点MLE求调
查看原帖
最后一个点MLE求调
1025891
XiaoYiii楼主2023/10/19 12:52

RT,虽然只开了LONGLONG,但已经爆内存了,高精度会不会更高

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int in[N],out[N],n,m;
vector<int> pai;
vector<int> ed[N];
queue<int> qu;
struct node{
	long long p,q;
}sum[N];
long long my_gcd(long long a,long long b){
	if(a < b) swap(a,b);
	if(b == 0) return a;
	return my_gcd(b,a % b);
}
node add(node A,node B){
	long long d = my_gcd(A.q, B.q);
	node C;
	C.q = (A.q / d) * B.q;
	C.p = A.p * (B.q / d) + B.p * (A.q / d);
	return C;
}
void yue(node& A){
	int d = my_gcd(A.p,A.q);
	if(d == 0) return;
	A.p /= d;
	A.q /= d;
}
void down(int u){
	if(out[u] == 0) return;
	node temp;
	temp.p = sum[u].p;
	temp.q = sum[u].q * out[u] * 1ll;
	yue(temp);
	int len = ed[u].size();
	for(int i = 0;i < len;i++){
		sum[ed[u][i]] = add(sum[ed[u][i]],temp);
		if(--in[ed[u][i]] == 0){
			qu.push(ed[u][i]);
		}
	}
	return;
}
int main(){
	scanf("%d%d",&n,&m);
	int d = 0, v = 0;
	for(int i = 1;i <= n; i++){
		sum[i].p = 0;
		sum[i].q = 1;
		scanf("%d",&d);
		out[i] = d;
		if(d == 0) pai.push_back(i);
		for(int j = 1;j <= d;j++){
			scanf("%d",&v);
			ed[i].push_back(v);
			++in[v];
		}
	}
	for(int i = 1;i <= m;i++){
		sum[i].p = 1;
		sum[i].q = 1;
		qu.push(i);
	}
	while(!qu.empty()){
		int u = qu.front();
		//printf("%d\n",u);
		qu.pop();
		down(u);	
	}
	int len = pai.size();
	for(int i = 0;i < len;i++){
		yue(sum[pai[i]]);
		printf("%lld %lld\n",sum[pai[i]].p,sum[pai[i]].q);
	}
	return 0;
}
2023/10/19 12:52
加载中...