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

dp+贪心

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

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
typedef long long ll;
const int M=3e5+;
const ll INF=1e18;
ll ans,cnt,dp[M],a[M];
vector<int>g[M];
void dfs(int u,int f,int sign){
dp[u]=a[u];
for(int i=;i<g[u].size();i++){
int v=g[u][i];
if(v==f)
continue;
dfs(v,u,sign);
dp[u]+=max(0ll,dp[v]);
}
if(sign==){
ans=max(ans,dp[u]);
}
else if(dp[u]==ans) cnt++,dp[u]=-INF;
}
int main(){
int n;
ans=-INF;
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%I64d",&a[i]);
for(int u,v, i=;i<n;i++){
scanf("%d%d",&u,&v);
g[u].pb(v);
g[v].pb(u);
}
dfs(,,);
dfs(,,);
printf("%I64d %I64d",cnt*ans,cnt);
return ;
}

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(距离)相同的情况下要尽量小

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
typedef long long ll;
const int M=5e5+;
const ll INF=1e18;
vector<int>g[M];
int root,a[M],dp[][M];
ll ans;
void dfs(int u,int f){
dp[][u]=f;
for(int i=;i<;i++){
if(dp[i-][u]==-)
break;
dp[i][u]=dp[i-][dp[i-][u]];
}
ll deep;
ll minn=INF;
for(deep=;deep<&&dp[deep][u]!=-;deep++){
minn=min(minn,(deep+)*a[dp[deep][u]]+a[u]);
}
minn=min(minn,(deep+)*a[root]+a[u]);
if(f!=-)
ans+=minn;
for(int i=;i<g[u].size();i++){
int v=g[u][i];
if(v!=f)
dfs(v,u);
}
}
int main(){
int n;
root=;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]<a[root])
root=i;
} for(int u,v,i=;i<n;i++){
scanf("%d%d",&u,&v);
g[u].pb(v);
g[v].pb(u);
}
memset(dp,-,sizeof(dp));
dfs(root,-);
printf("%I64d\n",ans);
return ;
}

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. vue实现CheckBox与数组对象绑定

    实现需求: 实现一个简易的购物车,页面的表格展示data数据中的一个数组对象,并提供选中商品和全选商品checkbox复选框,页面实时显示选中商品的总金额: 分析: 1:使用v-for循环渲染arra ...

  2. 报错:Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2

    1.问题 写了一个简单的单层神经网络跑mnist手写数字集,结果每次fit都会出现dead kernel 很多dead kernel首先不要急着去网上搜dead kernel怎么解决,因为大家出现的原 ...

  3. python try-except处理异常的常用方法分析

    在写python程序时遇到异常想要进行处理时,可以使用try-except来处理,例如: try: 语句1 语句2 . . 语句N except .........: do something ... ...

  4. 题解P4201: [NOI2008]设计路线

    发现给出了一棵树, 不是树的情况直接输出-1 考虑进行DP, 设f[i][0/1/2]为i的子树中选小于等于0/1/2条边修路的方案数, 不妨对于一个节点, 先考虑正好相等的情况, 假设当前扫到了一个 ...

  5. struct寻址&for反汇编

    //for 反汇编 #include<stdio.h> int main() { ; ; ;i<;i++) { s=s+; } s=; ;i>=;i--) { s=s+; } ...

  6. SpringCloud学习之Hystrix请求熔断与服务降级(六)

    我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险 ...

  7. dirname() 函数返回路径中的目录部分。

    定义和用法 dirname() 函数返回路径中的目录部分. 语法 dirname(path) 参数 描述 path 必需.规定要检查的路径. 说明 path 参数是一个包含有指向一个文件的全路径的字符 ...

  8. nodejs(16)使用express.static快速托管静态资源

    const express = require('express') const app = express() // 步骤的拆解 const result = express.static('./v ...

  9. UVA 127 链表和栈的使用

    刘汝佳的题目感觉都是比较难以处理的,就像这道题目,一看数据简直觉得头大...加上这个英文我也看的想死 最后看别人博客的题意讲解才知道原来是要移牌. 然后如果熟练的使用stack和手写链表的话,这个题目 ...

  10. (转)mysql语句

    一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...