UVA - 1205 Color a Tree
大意就是给你一颗树,每个点有一个权值w[i],求一个排列使得 所有的父亲都在儿子前面 并且排列的权值最小。
排列的权值在这里定义为 Σ i * w[p[i]] ,其中p[i] 是排列第i个位置的元素。
然后我瞎jb胡了一个算法,对于每个子树维护一个 p[],表示只考虑子树内的元素的最优排列。显然我们只要把一个点的所有儿子都合并之后再把这个点放在排列的第一个位置就可以了。(可以证明这些元素再往上走的时候相对位置还是一样的)
问题是怎么合并。
其实这就是个dp,合并x和y子树的时候,f[i][j] 表示 用了x子树前i个元素,用了y子树前j个元素,此时到终点的最优值是多少,然后顺带记录一下方案就好啦。
(昨天+今天调了 3h+ 主要是因为 fill 用了 0x7f 一直没有察觉233333,导致max一直是127(真是醉了))
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1005;
int a[maxn][maxn],n,w[maxn],f[maxn][maxn];
int to[maxn*2],ne[maxn*2],hd[maxn],num,m;
bool nxt[maxn][maxn];
inline void add(int x,int y){ to[++num]=y,ne[num]=hd[x],hd[x]=num;} inline void init(){
memset(hd,0,sizeof(hd)),num=0;
memset(f,0x7f,sizeof(f));
memset(a,0,sizeof(a));
} inline void Merge(int x,int son){
int b[a[x][0]+a[son][0]+5],hzx[a[x][0]+5],hzs[a[son][0]+5];
hzx[a[x][0]+1]=0;
for(int i=a[x][0];i;i--) hzx[i]=hzx[i+1]+a[x][i];
hzs[a[son][0]+1]=0;
for(int i=a[son][0];i;i--) hzs[i]=hzs[i+1]+a[son][i]; f[a[x][0]][a[son][0]]=0;
for(int i=a[x][0];i>=0;i--)
for(int j=a[son][0];j>=0;j--){
if(i<a[x][0]&&f[i+1][j]<f[i][j]) f[i][j]=f[i+1][j],nxt[i][j]=1;
if(j<a[son][0]&&f[i][j+1]<f[i][j]) f[i][j]=f[i][j+1],nxt[i][j]=0;
f[i][j]+=hzx[i+1]+hzs[j+1];
} int now=0,nx=0,ny=0;
while(++now<=a[x][0]+a[son][0]){
if(nxt[nx][ny]) nx++,b[now]=a[x][nx];
else ny++,b[now]=a[son][ny];
} for(int i=0;i<=a[x][0];i++) fill(f[i],f[i]+a[son][0]+1,2000000000);
a[x][0]+=a[son][0];
for(int i=1;i<=a[x][0];i++) a[x][i]=b[i];
} void dfs(int x,int fa){
for(int i=hd[x];i;i=ne[i]) if(to[i]!=fa){
dfs(to[i],x);
Merge(x,to[i]);
} a[x][0]++;
for(int i=a[x][0];i>1;i--) a[x][i]=a[x][i-1];
a[x][1]=w[x];
} inline void calc(int x){
int ans=0;
for(int i=1;i<=n;i++) ans+=i*a[x][i];
printf("%d\n",ans);
} int main(){
int uu,vv,root;
while(scanf("%d%d",&n,&root)==2&&n&&root){
init();
for(int i=1;i<=n;i++) scanf("%d",w+i);
for(int i=1;i<n;i++) scanf("%d%d",&uu,&vv),add(uu,vv),add(vv,uu);
dfs(root,-1),calc(root);
}
return 0;
}
UVA - 1205 Color a Tree的更多相关文章
- UVA - 1625 Color Length[序列DP 代价计算技巧]
UVA - 1625 Color Length 白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束 和模拟赛那道环形DP很想,计算这 ...
- POJ 2054 Color a Tree
贪心.... Color a Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: ...
- Color a Tree[HDU1055]
Color a Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- UVA - 1625 Color Length[序列DP 提前计算代价]
UVA - 1625 Color Length 白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束 和模拟赛那道环形DP很想,计算这 ...
- UVA 1264 - Binary Search Tree(BST+计数)
UVA 1264 - Binary Search Tree 题目链接 题意:给定一个序列,插入二叉排序树,问有多少中序列插入后和这个树是同样的(包含原序列) 思路:先建树,然后dfs一遍,对于一个子树 ...
- Color a Tree HDU - 6241
/* 十分巧妙的二分 题意选最少的点涂色 使得满足输入信息: 1 x的子树涂色数不少于y 2 x的子树外面涂色数不少于y 我们若是把2转化到子树内最多涂色多少 就可以维护这个最小和最大 如果我们二分出 ...
- POJ 2054 Color a Tree解题报告
题干 Bob is very interested in the data structure of a tree. A tree is a directed graph in which a spe ...
- Color a Tree & 排列
Color a Tree 题目链接 好不可做?可以尝试一下DP贪心网络流.DP 似乎没法做,网络流也不太行,所以试一下贪心. 考虑全局中最大权值的那个点,如果它没父亲,那么一定会先选它:否则,选完它父 ...
- hdu 6241 Color a Tree 2017 CCPC 哈理工站 L
Bob intends to color the nodes of a tree with a pen. The tree consists of NN nodes. These nodes are ...
随机推荐
- TCP/IP网络编程之多线程服务端的实现(一)
为什么引入线程 为了实现服务端并发处理客户端请求,我们介绍了多进程模型.select和epoll,这三种办法各有优缺点.创建(复制)进程的工作本身会给操作系统带来相当沉重的负担.而且,每个进程有独立的 ...
- java多线程安全的问题
多线程中一定会遇到线程安全的问题,也就是在同一时间N条线程操作了同一变量,这个变量也叫做共享变量. 举例:(错误的示范) 设计一个投票系统,多个人可以对同一个的票数进行投票,下面看具体代码: 代码: ...
- NodeJs初学者经典入门解析
Node.js 是一个基于谷歌浏览器JavaScript执行环境建立的一个平台,让JavaScript可以脱离客户端浏览器运行,让 JavaScript具有服务器语言的能力.我们可以使用NodeJs方 ...
- 12 JVM 垃圾回收(下)
Java 虚拟机的堆划分 Java 虚拟机将堆划分为新生代和老年代.其中新生代又被划分为 Eden 区,以及两个大小相同的 Survivor 区. 默认情况下,Java 虚拟机采取一种动态分配的策略, ...
- PAT——乙级1008
1008 数组元素循环右移问题 (20 point(s)) 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A ...
- [转载]用等高线图(Contour maps)可视化多变量函数
https://blog.csdn.net/xlinsist/article/details/50920479 Overview 由于我们用手来画三维图像很困难,我们可以用等高线图来描述图像会更加简单 ...
- Vue在tradingView遇到的问题
K线图刷新或重新加载时闪白 首先需要了解的是,闪白是 iframe的机制 所以只要解决掉iframe就可以了 首先找到 charting_library.min.js 搜索 找到配置项 style=& ...
- Javascript 表达式和运算符
属性访问表达式: var o = {x:1, y:{z:3}};//示例对象 var a = [o, 4, [5,6]];//包含对象的数组 console.log(o["x"]) ...
- Puppet单机实战之Nginx代理Tomcat
author:JevonWei 版权声明:原创作品 blog:http://119.23.52.191/ --- 构建实战之Nginx代理Tomcat [root@node1 modules]# mk ...
- 【bzoj5018】[Snoi2017]英雄联盟 背包dp
题目描述 正在上大学的小皮球热爱英雄联盟这款游戏,而且打的很菜,被网友们戏称为「小学生」.现在,小皮球终于受不了网友们的嘲讽,决定变强了,他变强的方法就是:买皮肤!小皮球只会玩N个英雄,因此,他也只准 ...