[Codeforces]762F - Tree nesting】的更多相关文章

题目连接:678F - Lena and Queries 题目大意:给出两个树\(S,T\),问\(S\)中有多少连通子图与\(T\)同构.\(|S|\leq 1000,|T|\leq 12\) 题解:考虑树的最小表示法(有关知识可戳https://www.byvoid.com/zhs/blog/directed-tree-bracket-sequence),求出\(T\)以不同点为根时所有的子树状态 开始对树\(S\)进行\(DFS\),求出每个点的状态为\(t\)时的方案数,由于\(t\)还…
题目大意:给出一棵n个点的树和一棵m个点的树,问第一棵树有多少个连通子树与第二棵树同构.(n<=1000,m<=12) 做法:先找出第二棵树的重心(可能为边),以这个重心为根,可以避免重复计算,顺便对第二棵树的每个子树算出判同构的哈希值.枚举第一棵树的一个点/边与第二棵树的根对应,用f[i][j][k]表示以j为父亲的i的子树内,选出子树哈希值为k的方案数,合并的时候用状压DP.前两维合在一起是O(n)级别的,所以总复杂度是O(nm*2^m). 代码: #include<cstdio&g…
Tree nesting (CF762F) Description 有两个树 S.T,问 S 中有多少个互不相同的连通子图与 T 同构.由于答案 可能会很大,请输出答案模 1000000007 后的值. 两个连通子图 P.Q 称为互不相同的,当且仅当存在一个点 v∈S,使得 v∈P 与 v∈Q 恰好有一个成立. 图 G 与 H(在此题中 G 与 H 均为树)同构的定义为,存在一个一一映射 f, G 中任意一点 u 在 H 中都有唯一的点 v 与之对应:同样对 H 中任意一点 v 也有唯 一的在…
来自FallDream的博客,未经允许,请勿转载, 谢谢. 给你两棵树,一棵比较大(n<=1000),一棵比较小(m<=12) 问第一棵树中有多少个连通子树和第二棵同构. 答案取膜1e9+7 考虑在大树中随便选个根,然后在小的那棵那里枚举一个根作为大树中深度最小的节点(注意哈希判同构) 然后f[x][y]表示大树的x节点作为小树的y节点的方案数. 如果y是叶子结点,f[x][y]=1 否则要用x的儿子中的一些节点表示y的所有叶子节点. 考虑一个状压dp,g[i][s]表示前i个儿子表示了小树的…
链接:https://codeforces.com/problemset/problem/675/D 题意: 给一个二叉搜索树,一开始为空,不断插入数字,每次插入之后,询问他的父亲节点的权值 题解: 由二叉搜索树的有序性质, 他的父亲节点一定是和他向上和向下最接近的两个中,最后插入的那一个 那么我们对于每一个数字标记其插入的时间,然后维护一棵平衡二叉树用于插值和查找用即可 主要是记录一下我的伸展树代码 据说指针比数组快,但是我这里不仅数组比指针快,甚至用vector和用数组的速度也是一样的 指针…
http://codeforces.com/problemset/problem/570/D Tree Requests time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Roman planted a tree consisting of n vertices. Each vertex contains a lowercase…
http://codeforces.com/contest/570/problem/D 给一棵有根树(50w个点)(指定根是1号节点),每个点上有一个小写字母,然后有最多50w个询问,每个询问给出x和f,表示询问以x为根的子树,在第f层的所有节点上的字符能否组成一个回文串 首先树形转线性,把每个点按照DFS序重新标号,然后开个vector记下第i层都有哪些节点, 对于这一层的节点,维护一个前缀和,即某个字母出现过多少次, 这样对于某个询问x,f,我们能知道x为根的子树在线性数组中的序号范围, 然…
http://codeforces.com/problemset/problem/23/E 题意:给一个树,求砍断某些边,使得所有联通块大小的乘积最大.思路:f[i][j]代表当前把j个贡献给i的父亲(也就是不计入f[i][j])的最大乘积是多少,转移就是背包转移 记得最后统计答案的时候是f[i][j]*j #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #incl…
题目链接:Tree with Maximum Cost 题意:给定一棵树,树上每个顶点都有属性值ai,树的边权为1,求$\sum\limits_{i = 1}^{n} dist(i, v) \cdot a_i$,$dist(i, v) $为顶点i到顶点v的距离.该顶点v可以任意选择. 题解:O(n^2)的做法:从每个顶点跑一遍DFS,计算贡献值,并更新答案.(超时) 我们可以先计算出从顶点1跑的答案,发现顶点之间贡献的转移为$ans[u]=ans[fa]+(all-sum[u])-sum[u]$…
Tree Destruction 先把直径扣出来, 然后每个点都和直径的其中一端组合, 这样可以保证是最优的. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define PLI pair<LL, int> #define PII pair<int, int&…