codeforce23 E. Tree(高精度+树形dp)

E. Tree

状态表示:fu,jf_{u,j}fu,j表示以uuu节点的子树,uuu所在连通块大小为jjj时,并且没有算上uuu连通块的贡献的最大值
状态计算:
对于一棵子树vvv来说,显然可以有两种情况

  • uuu节点与vvv节点不连通:fu,j=fu,j×max⁡[fv,1→szv×(1→szv)]f_{u,j}=f_{u,j}×\max[f_{v,1\to sz_{v}}×(1\to sz_v)]fu,j=fu,j×max[fv,1szv×(1szv)]
  • uuu节点与vvv节点连通:fu,j+k=fu,j×fv,kf_{u,j+k}=f_{u,j}×f_{v,k}fu,j+k=fu,j×fv,k

而答案就是max⁡[f1,1→sz1×(1→sz1)]\max[f_{1,1\to sz_{1}}×(1\to sz_1)]max[f1,1sz1×(1sz1)](1是根节点,乘的这部分1→sz11\to sz_11sz1是该节点所在连通块的贡献)


你以为完了???不不不,还要写个高精度!!!

#define IO ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0)
#pragma GCC optimize(2)
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
//==========================================================高精度板子
struct bign
{int d[120], len;bign() { memset(d, 0, sizeof d); len = 1; }bign(int num) { *this = num; }bign(char* num) { *this = num; }bign operator=(const char* num){len = strlen(num);for (int i = 0; i < len; i++) d[i] = num[len - i - 1] - '0';return *this;}bign operator=(int num){char c[1010];sprintf(c, "%d", num);*this = c;return *this;}void clear(){while (len > 1 && !d[len - 1]) len--;}bign operator+(const bign& b){bign c; c.len = 0;for (int i = 0, t = 0; t || i < len || i < b.len; i++){if (i < len) t += d[i];if (i < b.len) t += b.d[i];c.d[c.len++] = t % 10;t /= 10;}return c;}bign operator-(const bign& b){bign c; c.len = 0;for (int i = 0, t = 0; i < len; i++){t += d[i];if (i < b.len) t -= b.d[i];c.d[c.len++] = (t + 10) % 10;if (t >= 0) t = 0;else t = -1;}c.clear();return c;}bign operator*(const bign& b){bign c; c.len = len + b.len;for (int i = 0; i < len; i++) for (int j = 0; j < b.len; j++) c.d[i + j] += d[i] * b.d[j];for (int i = 0; i < c.len - 1; i++) c.d[i + 1] += c.d[i] / 10, c.d[i] %= 10;c.clear();return c;}bool operator < (const bign& b){if (len != b.len) return len < b.len;for (int i = len - 1; i >= 0; i--)if (d[i] != b.d[i]) return d[i] < b.d[i];return false;}bool operator <= (const bign& b){if (len != b.len) return len < b.len;for (int i = len - 1; i >= 0; i--)if (d[i] != b.d[i]) return d[i] < b.d[i];return true;}bool operator > (const bign& b){if (len != b.len) return len > b.len;for (int i = len - 1; i >= 0; i--)if (d[i] != b.d[i]) return d[i] > b.d[i];return false;}bool operator >= (const bign& b){if (len != b.len) return len > b.len;for (int i = len - 1; i >= 0; i--)if (d[i] != b.d[i]) return d[i] > b.d[i];return true;}bign operator+=(const bign& b){*this = *this + b;return *this;}bign operator-=(const bign& b){*this = *this - b;return *this;}bign operator*=(const bign& b){*this = *this * b;return *this;}void print(){for (int i = len - 1; i >= 0; i--) std::cout << d[i];cout << '\n';}string str(){string res = "";for (int i = 0; i < len; i++) res = (char)(d[i] + '0') + res;return res;}
};
istream& operator >>(istream& in, bign& x)
{string s;in >> s;x = s.c_str();return in;
}
ostream& operator <<(ostream& out, bign& x)
{out << x.str();return out;
};
bign max(bign a,bign b)
{return a>b?a:b;
}
//==========================================================
constexpr int N=710;
int h[N],e[2*N],ne[2*N],idx;
void add(int a,int b){e[idx]=b,ne[idx]=h[a],h[a]=idx++;}
int sz[N],n;
bign f[N][N],ans;
void dfs(int u,int fa)
{f[u][1]=1;sz[u]=1;for(int i=h[u];i!=-1;i=ne[i]){int v=e[i];if(v==fa) continue;dfs(v,u);bign now=1;for(int j=1;j<=sz[v];j++) now=max(now,f[v][j]*bign(j));for(int j=sz[u];j>=1;j--){for(int k=sz[v];k>=1;k--)f[u][j+k]=max(f[u][j+k],f[u][j]*f[v][k]);  f[u][j]=f[u][j]*now;    }sz[u]+=sz[v];}for(int j=1;j<=sz[u];j++)ans=max(ans,f[u][j]*bign(j));
}
int main()
{cin>>n;memset(h,-1,sizeof h);for(int i=1;i<n;i++){int u,v;cin>>u>>v;add(u,v),add(v,u);}dfs(1,0);ans.print();return 0;
}

一下午搞了个这个题,顺便整理了一下高精度摸吧yep!
要加油哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

引子为什么写这篇文章呢&#xff1f;因为.NET Core的生态越来越好了&#xff01;之前玩转.net的时候操作Redis相信大伙都使用过一些组件&#xff0c;但都有一些缺点&#xff0c;如ServiceStack.Redis 是商业版&#xff0c;免费版有限制&#xff1b;StackExchange.Redis 是免费版…

CF891E-Lust【EGF】

正题 题目链接:https://www.luogu.com.cn/problem/CF891E 题目大意 nnn个数字的一个序列aia_iai​&#xff0c;每次随机选择一个让它减去一。然后贡献加上所有其他aia_iai​的乘积。 执行kkk次&#xff0c;求贡献答案。 1≤n≤5000,0≤ai,k≤1091\leq n\leq 5000,0\leq a_i,k…

P2495 [SDOI2011]消耗战(树形dp+虚树)

P2495 [SDOI2011]消耗战 树形dp 状态表示&#xff1a;fuf_ufu​表示以uuu为根的子树中&#xff0c;uuu节点与子树中的关键的“隔开”所需要的最小代价 状态转移&#xff1a; 考虑uuu的一个儿子vvv vvv是关键点&#xff1a;fufuwu→vf_uf_uw_{u\to v}fu​fu​wu→v​vvv不是关键…

牛客题霸 车站建造问题 C++题解/答案

题目描述 有108个村庄排在一条公路上&#xff0c;依次编号为0~108-1&#xff0c;相邻村庄距离为1&#xff0c;其中有n个村庄居住着牛牛&#xff0c;居住着牛牛的村庄从小到大依次为a0~an-1&#xff0c;其中保证a00. 现在需要建设车站&#xff0c;有两个要求必须被满足&#xf…

【.NET Core项目实战-统一认证平台】第四章 网关篇-数据库存储配置(2)

上篇文章我们介绍了如何扩展Ocelot网关&#xff0c;并实现数据库存储&#xff0c;然后测试了网关的路由功能&#xff0c;一切都是那么顺利&#xff0c;但是有一个问题未解决&#xff0c;就是如果网关配置信息发生变更时如何生效&#xff1f;以及我使用其他数据库存储如何快速实…

P5666-[CSP-S2019]树的重心【树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P5666 题目大意 给出nnn个点的一棵树&#xff0c;对于每条边割掉后两棵树重心编号和。 1≤T≤5,1≤n≤2999951\leq T\leq 5,1\leq n\leq 2999951≤T≤5,1≤n≤299995 解题思路 编号和&#xff0c;所以应该是要我们枚举点然后…

牛客题霸 牛妹的蛋糕 C++题解/答案

题目描述 众所周知&#xff0c;牛妹非常喜欢吃蛋糕。 第一天牛妹吃掉蛋糕总数三分之一&#xff08;向下取整&#xff09;多一个&#xff0c;第二天又将剩下的蛋糕吃掉三分之一&#xff08;向下取整&#xff09;多一个&#xff0c;以后每天吃掉前一天剩下的三分之一&#xff08…

计算机提示找不到vcruntime140.dll,无法继续执行代码怎么办?如何修复

“找不到vcruntime140.dll&#xff0c;无法继续执行代码”。这个问题可能会让你感到困惑&#xff0c;不知道如何解决。那么&#xff0c;vcruntime140.dll是什么文件&#xff1f;它为什么会丢失&#xff1f;又该如何解决这个问题呢&#xff1f;本文将为你详细介绍vcruntime140.d…

codeforces1486 F. Pairs of Paths(倍增+树上数数)

F. Pairs of Paths syksykCCC题解 iamhpp题解 首先说明&#xff0c;下面图片来自第一篇博客&#xff0c;下面代码照抄第二篇博客 对没有啥是自己写的&#xff08;因为我太菜~~ 从上图可以看出两条链只有一个交点可能有两种情况 交点是两条链的LCA交点是一条链的LCA而不是另一…

学习Raft算法的笔记

Raft是一种为了管理日志复制的一致性算法。它提供了和Paxos算法相同的功能和性能&#xff0c;但是它的算法结构和Paxos不同&#xff0c;使得Raft算法更加容易理解并且更容易构建实际的系统。为了提升可理解性&#xff0c;Raft将一致性算法分解成几个关键的模块&#xff0c;例如…

P3335-[ZJOI2013]蚂蚁寻路【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3335 题目大意 给出nmn\times mnm的网格&#xff0c;每个格子有权值。一个回路在格子的边上&#xff0c;要求有2k2\times k2k次左转&#xff0c;其他都是右转&#xff0c;且最后222次一定得是右转。 求包含的格子权值和最大…

牛客题霸 最少素数拆分 C++题解/答案

牛客题霸 最少素数拆分 C题解/答案 题目描述 牛牛刚刚学习了素数的定义&#xff0c;现在给定一个正整数N&#xff0c;牛牛希望知道N最少表示成多少个素数的和。 素数是指在大于1的自然数中&#xff0c;除了1和它本身以外不再有其他因数的自然数。 提示 哥德巴赫猜想&#xf…

LOJ dfs序1234

DFS 序 1 题目要求&#xff1a; ① uuu节点权值xxx ② 询问uuu子树权值和 uuu节点权值xxx &#xff1a;直接加uuu子树权值和&#xff1a;dfs序树状数组 LOJ提交代码 DFS 序 1 DFS 序 2 题目要求&#xff1a; ① uuu节点子树权值xxx ② 询问uuu子树权值和 uuu节点子树权值xxx&…

.NET Core 必备安全措施

.NET Core大大简化了.NET应用程序的开发。它的自动配置和启动依赖大大减少了开始一个应用所需的代码和配置量&#xff0c;本文目的是介绍如何创建更安全的.NET Core应用程序。1.在生产中使用HTTPS传输层安全性&#xff08;TLS&#xff09;是HTTPS的官方名称&#xff0c;你可能听…

CF1370F2-The Hidden Pair(Hard Version)【交互题,二分】

正题 题目链接:https://www.luogu.com.cn/problem/CF1370F2 题目大意 TTT组数据&#xff0c;给出nnn个点的一棵树&#xff0c;有两个隐藏的关键点。你每次可以询问一个点集&#xff0c;交互库会回答这个点集中的一个点满足它到两个关键点的距离和最小&#xff0c;和这个距离。…

牛客题霸题目及题解汇总

牛客题霸 单链表的选择排序 C题解/答案牛客题霸 最少素数拆分 C题解/答案牛客题霸 两数之和 C题解/答案牛客题霸 反转链表 C题解/答案牛客题霸 二分查找 C题解/答案牛客题霸 判断链表中是否有环 C题解/答案牛客题霸 转圈打印矩阵 C题解/答案牛客题霸 [斐波那契数列] C题解/答牛…

HDU5126 stars(4维偏序->cdq套cdq+树状数组)

stars 题目大意&#xff1a; 在一个三维空间当中&#xff0c;每次进行一个操作&#xff0c;添加一个点或者统计空间中的某一个长方体范围内的所有点 三维空间中我们用两个点即可确定一个长方体。 首先效仿平面二维数点的方法&#xff0c;根据容斥原理可以把询问拆分成8个以原点…

[翻译] C# 8.0 新特性

原文: Building C# 8.0[译注:原文主标题如此&#xff0c;但内容大部分为新特性介绍&#xff0c;所以意译标题为 "C# 8.0 新特性"]C# 的下一个主要版本是 8.0。我们已经为它工作了很长一段时间&#xff0c;即使我们构建并发布了次要版本 C# 7.1, 7.2 和 7.3&#xff0…

[蓝桥杯][2018年第九届真题]搭积木

[[蓝桥杯][2018年第九届真题]搭积木](https://www.dotcpp.com/oj/problem2292.html)题目&#xff1a; 小明对搭积木非常感兴趣。他的积木都是同样大小的正立方体。 在搭积木时&#xff0c;小明选取 m 块积木作为地基&#xff0c;将他们在桌子上一字排开&#xff0c;中间不留空…

NOI.AC#2007-light【根号分治】

正题 题目链接:http://noi.ac/problem/2007 题目大意 nnn个格子排成一排&#xff0c;每个格子有一个0/10/10/1和一个颜色。开始每个格子都是000&#xff0c;qqq次操作取反一个颜色的所有格子的0/10/10/1&#xff0c;然后询问111的格子构成的连通块数量。 1≤n,q≤1051\leq n,q…