F. Ehab and a weird weight formula

题目链接https://codeforces.com/contest/1088/problem/F

题意:

给出一颗点有权值的树,满足只有一个点的权值最小,然后除开这个点,每个点都有一个权值比它更小的点与之相邻。

然后要求你重构这颗树,满足点权及边权和最小。

点权计算方法: au = au*num(num为与之相邻边的个数);

边权计算方法: e{u,v},we = dis(u,v)*min(au,av)  (dis(u,v)为given tree中u和v的距离)。

题解:

首先我们若以权值最小的点为根,我们会发现这棵树越往下,点的权值就会越大。

假定我们随便选择一对{u,v},那么对答案的贡献就是 au+av+log2(dis(u,v))*min(au,av),要让权值最小,假设我们先固定u来寻找v,由于受到v的权值和dis(u,v)的限制,所以我们可以考虑采用贪心的思想,对于一个点u,我们尽可能地向其祖先找点v,同时算一下距离。最终会找到一个最优解。

但是直接枚举太慢了,发现首先我们可以优化一下,就是每次往上找2的倍数个结点(因为题目中是log2(dis(u,v)) )。

由于av<au,所以每对{u,v}对答案的贡献就是au+(log2(dis(u,v))+1)*av。

最终总复杂度是O(nlogn)。

代码如下:

#include <bits/stdc++.h>
#define INF 999999999999
using namespace std; typedef long long ll ;
const int N =5e5+ ;
int a[N],dp[][N];
int n,st;
vector <int> vec[N];
ll ans;
void dfs(int u,int pa){
dp[][u]=pa;
for(int i=;i<;i++){
if(dp[i-][u]==-) break ;
dp[i][u]=dp[i-][dp[i-][u]];
}
ll minx = INF;
int i;
for(i=;i<;i++){
if(dp[i][u]==-) break ;
minx=min((ll)(i+)*a[dp[i][u]]+a[u],minx);
}
minx=min((ll)(i+)*a[st]+a[u],minx);
if(u!=st) ans+=minx;
for(auto v:vec[u]){
if(v!=pa) dfs(v,u);
}
}
int main(){
scanf("%d",&n);
st=;a[]=1e9+;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]<a[st])st=i;
}
for(int i=,u,v;i<n;i++){
scanf("%d%d",&u,&v);
vec[u].push_back(v);
vec[v].push_back(u);
}
memset(dp,-,sizeof(dp));
dfs(st,-);
printf("%I64d",ans);
return ;
}

最新文章

  1. Random随机类(11选5彩票)BigInteger大数据类(华为面试题1000的阶乘)
  2. Lucene.net 高亮显示搜索词
  3. app.js
  4. centos 安装 mysql 5.6和workbench
  5. execute、executeUpdate、executeQuery三者的区别(及返回值)
  6. 【编程之美】计算1-N中含1的个数
  7. sql server 分布式事务
  8. 将Cell中的视图取出传递到根视图
  9. 修改浏览器的User-Agent来伪装你的浏览器和操作系统
  10. 利用cxfreeze将Python 3.3打包成exe程序
  11. ABP公共结构
  12. 网络流解线性规划问题 BZOJ1061: [Noi2008]志愿者招募
  13. [Swift]LeetCode891. 子序列宽度之和 | Sum of Subsequence Widths
  14. nodejs eggjs框架 爬虫 readhub.me
  15. 51Nod 1265 四点共面(计算几何)
  16. char *s="string"和char s[]="string"的区别
  17. ICSharpCode.SharpZipLib 开源压缩库使用示例
  18. 微信Access Token 缓存方法
  19. POJ 2586 Y2K Accounting Bug 贪心 难度:2
  20. VMware新建虚拟机

热门文章

  1. ThinkPHP中的pathinfo模式和URL重写
  2. Apache Tomcat 整合
  3. 利用nodejs实现商品管理系统(二)
  4. 基于Ubuntu Server 16.04 LTS版本安装和部署Django之(四):安装MySQL数据库
  5. C#的内存管理
  6. 教程|要想Hadoop能够运行Python程序,就要会MRJob
  7. 利用devcon工具编写bat脚本一键控制系统设备,如开启关闭网卡
  8. ExtJS6.0扩展日期选择控件为也可以选择时间
  9. WebStorm强大的调试JavaScript功能(转载)
  10. tar 加密压缩和解密解压