HDU 3924 Extend-Tree 【一道不错的分治题目】

一道多校联合的题目。

给定的是树的形状和具体的数字的一一对应关系。

然后给定一个数字N(1 <= N <= 10^14),要求输出对应的树的结构。


训练的时候有个地方没想明白,没有做出来。

通过预处理,可以得到最多20个结点就可以达到10^14方数量级。

预处理,求出

num【i】 表示含有i个结点的树种类的个数。

total【i】表示不大于i个结点的数种类的总个数。

rig【i】表示中子树和右子树一共给i个结点能够表示出来的数种类的个数。


然后输出过程函数dfs(int L, LLN) 表示输出含有L个结点的第N课树。

中间需要求出左子树,中子树,右子树,所含的结点数以及分别是要输出第几课树。

这一步求的时候要仔细一点,根据上面的预处理计算出来。


// joy   hdu3924
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
typedef __int64 LL;
const int MAX=30;
const int LIM=21;


////////////////////////////////////
LL num[MAX],rig[MAX],total[MAX];
int b[4];
LL gs(int L)
{
	LL res=0;
	for(int i=0;i<=L;i++)
	{
		for(int j=i;j<=L;j++)
		{
			int k=L-i-j;
			if(j>k) continue;
			b[0]=i;
			b[1]=j;
			b[2]=k;
			do
			{
				res+=num[b[0]]*num[b[1]]*num[b[2]];
			}while(next_permutation(b,b+3));
		}
	}
	return res;
}
LL getR(int L)
{
	LL res=0;
	for(int i=0;i<=L;i++)
	{
		res+=num[i]*num[L-i];
	}
	return res;
}
void init()
{
	num[0]=num[1]=1;
	for(int i=2;i<=LIM;i++) num[i]=gs(i-1);
	
	total[0]=0;
	for(int i=1;i<=LIM;i++) total[i]=total[i-1]+num[i];
	
	rig[0]=1;
	for(int i=1;i<=LIM;i++) rig[i]=getR(i);
}

//////////////////////////
int getNN(LL N)
{
	for(int i=1;i<=LIM;i++) if(total[i]>=N) return i;
}
void dfs(int L,LL N)
{
	if(L==1) {printf("X");return ;}
	
	int x=L-1;
	int ll,mm,rr;
	for(ll=0;N>num[ll]*rig[x-ll];ll++) N-=num[ll]*rig[x-ll];
	
	
	if(ll)
	{
		printf("(");
		dfs(ll,(N-1)/rig[x-ll]+1);
		printf(")");
	}
	
	N%=rig[x-ll];
	if(N==0) N=rig[x-ll];
	x-=ll;
	
	for(mm=0;N>num[mm]*num[x-mm];mm++) N-=num[mm]*num[x-mm];
	
	if(mm)
	{
		printf("(");
		dfs(mm,(N-1)/num[x-mm]+1);
		printf(")");
	}
	
	N%=num[x-mm];
	if(N==0) N=num[x-mm];
	x-=mm;
	
	if(x)
	{
		printf("(");
		dfs(x,N);
		printf(")");
	}
	printf("X");
}
int main()
{
	init();
	
	int T;scanf("%d",&T);
	int CN=0;
	
	while(T--)
	{
		LL N;scanf("%I64d",&N);
		int nn=getNN(N);
		printf("Case #%d: ",++CN);
		dfs(nn,N-total[nn-1]);
		puts("");
	}
	
	return 0;
}


阅读更多
文章标签: permutation
个人分类: 【解题报告】
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭