地图上的 n个城市,由 n-1条道路连接,且任意两个城市连通。
除 1号城市之外的每个都有 一台计算机,安装软件号城市之外的每个都有 一台计算机,安装软件一个 自己的安装时间。
住在 1号城市的蒟蒻要给这 n-1台计算机装配软件,他可以沿着 n-1条道路 行走,每条道路花费的时间为 1。
蒟蒻在第 0时刻出发,他每走到一个城市就立给该的电脑装软件。
因为蒟蒻急着回家,所以他希望在最快到,因为蒟蒻急着回家,所以他希望在最快到 1号城市的基础上,所有电脑完 号城市的基础上,所有电脑完成。

【数据规模和约定】
对于 30%的数据,2<=n<=10,1<=每台计算机安装软件时间<=100;
对于 60%的数据,2<=n<=1000,1<=每台计算机安装软件时间<=100000;
对于 100%的数据,2<=n<=500000,1<=每台计算机安装软件的时间<=10^9。

注意一定要保证回去时间最小,图又是一颗树,所以每条边一定经过两次,而一旦到达一个点,一定要遍历完当前点的所有子树再返回。
这道题设L[k]为从k开始,按照最优决策遍历完所有k的子树,所有软件完成安装所需的最小时间。s[k]是k的子树大小。
注意到这样一个问题,若当前节点有两种选择,1和2,我们所需要做的决策就是
max(l[1],l[2]+2*s[1]),max(l[1]+2*s[2],l[2])这两个数哪一个小,就选小的决策,其中第一个代表先走1,第二个代表先走2。
假设一个节点有q个子树,我们做出了q个决策,那么显然,交换任意两个相邻的决策顺序不会影响其它决策,然后多做几次,选出一个最优的决策。
我的方法是证明在这q个子树中,第一步要么走l最大的,要么走l次大的。因为不走l最大的的原因是其size过大,而毫无疑问,这个事件对l次大的影响是最大的,所以结论成立。
然后按l排序,for i=2 to n,判断每个和第1个哪个更优,更优的就取走,bas+=2*s[k],剩下的没被取走的就作为第一个。

PS:这题略卡常,用vector存图会TLE

 #include<cstdio>
#include<algorithm>
#define maxn 500005
using namespace std;
int fa[maxn];
long long size[maxn],x[maxn],t[maxn],n,m,head[maxn],cnt,sf[maxn];
struct edge{int to,next;}e[*maxn];
void insert(int u,int v){
e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;
e[++cnt].to=u;e[cnt].next=head[v];head[v]=cnt;
}
struct sd{
int u;long long v;
bool operator < (const sd & g1) const{
return v>g1.v;}
}q[*maxn];
long long read(){
long long ret=;char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<='') ret=ret*+ch-'',ch=getchar();
return ret;
}
void dfs(int k,int f){
fa[k]=f;
for(int i=head[k];i;i=e[i].next){
if(e[i].to==f) continue;
dfs(e[i].to,k);
size[k]+=size[e[i].to];
}size[k]++;
}
void dfs2(int k,int bas){
long long h,tot=bas;
for(int i=head[k];i;i=e[i].next){
if(e[i].to==fa[k]) continue;
dfs2(e[i].to,tot);tot++;
q[tot].u=e[i].to;
q[tot].v=t[e[i].to];
}
t[k]=max(t[k],sf[k]);
if(!(tot-bas)) return;
sort(q+bas+,q+tot+);long long bsi=;
for(int i=bas+;i<=tot;i++){
if(q[bas+].v+*size[q[i].u]<q[i].v+*size[q[bas+].u]){
t[k]=max(t[k],q[i].v+bsi);
bsi+=*size[q[i].u];
}
else{
t[k]=max(t[k],q[bas+].v+bsi);
bsi+=*size[q[bas+].u];
q[bas+].v=q[i].v;q[bas+].u=q[i].u;
}
}
t[k]=max(t[k],t[q[bas+].u]+bsi);
}
int main(){
freopen("software.in","r",stdin);
freopen("software.out","w",stdout);
n=read();
for(int i=;i<=n;i++)sf[i]=read();long long a,b;
for(int i=;i<n;i++){
a=read();b=read();
insert(a,b);
}
dfs(,);
dfs2(,);
printf("%lld\n",t[]);
return ;
}

noip模拟赛 软件software的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  9. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

随机推荐

  1. Java中的public、protected、default和private的区别

    (1)       对于public修饰符,它具有最大的访问权限,可以访问任何一个在CLASSPATH下的类.接口.异常等.它往往用于对外的情况,也就是对象或类对外的一种接口的形式. (2)      ...

  2. 如何使用adb命令查看android中的数据库

    1,进入到控制台中,输入adb shell,进入到命令模式的环境中 2,输入:cd /data/data/ 3, 选择你所在的数据库文件,比如我的com.android.homework, 输入命令: ...

  3. Linux进程控制(二)

    1. 进程的创建 Linux下有四类创建子进程的函数:system(),fork(),exec*(),popen() 1.1. system函数 原型: #include <stdlib.h&g ...

  4. git项目实战常用workflow和命令

    一个从无到有的项目大体经历-创建项目目录,创建repo,配置过滤集,配置git user,导入已有基础代码入库,将库放到central去,建立分支,修改代码,checkin代码,分支上 测试验证代码, ...

  5. mysql-主从复制(一)

    1)用户授权 grant all privileges on share.* to 'abc'@'192.168.1.105' identified by '123456' 2)开启mysql的bin ...

  6. css3用AnimationEnd判断动画是否完成, css3在动画完成后执行事件

    用css3的animation完成一个动画,当只有这个动画完成时才执行令一个事件,比如让动画保持在终止的状态或其他一些事件.我们该怎么办呢. 第一种方法: 用计时器,设定一个和动画时长一样的time, ...

  7. Mysql自定义函数之------------This function has none of DETERMINISTIC, NO SQL解决办法

    This function has none of DETERMINISTIC, NO SQL解决办法 创建存储过程时 出错信息: ERROR 1418 (HY000): This function ...

  8. Python [Leetcode 121]Best Time to Buy and Sell Stock

    题目描述: Say you have an array for which the ith element is the price of a given stock on day i. If you ...

  9. Java正则表达式之语法规则

    正则表达式是一种强大而灵活的文本处理工具,使用正则表达式能够以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索.一旦找到了匹配这些模式的部分,就能够随心所欲地它们进行处理.正则表达式提供了一种 ...

  10. CentOS 6安装mock

    最近工作中需要用到mock,这里介绍两种安装方式.本文的环境为CentOS 6.4 x86_64. 一,使用yum安装mock 安装第三方yum源RPMForge Centos5 64位 wget h ...