hdu 5524 Subtrees 递推

/*
Title :Subtrees
Status:AC
By wf,
*/
#pragma comment(linker, "/STACK:1024000000,1024000000")

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <stack>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#define FOR(i,s,t) for(int i = (s) ; i <= (t) ; ++i )

typedef long long ll;
typedef unsigned long long ull;
using namespace std;

const int inf=0x3f3f3f3f;
const int maxn=1e6+5;

ll n;
set<ll>s;

ll insertnum(ll rt){
    int c=0;
    while( rt<=n )
    {
        c++;
        s.insert( (1LL<<c)-1 );
        rt=(rt<<1)+1;
    }

	return ( (1LL<<c)-1 );

}
void up(ll rt,ll num,ll step){

	s.insert(num);
	//printf("insert::%d\n",num );
	if(rt==1)return;

	ll fa=rt/2;

	bool left=1;//当前结点为父节点的左孩子

	if(rt%2)left=0;

	ll other=0;
	if(left){
		other = rt+1;
	}else{
		other = rt-1;
	}

	ll othernum=0;
	if(other <= n) {
         othernum = insertnum(other);
	}

	up(fa,num+othernum+1,step+1 );
}
int main()
{
	//freopen("in.txt","r",stdin);
	while(scanf("%lld",&n)!=EOF){
		s.clear();
		up(n,1,1);
		printf("%d\n",s.size() );
	}

	return 0;
}

  

时间: 2024-10-22 14:14:47

hdu 5524 Subtrees 递推的相关文章

HDU 2013(递推&amp;递归_D题)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2013 ----------------------------------------------------------------------------------- 题意:每天吃掉一半再多一个,给出第几天吃到只剩一个,求开始时的数量. 思路:递推.按照每天的处理方式反向处理一下,最终得到结果. 代码: #include<cstdio> #include<cstring> #in

HDU 2045(递推&amp;递归_B题)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2045 ----------------------------------------------------------------------------------- 题意:3种颜色,方格涂色,从左到右,最后一个方格颜色不能和第一个方格颜色相等,相邻颜色不能相同. 思路:最开始思路想简单了,以为第一个方格3种颜色,第二个方格到倒数第二个方格都是2种选择,最后一个方格一种选择.但是,这种递推需要

hdu 2067(递推或卡特兰数【待补充】)

//解法一:递推#include<iostream> using namespace std; long long d[36][36]; int main() { for(int i=1;i<=35;i++) { d[0][i]=1; } for(int i=1;i<=35;i++) for(int j=i;j<=35;j++) { if(i==j) d[i][j]=d[i-1][j]; else d[i][j]=d[i-1][j]+d[i][j-1]; } int n; i

hdu 1249 三角形 (递推)

三角形 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4390    Accepted Submission(s): 2957 Problem Description 用N个三角形最多可以把平面分成几个区域? Input 输入数据的第一行是一个正整数T(1<=T<=10000),表示测试数据的数量.然后是T组测试数据,每组测试数据只

HDU 2604 Queuing (递推+矩阵快速幂)

[题目链接]:click here~~ [题目大意]: n个人排队,f表示女,m表示男,包含子串'fmf'和'fff'的序列为O队列,否则为E队列,有多少个序列为E队列. [思路]: 用f(n)表示n个人满足条件的结果,那么如果最后一个人是m的话,那么前n-1个满足条件即可,就是f(n-1): 如果最后一个是f那么这个还无法推出结果,那么往前再考虑一位:那么后三位可能是:mmf, fmf, mff, fff,其中fff和fmf不满足题意所以我们不考虑,但是如果是 mmf的话那么前n-3可以找满足

hdu 1723 DP/递推

题意:有一队人(人数 ≥ 1),开头一个人要将消息传到末尾一个人那里,规定每次最多可以向后传n个人,问共有多少种传达方式. 这道题我刚拿到手没有想过 DP ,我觉得这样传消息其实很像 Fibonacci 所举的例子:一个人每次能够跨一或二阶台阶,问到 n 阶台阶有几种跨法.理念是一样的,只不过跨得台阶数可能会变而已.根据 Fibonacci 数列类比过来,每次最多能传 m 人,则 A [ i ] = A [ i - m ] + A [ i - m + 1 ] +  …… + A [ i - 1

hdu 5366 简单递推

记f[i]为在长度是i的格子上面至少放一个木桩的方法数.考虑第i个格子,有放和不放两种情况. 1.如果第i个格子放了一个木桩,则i - 1和i - 2格子上面不能放木桩,方案数为:f[i - 3] + 1 2.如果第i个格子没有放木桩,则方案数为:f[i - 1] 然后递推即可. 1 #include <iostream> 2 using namespace std; 3 4 typedef long long ll; 5 const int N = 61; 6 ll f[N]; 7 8 vo

HDU 5366 dp 递推

The mook jong Accepts: 506 Submissions: 1281 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 ZJiaQ为了强身健体,决定通过木人桩练习武术.ZJiaQ希望把木人桩摆在自家的那个由1*1的地砖铺成的1*n的院子里.由于ZJiaQ是个强迫症,所以他要把一个木人桩正好摆在一个地砖上,由于木人桩手比较长,所以两个木人桩之间地砖必须大于等

hdu 5524 Subtrees dfs

Subtrees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description There is a complete binary tree with N nodes.The subtree of the node i has Ai nodes.How many distinct numbers are there of Ai? Input Th