题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1832

题意: 中文题诶~

思路: 若二叉树中有 k 个节点只有一个子树, 则答案为 1 << k.

详情参见:http://blog.csdn.net/gyhguoge01234/article/details/77836484

代码:

  1 #include <iostream>
  2 #include <stdio.h>
  3 #include <string.h>
  4 #define ll long long
  5 using namespace std;
  6
  7 const int MAX = 1e2;
  8 const int M = 1e9;//1e9为1节
  9 const int MAXN = 35;
 10
 11 struct BigInt{
 12     const static int mod = 10000;
 13     const static int DLEN = 4;
 14     int a[600], len;
 15     BigInt(){
 16         memset(a, 0, sizeof(a));
 17         len = 1;
 18     }
 19     BigInt(int v){
 20         memset(a, 0, sizeof(a));
 21         len = 0;
 22         do{
 23             a[len++] = v % mod;
 24             v /= mod;
 25         }while(v);
 26     }
 27     BigInt(const char s[]){
 28         memset(a, 0, sizeof(a));
 29         int L = strlen(s);
 30         len = L / DLEN;
 31         if(L % DLEN) len++;
 32         int index = 0;
 33         for(int i = L - 1; i >= 0; i -= DLEN){
 34             int t = 0;
 35             int k = i - DLEN + 1;
 36             if(k < 0) k = 0;
 37             for(int j = k; j <= i; j++)
 38                 t = t * 10 + s[j] - '0';
 39             a[index++] = t;
 40         }
 41     }
 42     BigInt operator +(const BigInt &b)const{
 43         BigInt res;
 44         res.len = max(len, b.len);
 45         for(int i = 0; i <= res.len; i++) res.a[i] = 0;
 46         for(int i = 0; i < res.len; i++){
 47             res.a[i] += ((i < len) ? a[i] : 0) + ((i < b.len) ? b.a[i] : 0);
 48             res.a[i + 1] += res.a[i] / mod;
 49             res.a[i] %= mod;
 50         }
 51         if(res.a[res.len] > 0) res.len++;
 52         return res;
 53     }
 54     BigInt operator *(const BigInt &b)const{
 55         BigInt res;
 56         for(int i = 0; i < len; i++){
 57             int up = 0;
 58             for(int j = 0; j < b.len; j++){
 59                 int temp = a[i] * b.a[j] + res.a[ i + j] + up;
 60                 res.a[i + j] = temp%mod;
 61                 up = temp / mod;
 62             }
 63             if(up != 0)
 64             res.a[i + b.len] = up;
 65         }
 66         res.len = len + b.len;
 67         while(res.a[res.len - 1] == 0 && res.len > 1) res.len--;
 68         return res;
 69     }
 70     void output(){
 71         printf("%d", a[len - 1]);
 72         for(int i = len - 2; i >= 0; i--)
 73             printf("%04d", a[i]);
 74         printf("\n");
 75     }
 76 };
 77
 78 // 先序遍历 X L … R …
 79 // 后序遍历 … L … R X
 80
 81 const int N = 1e5 + 10;
 82 int a[N], b[N];
 83 BigInt sol(1);
 84
 85 void dfs(int al, int ar, int bl, int br){
 86     if(ar - al <= 1) return;
 87     al++;
 88     br--;
 89     int indx = bl, cnt = 0;;
 90     while(a[al] != b[indx]) indx++;
 91     int newar = al + (indx - bl + 1);
 92     int newbr = indx + 1;
 93     cnt++;
 94     dfs(al, newar, bl, newbr);
 95     if(ar - al != indx - bl + 1){
 96         cnt++;
 97         dfs(newar, ar, newbr, br);
 98     }
 99     if(cnt == 1) sol = sol * 2;
100 }
101
102 int main(void){
103     int n;
104     scanf("%d", &n);
105     for(int i = 0; i < n; i++){
106         scanf("%d", &a[i]);
107     }
108     for(int i = 0; i < n; i++){
109         scanf("%d", &b[i]);
110     }
111     sol = 1;
112     dfs(0, n, 0, n);
113     sol.output();
114     return 0;
115 }

View Code

转载于:https://www.cnblogs.com/geloutingyu/p/7693105.html

51nod1832(二叉树/高精度模板+dfs)相关推荐

  1. [LeetCode] Binary Tree Level Order Traversal 二叉树层次遍历(DFS | BFS)

    目录: 1.Binary Tree Level Order Traversal - 二叉树层次遍历 BFS 2.Binary Tree Level Order Traversal II - 二叉树层次 ...

  2. [二叉树|深搜|dfs] leetcode 404 左叶子之和

    [二叉树|深搜|dfs] leetcode 404 左叶子之和 1.题目 题目链接 计算给定二叉树的所有左叶子之和. 示例: 3/ \9 20/ \15 7在这个二叉树中,有两个左叶子,分别是 9 和 ...

  3. 简单高精度模板(bzoj 1089: [SCOI2003]严格n元树)

    1089: [SCOI2003]严格n元树 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 1831  Solved: 913 [Submit][Sta ...

  4. 二叉树非递归dfs——简单思路搞定前中后序遍历

    前言:相信很多同学都被二叉树非递归dfs的前中后序遍历方法弄的头疼.网上的答案,什么前中后序遍历各有一套写法,还有什么一个栈的写法,两个栈的写法.看起来能理解,一闭眼自己写都记不住.今天介绍一种用一种 ...

  5. 高精度模板 洛谷Luogu P1932 A+B A-B A*B A/B Problem

    P1932 A+B & A-B & A*B & A/B Problem 题目背景 这个题目很新颖吧!!! 题目描述 求A.B的和差积商余! 输入输出格式 输入格式: 两个数两行 ...

  6. 【算法模板】高精度模板(带图详解)

    文章目录 一.高精度加法模板 二.高精度减法模板 三.高精度乘法模板 3.1 高精乘以低精(普遍用到) 高精乘以高精 四.高精度除法 4.1.高精度除以低精度 4.2.高精度除以高精度 一.高精度加法 ...

  7. 二叉树(类模板、函数模板、函数对象、函数指针)

    这个二叉树的代码只是简单的实现了一些功能,比如插入和遍历.关键是用到了函数指针和函数对象,还有shared_ptr. 其中shared_ptr一定定义在节点中,因为new出来的空间时节点,释放的时候是 ...

  8. 高精度模板(含加减乘除四则运算)

    高精度加高精度 1 void BigAddBig(char *a, char *b, char *c) 2 { 3 //a表示结果,b,c位加数 4 int a_int[1005] = { 0 }, ...

  9. 剑指offer面试题55 - I. 二叉树的深度(DFS)(递归)

    题目描述 输入一棵二叉树的根节点,求该树的深度.从根节点到叶节点依次经过的节点(含根.叶节点)形成树的一条路径,最长路径的长度为树的深度. 思路 详见链接 代码 class Solution:def ...

最新文章

  1. Microsoft Jet 数据库引擎找不到输入表或查询或者找不到文件
  2. 递归函数时间复杂度分析
  3. 彻底搞懂 python 中文乱码问题_Python BeautifulSoup中文乱码问题的2种解决方法
  4. HTC vive手柄无法识别
  5. android基础面试题(一)
  6. Padavan 老毛子路由器登录SSH教程
  7. 谷歌地图高清卫星地图
  8. 华为鸿蒙系统操作教程_鸿蒙OS Beta版怎么使用
  9. 【译】设计师不可不知的八大网页动画设计
  10. 一天一个 Linux 命令(27):mkfs 命令
  11. 关于刷微信投票的js代码
  12. BLE安全之SM剖析(1)
  13. 怎么订到特价机票(有可能比火车票还便宜哦)
  14. vue-element-admin整合spring-boot实现权限控制之用户管理篇
  15. 搜狗云输入法、Google手机语音搜索:两款创新云产品
  16. kerberos认证相关概念和流程
  17. sql:当一列为空时取另一列(case when then)
  18. 电子围栏与红外对射的区别
  19. C++ 域名空间和作用域
  20. linux运维培训后面试,Linux运维岗位面试中常见的面试问题汇总

热门文章

  1. seafile 部署_Seafile开启webdav及读写性能测试
  2. C语言中实际参数太多,c – 宏的实际参数太多了?
  3. 《MySQL——order by逻辑(全字段排序与rowid排序)》
  4. java 方法 示例_Java集合syncedList()方法与示例
  5. 如何检查数组是否包含JavaScript中的对象?
  6. 实验8 SQL Server 的存储过程
  7. pip安装deb_技术|如何在 Ubuntu 上安装 pip
  8. The security settings could not be applied to the database because the connection has failed安装Mysql
  9. linux中将光标与操作系统,linux操作系统基本命令介绍(2)
  10. codeforce 185 A——Plant