奇怪现象求助
查看原帖
奇怪现象求助
578628
Undead2008楼主2023/8/23 20:57

这份代码用 C++ 14 交上去会 RE #1

但是 C++ 20 交上去就 AC 了

C++ 14 本地和 luogu 的机子都能过,但是用 CF 的 Custom Test 交会 RE

经过 Debug 可以发现问题出在了注释的两行位置

蒟蒻感觉那两行写的也没问题啊,求教大佬。

#include "iostream"
#include "vector"
using namespace std;
#define int long long
const int maxn = 200010;
const int mo = 1e9+7;
int n,sub[maxn],f[maxn];
vector<int>l[maxn],pre[maxn],suf[maxn];
void dfs(int p,int Fa){
	sub[p]=1;
	for(int i=0;i<l[p].size();i++){
		int to=l[p][i];
		if(to==Fa)continue;
		dfs(to,p);
		sub[p]=(sub[p]*(sub[to]+1))%mo;
	}
}
void dp(int p,int Fa){
	for(int i=0;i<l[p].size();i++)
		pre[p].push_back(sub[l[p][i]]+1),
		suf[p].push_back(sub[l[p][i]]+1);
    for(int i=1;i<pre[p].size();i++)
		pre[p][i]=(pre[p][i-1]*pre[p][i])%mo;
	for(int i=suf[p].size()-2;i>=0;i--)//这里
		suf[p][i]=(suf[p][i+1]*suf[p][i])%mo;//这里
	for(int i=0;i<l[p].size();i++){
		int to=l[p][i];
        f[to]=f[p]+1;
		if(i>0)f[to]=(f[to]*pre[p][i-1])%mo;
		if(i<l[p].size()-1)f[to]=(f[to]*suf[p][i+1])%mo;
		dp(to,p);
	}
}
signed main(){
	cin>>n;
	for(int i=2,Fa;i<=n;i++){
		cin>>Fa;
		l[Fa].push_back(i);
	}
	dfs(1,0);
	f[1]=0;
	dp(1,0);
	for(int i=1;i<=n;i++)
		cout<<((f[i]+1)*sub[i])%mo<<' ';
}
2023/8/23 20:57
加载中...