51Nod-1673-树有几多愁

2023-11-24 22:59
文章标签 51nod 树有 几多 1673

本文主要是介绍51Nod-1673-树有几多愁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ACM模版

描述

描述

题解

真的感觉这个题好难,看了官方题解也不知道怎么搞,又找了一下代码,稍微懂了一些……总得来说,这个题就是 dp (树归、状压) + 贪心,贴一下官方题解吧……我也说不好。真废……

描述

代码

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>using namespace std;typedef vector<int>::iterator vit;const int MAXN = 1e5 + 10;
const int MAX_LEAF = 20;
const int MOD = 1e9 + 7;int n;
int tot = 0, ans = 1;
int f[MAXN];
int g[1 << MAX_LEAF];
int p[1 << MAX_LEAF];
double h[1 << MAX_LEAF];vector<int> e[MAXN];template <class T>
inline void scan_d(T &ret)
{char c;ret = 0;while ((c = getchar()) < '0' || c > '9');while (c >= '0' && c <= '9'){ret = ret * 10 + (c - '0'), c = getchar();}
}void dfs(int u, int pre)
{for (vit it = e[u].begin(); it != e[u].end(); ++it){int v = *it;if (v == pre){continue;}dfs(v, u);f[u] |= f[v];}if (!f[u]){f[u] = 1 << tot++;}g[f[u]]++;
}int main()
{scan_d(n);int u, v;for(int i = 1; i < n; ++i){scan_d(u), scan_d(v);e[u].push_back(v);e[v].push_back(u);}dfs(1, -1);int tmp;reverse(g, g + (1 << tot));for (int i = 0; i < tot; ++i){tmp = 1 << i;for (int j = 1; j < 1 << tot; ++j){if (j & tmp){g[j] += g[j ^ tmp];}}}reverse(g, g + (1 << tot));for (int i = 0; i < tot; ++i){tmp = 1 << i;for (int j = 1; j < 1 << tot; ++j){if (j & tmp){g[j] = g[j ^ tmp] - g[j];}}}memset(p, -1, sizeof(p));for (int i = 1; i < 1 << tot; ++i){for (int j = 0; j < tot; ++j){tmp = 1 << j;if ((i & tmp) && (p[i] == -1 || h[i] < h[i ^ tmp])){h[i] = h[i ^ tmp];p[i] = j;}}h[i] += log(g[i] + 1);}for (int i = (1 << tot) - 1; i; i ^= 1 << p[i]){ans = ans * (g[i] + 1LL) % MOD;}printf("%d\n", ans);return 0;
}

这篇关于51Nod-1673-树有几多愁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/422694

相关文章

【51nod】算法马拉松4 F 移数字 【快速求N!%P】【FFT】

传送门:【51nod】算法马拉松4 F 移数字 涉及知识点:多项式求逆,多项式除法,多点插值,阶乘取模。 对于N!%P,复杂度为 O(N−−√log2N−−√) O(\sqrt N \log^2\sqrt N)。 但常数巨大,和暴力算实际复杂度只相差常数= = 这个是可以扩展到组合数取模的~ my  code: my~~code: #include <stdio.h>#includ

独木舟(51Nod-1432)

题目 n个人,已知每个人体重。独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人。显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟? 输入 第一行包含两个正整数n (0<n<=10000)和m (0<m<=2000000000),表示人数和独木舟的承重。 接下来n行,每行一个正整数,表示每个人的体重。体重不超过1000000000,并且每个人的体

51nod 1847 奇怪的数学题

Description 给出 N,K ,请计算下面这个式子: ∑Ni=1∑Nj=1sgcd(i,j)k 其中,sgcd(i, j)表示(i, j)的所有公约数中第二大的,特殊地,如果gcd(i, j) = 1, 那么sgcd(i, j) = 0。 考虑到答案太大,请输出答案对2^32取模的结果. 1≤N≤109,1≤K≤50 样例解释: 因为gcd(i, j)=1时sgcd(i,j)

51nod-1050 循环最大字段和

N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a[n],a[1],a[2]这样的序列)。当所给的整数均为负数时和为0。 例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。 Input 第1行:整数序列的长

[1673]jsp在线考试管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点      JSP 在线考试管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使用java语言开发。 java Web 在线考试系统1 二、功能介绍 (1)管理员管理:对管理员信息进行添加

51Nod 1163 最高的奖励(贪心+优先队列 并差集)

题目链接:最高的奖励 题目大意 有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励。在结束时间之前完成该任务,就可以获得对应的奖励。完成每一个任务所需的时间都是1个单位时间。有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍。求能够获得的最高奖励。 Input 第1行:一个数N,表示任务的数量(2 <= N <= 50000) 第2 - N + 1行,每行2个数

51Nod 1376 最长递增子序列的数量(dp+树状数组)

题目链接 最长递增子序列的题做过不少,让求数量的还是第一次,O(n^2)的代码很好写,但数据范围50000,故无情超时,想了很久,总算有所得。 时间: O(nlog(n)) 空间: O(2*n) 思路 O(n^2)的思路中,每次求以第i个数结尾的最大长度和记录总数都要对前i-1个数进行遍历比较,如果能把这个比较过程转化为对前i项对求和,就可以用树状数组或线段数进行求和优化了。 重

51Nod 1022 石子归并 V2 (划分型dp四边形不等式优化)

石子归并以前做过好几次,是经典划分型dp题之一,一直用的O(n3)的正常dp方法,也从未想过该怎么去优化它。 直到昨天做这道题,n的范围由往常的100改为了1000,老方法 一直超时,苦不堪言,搜到有个四边形不等式的优化方法,看帖子,画式子,拉着学长帮忙推导,总算是大概弄明白了一点。 dp(i,j) = min(dp(i,k)+dp(k+1,j)) + w(i,j);(i < j

51nod 1264 线段相交(几何)

1264 线段相交 基准时间限制:1 秒 空间限制:131072 KB 分值: 0  难度:基础题  收藏  关注 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交)。 如果相交,输出"Yes",否则输出"No"。 Input 第1行:一个数T,表示输入的测试数量(1 <= T <= 1000)第2

51nod 1174 区间中最大的数(RMQ)

1174 区间中最大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0  难度:基础题  收藏  关注 给出一个有N个数的序列,编号0 - N - 1。进行Q次查询,查询编号i至j的所有数中,最大的数是多少。 例如: 1 7 6 3 1。i = 1, j = 3,对应的数为7 6 3,最大的数为7。(该问题也被称为RMQ问题)