求助(玄关)
查看原帖
求助(玄关)
760954
lovelish楼主2024/10/2 19:16

看了题解,我的思路和其他人的差距都很大,但是不知道为什么WA了4个点,就很奇怪。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll f[31];
ll tree[10000010];
void dfs(ll v,ll i,ll n)
{
	if(i==0||n==0)
	{
		return;
	}
	ll sum=0,summ=0;//cout<<v<<" "<<i<<" "<<n<<endl;
	for(int j=0;j<=i;j++)
	{
		sum+=f[j]*f[i-j];//cout<<sum<<endl;
		summ+=f[j];
		if(sum>=n)
		{		
			//cout<<endl<<v<<" "<<j<<" "<<i<<" "<<sum<<" "<<summ-f[j]<<endl;
			tree[v*2]=j;
			dfs(v*2,j-1,n-(sum-f[j]*f[i-j]));
			tree[v*2+1]=i-j;
			dfs(v*2+1,i-j-1,n-(sum-f[j]*f[i-j]));
			return;
		}
	}
}
void dfs2(int v)
{
	//cout<<tree[v]<<" "<<v<<endl;
	if(tree[v])
	{
		putchar('(');
		dfs2(v*2);
		putchar('X');
		dfs2(v*2+1);
		putchar(')');
	}
}
int main()
{
	//freopen("TREE.in","r",stdin);
	//freopen("TREE.out","w",stdout);
	f[0]=1;
	f[1]=1;
	for(int i=2;i<=30;i++)
	{
		for(int j=0;j<i;j++)
		{
			f[i]+=f[j]*f[i-j-1];
		}
		//cout<<f[i]<<endl;
	}
	ll n;
	cin>>n;
	n++;
	ll x=0;
	for(int i=0;i<=30;i++)
	{
		x+=f[i];
		if(x>=n)
		{
			tree[1]=i;
			dfs(1,i-1,n-(x-f[i]));		
			dfs2(2);
			putchar('X');
			dfs2(3);
			return 0;
		}
	}
	return 0;
}
2024/10/2 19:16
加载中...