Codeforces Round #202 (Div. 2) D. Apple Tree (DFS + Math)
来源:互联网 发布:linux www服务器搭建 编辑:程序博客网 时间:2024/05/16 06:30
传送门:http://codeforces.com/contest/349/problem/D
题目大意:给出一棵树,每个叶子都有苹果,每个子树平衡的条件是各子树的重量相等,子树重量为该子树所有叶子的苹果树,求要使整棵树平衡最小要除掉的苹果树。
解题思路:假设答案为ans,根结点的分支数为n,那么根下面的每棵子树的重量为ans/n,每颗子树所占整棵树的比重为1/n,再假设根结点的某棵子树根节点的分支数为m,那么该根节点的某棵子树根节点下的每棵子树的重量占整棵树重量的比重为1/n/m,其他结点依次类推,那么通过依次DFS就可以把整棵树的每个叶子重量所占整棵树重量的比重求出来,按照比重也可以求出每个叶子重量比重所需的整棵树的重量,取最小值记为x,再求出全部叶子比重的最小公倍数lcm,若lcm>x,则需删除整棵树,否则寻找一个最接近x的lcm作为删除后树的重量,即x+x%lcm,那么ans=初始树的重量-删除后树的重量,还需判断二者的大小关系。写得时候好多坑点,累乘时候会有溢出的情况,用来比较的取最小值的初始值要足够大(最后一个测试数据就是坑这个)。
Code:
/* W w w mm mm 222222222 7777777777777 *//* W w w w m m m m 222 22 7777 *//* w w w w m m m m 22 777 *//* w w w w m m m m 22 77 *//* w w w w m m m m 222 77 *//* w w w w m m m m 222 77 *//* w w w w m m m m 222 77 *//* w w w w m m m m 222 77 *//* w w w w m m m m 222 77 *//* ww ww m mm m 222222222222222 77 *///#pragma comment(linker, "/STACK:102400000,102400000")//C++//int size = 256 << 20; // 256MB//char *p = (char*)malloc(size) + size;//__asm__("movl %0, %%esp\n" :: "r"(p));//G++#include <set>#include <map>#include <queue>#include <stack>#include <ctime>#include <deque>#include <cmath>#include <vector>#include <cctype>#include <string>#include <cctype>#include <cstdio>#include <cstdlib>#include <cstring>#include <sstream>#include <iostream>#include <algorithm>#define REP(i,s,t) for(int i=(s);i<=(t);i++)#define REP2(i,t,s) for(int i=(t);i>=(s);i--)using namespace std;typedef long long ll;typedef unsigned long long ull;typedef unsigned long ul;const int N=200005;const ll inf=999999999999999999;int n;ll a[N];vector<ll>G[N];bool vis[N];bool isleaf[N];ll Div[N];ll sum;ll x,lcm;bool FFFF;void dfs(int u){ if(FFFF)return; vis[u]=1; bool flag=false; int cnt=0; for(int i=0; i<G[u].size(); i++) { int v=G[u][i]; if(!vis[v]) { cnt++; } } for(int i=0; i<G[u].size(); i++) { int v=G[u][i]; if(!vis[v]) { flag=true; Div[v]=Div[u]*cnt; if(Div[v]>x) { FFFF=1; return; } dfs(v); } } if(!flag) { isleaf[u]=true; x=min(x,Div[u]*a[u]); lcm=lcm*Div[u]/__gcd(lcm,Div[u]); if(lcm>x) { //cout<<sum<<endl; FFFF=1; return; } }}void debug(){ REP(i,2,n) { if(isleaf[i]) { //printf("%d %I64d\n",i,Div[i]); cout<<i<<" "<<Div[i]<<endl; } }}void solve(){ Div[1]=1; x=inf; lcm=1; FFFF=0; dfs(1); if(FFFF) { cout<<sum<<endl; } else { ll ans=sum-x+x%lcm<=sum ? sum-x+x%lcm : sum; cout<<ans<<endl; }}int main(){#ifdef ONLINE_JUDGE#else freopen("test.in","r",stdin);#endif while(~scanf("%d",&n)) { sum=0; REP(i,1,n) { scanf("%I64d",&a[i]); sum+=a[i]; G[i].clear(); } REP(i,1,n-1) { int u,v; scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } memset(vis,0,sizeof(vis)); memset(isleaf,0,sizeof(isleaf)); solve(); } return 0;}
0 0
- Codeforces Round #202 (Div. 2) D. Apple Tree (DFS + Math)
- Codeforces Round #316 (Div. 2) D. Tree Requests (DFS序)
- Codeforces Round #316 (Div. 2) D. Tree Requests(DFS+状态压缩)
- *Codeforces Round #316 (Div. 2)- D. Tree Requests (dfs+二分)
- Codeforces Round #381 (Div. 2) D Alyona and a tree(DFS树上搞事)
- Codeforces Round #356 (Div. 2) D DFS
- Codeforces Round #357 (Div. 2) D DFS
- Codeforces Round #359 (Div. 2) D DFS
- Codeforces Round #363 (Div. 2) D DFS
- Codeforces Round #369 (Div. 2) D DFS
- Codeforces Beta Round #95 (Div. 2) -- D. Subway (DFS)
- Codeforces Round #313 (Div. 2) D Equivalent Strings(dfs)
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase(dfs)
- Codeforces Round #202 (Div. 1) B. Apple Tree CF348B
- Codeforces Round #316 (Div. 2)-D. Tree Requests-DFS+二分+hash
- Codeforces Round #316 (Div. 2) D. Tree Requests(DFS序+BFS+二分)
- Codeforces Round #363 (Div. 2) D. Fix a Tree __ dfs+剪枝+标记数组
- Codeforces Round #430 (Div. 2)C. Ilya And The Tree dfs D
- 关于软件基础中为什么使用二级指针的分析
- html5编程之用js设置背景颜色、字体颜色和行高
- poj2251
- ReactEurope Conf 参会感想
- Android Fragment 真正的完全解析(上)
- Codeforces Round #202 (Div. 2) D. Apple Tree (DFS + Math)
- 在linux上使用yum安装JDK
- OpenStack Hacker养成指南
- 前端样式--px与em使用选择
- Android 做fragmetn回退栈测试遇到的问题
- CentOS7 LNMP虚拟主机使用教程
- 黑马程序员--------线程
- ADN FDN SDN
- 【Servlet】把文件写到Respond输出流里面供用户下载