题目链接

Problem Description
> Stormtroopers were the assault/policing troops of the Galactic Empire. Dissenting citizens referred to them as bucketheads, a derogatory nickname inspired by the bucket-shaped helmets of stormtroopers. They wore white armor made from plastoid over a black body glove which, in addition to creating an imposing image, was outfitted with a wide array of survival equipment and temperature controls that allowed its wearer to survive in most environments, and were designed to disperse blaster bolt energy. As members of the Stormtrooper Corps, an independent branch that operated under the Imperial Army, stormtroopers represented the backbone of the Imperial Military—trained for total obedience to the command hierarchy, as well as absolute loyalty to Emperor Sheev Palpatine and the Imperial regime. Stormtroopers were trained at Imperial Academies, and used a variety of weapons.
>
> --- Wookieepedia

Though being cruel and merciless in the battlefields, the total obedience to the command hierarchy makes message delivering between Stormtroopers quite inefficient, which finally caused the escape of Luke Skywalker, the destroy of the Death Star, and the collapse of the Galactic Empire.

In particular, the hierarchy of Stormtroopers is defined by a *binary tree*. Everyone in the tree has at most two direct subordinates and exactly one direct leader, except the first (numbered 1) Stormtrooper, who only obey the order of the Emperor.

It has been a time-consuming task for the Stormtroopers to input messages into his own log system. Suppose that the i-th Stormtrooper has a message of length ai, which means that it costs ai time to input this message into a log system. Everyone in the hierarchy has the mission of collecting all messages from his subordinates (a direct or indirect children in the tree) and input thses messages and his own message into his own log system.

Everyone in the hierarchy wants to optimize the process of inputting. First of all, everyone collects the messages from all his subordinates. For a Stormtrooper, starting from time 0, choose a message and input it into the log system. This process proceeds until all messages from his subordinates and his own message have been input into the log system. If a message is input at time t, it will induce t units of penalty.

For every Stormtrooper in the tree, you should find the minimum penalty.

 
Input
The first line of the input contains an integer T, denoting the number of test cases.

In each case, there are a number n (1≤n≤105) in the first line, denoting the size of the tree.

The next line contains n integers, the i-th integer denotes ai (0≤ai≤108), the i-th Stormtrooper’s message length.

The following n−1 lines describe the edges of the tree. Each line contains two integers u,v (1≤u,v≤n), denoting there is an edge connecting u and v.

 
 
Output
For each test case, output n space-separated integers in a line representing the answer. i-th number is the minimum penalty of gathering messages for i-th Stormtrooper.
 
 
Sample Input
1
3
1 2 3
1 2
2 3
 
 
Sample Output
10 7 3
 
 
题意:该校出题题目太长了,而且表达的不是很清楚,太难理解了。 该题简而言之:有一个由 n 个节点构成的二叉树,每个节点上有一个权值wi,求所有节点的一个计算值。对于某个节点来说,以它为根节点的子树的所有的节点的值构成的序列的前缀和的和,即为这个节点的计算值,对于每个节点求最小的计算值,那么很明显贪心,把这个序列从小到大排序,然后再就算前缀和的和。
 
思路:官方题解说是启发式合并,我不懂什么是启发式,我看了别人写的代码后,我的理解是对于左右子树合并时,把小的子树合并到大的子树中去,这样复杂度较小,我觉得这个过程就是应用了启发式思想。 本题思路没什么好说的,只想简单说一下合并,本题中的计算是由树状数组完成的,对于每次在已有节点上添加一个节点x时,这些数的前缀和的和变化为:tmp+=大于w[x]的数个数*w[x]+w[x]+小于w[x]的所有数的和。
 
代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
typedef long long LL;
const int N=1e5+;
int w[N];
int val[N],id[N];
int sz[N],lson[N],rson[N],tot;
vector<int>e[N];
LL num[N],sum[N];
LL ans[N],tmp; int calSize(int now,int pre)
{
sz[now]=;
for(int j=;j<e[now].size();j++)
{
int to=e[now][j];
if(to==pre) continue;
if(!lson[now]) lson[now]=to;
else rson[now]=to;
sz[now]+=calSize(to,now);
}
if(lson[now]&&rson[now]&&sz[lson[now]]>sz[rson[now]])
swap(lson[now],rson[now]);
return sz[now];
}
int lowbit(int x)
{
return x&(-x);
}
void update(LL *a,int x,int y)
{
while(x<=tot)
{
a[x]+=(LL)y;
x+=lowbit(x);
}
}
LL query(LL *a,int x)
{
LL r=;
while(x)
{
r+=a[x];
x-=lowbit(x);
}
return r;
} void add(int x)
{
tmp+=(query(num,tot)-query(num,id[x]))*(LL)w[x]+(LL)w[x];
tmp+=query(sum,id[x]);
update(num,id[x],);
update(sum,id[x],w[x]);
}
void del(int x)
{
update(num,id[x],-);
update(sum,id[x],-w[x]);
tmp-=(query(num,tot)-query(num,id[x]))*(LL)w[x]+(LL)w[x];
tmp-=query(sum,id[x]);
}
void cle(int x)
{
del(x);
if(lson[x]) cle(lson[x]);
if(rson[x]) cle(rson[x]);
}
void validate(int x)
{
add(x);
if(lson[x]) validate(lson[x]);
if(rson[x]) validate(rson[x]);
}
void dfs(int now)
{
if(!lson[now])
{
ans[now]=(LL)w[now];
add(now);
return ;
}
dfs(lson[now]);
if(rson[now])
{
cle(lson[now]);
dfs(rson[now]);
validate(lson[now]);
}
add(now);
ans[now]=tmp;
}
int main()
{
int T; cin>>T;
while(T--)
{
int n; scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&w[i]);
val[i]=w[i];
e[i].clear();
num[i]=sum[i]=;
lson[i]=rson[i]=;
}
sort(val+,val+n+);
tot=unique(val+,val+n+)-val-;
for(int i=;i<=n;i++)
{
id[i]=lower_bound(val+,val+tot+,w[i])-val;
}
for(int i=;i<n;i++)
{
int u,v; scanf("%d%d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
calSize(,-);
tmp=;
dfs();
for(int i=;i<=n;i++)
printf("%lld ",ans[i]);
puts("");
}
return ;
}

hdu 6133---Army Formations(启发式合并+树状数组)的更多相关文章

  1. HDU 5997 rausen loves cakes(启发式合并 + 树状数组统计答案)

    题目链接  rausen loves cakes 题意  给出一个序列和若干次修改和查询.修改为把序列中所有颜色为$x$的修改为$y$, 查询为询问当前$[x, y]$对应的区间中有多少连续颜色段. ...

  2. #6041. 「雅礼集训 2017 Day7」事情的相似度 [set启发式合并+树状数组扫描线]

    SAM 两个前缀的最长后缀等价于两个点的 \(len_{lca}\) , 题目转化为求 \(l \leq x , y \leq r\) , \(max\{len_{lca(x,y)}\}\) // p ...

  3. hdu 5869 区间不同GCD个数(树状数组)

    Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  4. hdu 6203 ping ping ping(LCA+树状数组)

    hdu 6203 ping ping ping(LCA+树状数组) 题意:给一棵树,有m条路径,问至少删除多少个点使得这些路径都不连通 \(1 <= n <= 1e4\) \(1 < ...

  5. hdu 1394 Minimum Inversion Number(树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给你一个0 — n-1的排列,对于这个排列你可以将第一个元素放到最后一个,问你可能得到的最 ...

  6. HDU 5792 World is Exploding (树状数组)

    World is Exploding 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5792 Description Given a sequence ...

  7. HDU 5773 The All-purpose Zero(树状数组)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5773 [题目大意] 给出一个非负整数序列,其中的0可以替换成任意整数,问替换后的最长严格上升序列长 ...

  8. POJ 3928 &amp; hdu 2492 &amp; Uva1428 PingPong 【树状数组】

    Ping pong                                                   Time Limit: 2000/1000 MS (Java/Others)   ...

  9. BZOJ.3653.谈笑风生(长链剖分/线段树合并/树状数组)

    BZOJ 洛谷 \(Description\) 给定一棵树,每次询问给定\(p,k\),求满足\(p,a\)都是\(b\)的祖先,且\(p,a\)距离不超过\(k\)的三元组\(p,a,b\)个数. ...

随机推荐

  1. 【canvas学习笔记一】基本认识

    <canvas>标签定义了一块画布,画布可以在网页中绘制2D和3D图象,现在先学习如何绘制2D图象,绘制3D图象属于WebGL的内容(也就是网页版的OpenGL,3D图形接口). 属性 & ...

  2. (转)Java线程:新特征-原子量,障碍器

    Java线程:新特征-原子量   所谓的原子量即操作变量的操作是“原子的”,该操作不可再分,因此是线程安全的.   为何要使用原子变量呢,原因是多个线程对单个变量操作也会引起一些问题.在Java5之前 ...

  3. css实现鼠标悬浮字体流光背景模糊效果

    原文地址:→看过来 写在前面 有的时候感觉写点小玩意儿挺开心的,还能实践很多的小知识点,所以这次学着写了个有趣的鼠标悬浮模糊效果,只使用了css额. 效果图 源码地址→传送门 预览地址→传送门 小知识 ...

  4. Python简易爬虫爬取百度贴吧图片

    通过python 来实现这样一个简单的爬虫功能,把我们想要的图片爬取到本地.(Python版本为3.6.0) 一.获取整个页面数据 def getHtml(url): page=urllib.requ ...

  5. ueditor编辑器使用总结

    ueditor使用小结 一.简介 ueditor是百度编辑器,官网地址:http://ueditor.baidu.com/website/ 完整的功能演示,可以参考:http://ueditor.ba ...

  6. 初学Python(九)——函数

    初学Python(九)--函数 初学Python,主要整理一些学习到的知识点,这次是函数. 函数定义: # -*- coding:utf-8 -*- #函数的定义 def my_function(x) ...

  7. Android保存图片到本地相册

    好久没有写东西了.备份下知识吧.免得忘记了 . 首先贴一段代码 --  这个是先生成一个本地的路径,将图片保存到这个文件中,然后扫描下sd卡.让系统相册重新加载下 .缺点就是只能保存到DCIM的文 件 ...

  8. swift AVAudioPlayer播放音频时声音太小

    设置下声音输出的扬声器就行了 代码如下 do { try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionP ...

  9. 七月SSL行业新闻回顾

    大事件一:被泄露的私钥和基于假私钥进行的撤回 上个月,我们报告说Spotify和Cisco在应用程序中捆绑了有效证书的私钥.这些证书将根据基准要求被撤销,但应用程序不是泄露私钥的唯一来源.Koen R ...

  10. Eclipse中将hadoop项目放在集群中运行

    1.加入配置文件到项目源码目录下(src) <configuration> <property> <name>mapreduce.framework.name< ...