E:https://codeforces.com/contest/1088/problem/E

dp+贪心

题目大意:选择一个k并且选择k个连通块,
要求sigma a[i]/k最大,k尽量大,
对于给定的一颗树,输出最大的分数,不用约分的形式。
题目意思需要进一步解析,
假定有一个最大的连通块,那么
根据贪心的思想,肯定是选择这个连通块,但
又要求k大,所以把所有大小为这个连通块的dp值都计数一遍,
因为我们知道两个最大的连通块不可能有交集,
如果有,肯定是交集部分就是最大值部分,其余的部分都是零,
那么我们从下往上递归求解的过程中,其实也是一种贪心选取,
在计数完当前位置的dp值后,把该位置置为无穷小防止后面再被选取。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define pb push_back
  4. typedef long long ll;
  5. const int M=3e5+;
  6. const ll INF=1e18;
  7. ll ans,cnt,dp[M],a[M];
  8. vector<int>g[M];
  9. void dfs(int u,int f,int sign){
  10. dp[u]=a[u];
  11. for(int i=;i<g[u].size();i++){
  12. int v=g[u][i];
  13. if(v==f)
  14. continue;
  15. dfs(v,u,sign);
  16. dp[u]+=max(0ll,dp[v]);
  17. }
  18. if(sign==){
  19. ans=max(ans,dp[u]);
  20. }
  21. else if(dp[u]==ans)
  22.  
  23. cnt++,dp[u]=-INF;
  24. }
  25. int main(){
  26. int n;
  27. ans=-INF;
  28. scanf("%d",&n);
  29. for(int i=;i<=n;i++)
  30. scanf("%I64d",&a[i]);
  31. for(int u,v, i=;i<n;i++){
  32. scanf("%d%d",&u,&v);
  33. g[u].pb(v);
  34. g[v].pb(u);
  35. }
  36. dfs(,,);
  37. dfs(,,);
  38. printf("%I64d %I64d",cnt*ans,cnt);
  39. return ;
  40. }

F:https://codeforces.com/contest/1088/problem/F

题意:给你n个点的权值ai,一棵树,定义dist(a,b)为这棵树上两点的距离,且除了唯一的一个权值最小的点,每个点都必有一个相邻点权值比其小,要你构造一颗新的树,

   规定每加一条边u<-->v,w就加au+av+log2( dist(u,v) )* min( au , av )。求出最小的w。
   给出的树仅代表他们之间的距离!!!

分析:

   类似于MST的做法,考虑每次加入一个点i,贡献为ai+aj*(1+log2(距离))。最小化aj*(log2(距离))
   题目有给保证这棵树除了最小值节点,其他节点均存在一条邻边,使得边的另一点的值比它小
   所以以最小的点为根向下dfs,维护每个点2^k级祖先,存在这样一个性质:每个点的所属边必然只可能连向它的某个2^k级祖先或者根节点。
   因为要在这个点log2(距离)相同的情况下要尽量小

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define pb push_back
  4. typedef long long ll;
  5. const int M=5e5+;
  6. const ll INF=1e18;
  7. vector<int>g[M];
  8. int root,a[M],dp[][M];
  9. ll ans;
  10. void dfs(int u,int f){
  11. dp[][u]=f;
  12. for(int i=;i<;i++){
  13. if(dp[i-][u]==-)
  14. break;
  15. dp[i][u]=dp[i-][dp[i-][u]];
  16. }
  17. ll deep;
  18. ll minn=INF;
  19. for(deep=;deep<&&dp[deep][u]!=-;deep++){
  20. minn=min(minn,(deep+)*a[dp[deep][u]]+a[u]);
  21. }
  22. minn=min(minn,(deep+)*a[root]+a[u]);
  23. if(f!=-)
  24. ans+=minn;
  25. for(int i=;i<g[u].size();i++){
  26. int v=g[u][i];
  27. if(v!=f)
  28. dfs(v,u);
  29. }
  30. }
  31. int main(){
  32. int n;
  33. root=;
  34. scanf("%d",&n);
  35. for(int i=;i<=n;i++){
  36. scanf("%d",&a[i]);
  37. if(a[i]<a[root])
  38. root=i;
  39. }
  40.  
  41. for(int u,v,i=;i<n;i++){
  42. scanf("%d%d",&u,&v);
  43. g[u].pb(v);
  44. g[v].pb(u);
  45. }
  46. memset(dp,-,sizeof(dp));
  47. dfs(root,-);
  48. printf("%I64d\n",ans);
  49. return ;
  50. }

Codeforces Round #525 (Div. 2)后俩题的更多相关文章

  1. Codeforces Round #525 (Div. 2)

    Codeforces Round #525 (Div. 2) 哎,忍不住想吐槽一下,又要准备训练,又要做些无聊的事,弄得我都想退出了. 好好的训练不好么???? 只能做出两道水题,其实C题,感觉做出来 ...

  2. Codeforces Round #525 (Div. 2)题解

    Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...

  3. Codeforces Round #609 (Div. 2)前五题题解

    Codeforces Round #609 (Div. 2)前五题题解 补题补题…… C题写挂了好几个次,最后一题看了好久题解才懂……我太迟钝了…… 然后因为longlong调了半个小时…… A.Eq ...

  4. Codeforces Round #190 (Div. 2) 水果俩水题

    后天考试,今天做题,我真佩服自己... 这次又只A俩水题... orz各路神犇... 话说这次模拟题挺多... 半个多小时把前面俩水题做完,然后卡C,和往常一样,题目看懂做不出来... A: 算是模拟 ...

  5. Codeforces Round #525 (Div. 2) D. Ehab and another another xor problem(交互题 异或)

    题目 题意: 0≤a,b<2^30, 最多猜62次. 交互题,题目设定好a,b的值,要你去猜.要你通过输入 c d : 如果 a^c < b^d ,会反馈 -1 : 如果 a^c = b^ ...

  6. Codeforces Round #525 (Div. 2)D. Ehab and another another xor problem

    D. Ehab and another another xor problem 题目链接:https://codeforces.com/contest/1088/problem/D Descripti ...

  7. Codeforces Round #416 (Div. 2)(A,思维题,暴力,B,思维题,暴力)

    A. Vladik and Courtesy time limit per test:2 seconds memory limit per test:256 megabytes input:stand ...

  8. Codeforces Round #525 Div. 2 自闭记

    A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...

  9. Codeforces Round #316 (Div. 2) (ABC题)

    A - Elections 题意: 每一场城市选举的结果,第一关键字是票数(降序),第二关键字是序号(升序),第一位获得胜利. 最后的选举结果,第一关键字是获胜城市数(降序),第二关键字是序号(升序) ...

随机推荐

  1. 基于python的小波阈值去噪算法

    https://blog.csdn.net/alwaystry/article/details/52756051 发表于 2018-01-10 16:32:17 嵌入式设计应用 +关注 小波图像去噪原 ...

  2. Zookeeper--Zookeeper单机安装

    参考 https://www.cnblogs.com/lsdb/p/7297731.html https://zookeeper.apache.org/doc/r3.4.13/zookeeperSta ...

  3. soupui--替换整个case的url

    添加新的URL 随便进入一个case的[REST]step,添加新的url 更换URL 添加完之后双击想要更换url的case,在弹出的窗口中点击URL按钮 在弹出的set endpoint窗口中选择 ...

  4. Mysql--主库不停机搭建备库

    参考:http://blog.csdn.net/luozuolincool/article/details/38494817 mysqldump --skip-lock-tables --single ...

  5. 并发与高并发(十三)J.U.C之AQS

    前言 什么是AQS,是AbstractQueuedSynchronizer类的简称.J.U.C大大提高了并发的性能,而AQS又是J.U.S的核心. 主体概要 J.U.C之AQS介绍 J.U.C之AQS ...

  6. .NET微信开发 配置微信公众号基本配置的几种方法

    自己最近搞了公众号,记录一下. 目的就是为了在微信公众号里启用服务器配置. 微信文档 其实微信文档已经写得很清楚了,也很简单.(微信的目的就是它发送一个get请求,希望我们能接受一下,然后给微信回个数 ...

  7. mysql自关联和多表连接查询

    自关联操作         多表连接查询  inner  join 内查询   left  join  左查询   right  join  右查询                          ...

  8. for循环和增强for循环

  9. idea抛出异常:org.apache.shiro.authc.AuthenticationException

    问题描述 继续在ubuntu下折腾,终于将web项目的所有的东西配置好了,然后运行项目,满怀期待的心情登录系统的时候,突然出现了这个bug,吓得我差点从椅子上跳起来,这两天遇到的bug实在是太多了.. ...

  10. Android studio中2种build.gradle文件介绍

    根目录下的build.gradle通常不需要修改这个文件中的内容,除非需要添加一些全局的项目构建配置 buildscript { repositories { google() //声明代码托管仓库G ...