为什么感觉越来越迷了X. X

原题:

有一棵点数为 N 的树,树边有边权。给你一个在 0~N 之内的正整数 K,你要在这棵树中选择 K 个点,将其染成黑色,并将其他的N-K 个点染成白色。将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间的距离的和的受益。问受益最大值是多少。

n<=2000

一眼树形DP,然而状态似乎不太好转移啊

我最开始是f[i][j]表示第i个点为根的子树中j个黑点到i的距离和,然后发现还有白点的距离和要计算,再开一个数组又可能出现两种方案不一样的情况

思考无果,只能膜拜别人的题解,最后看到萌帝的

正解是f[i][j]表示第i个点为根的子树中有j个黑点的最优答案,转移的时候因为不论是白点还是黑点想要和这个子树外的白点/黑点连接一定会经过i和某子节点之间的边,所以"(外面黑点个数*里面黑点个数+外面白点个数*里面白点个数)*这条边的权值"就是对答案的贡献

然后枚举子树中有k个黑点,子树选k个黑点的最优答案+这条边对答案的贡献就是以i为根的子树中的最优答案,酱紫就可以往上转移了

还有一个问题就是f不能在一开始就初始化成0,而是要初始化成-oo并在每次dfs开始的时候f[x][0]=f[x][1]=0,因为这是一个类似背包的东西,而且必须保证这个包装满

感觉好迷啊,关于这题的具体思路和上面提到的背包的问题如何往更广泛的应用去扩展感觉很困难啊

还要再多想/看

(也许是我状态不好X. X

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
ll rd(){ll z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
struct ddd{int nxt,y; ll v;}e[]; int lk[],ltp=;
inline void ist(int x,int y,ll z){ e[++ltp].nxt=lk[x],lk[x]=ltp,e[ltp].y=y,e[ltp].v=z;}
int n,m;
ll f[][],sz[];
void dfs(int x,int y){
sz[x]=,f[x][]=f[x][]=;
ll bwl=;
for(int i=lk[x];i;i=e[i].nxt)if(e[i].y!=y){
dfs(e[i].y,x);
sz[x]+=sz[e[i].y];
for(int j=sz[x];j>=;--j)
for(int k=;k<=sz[e[i].y] && k<=j;++k){
bwl=(ll)k*(m-k)+(ll)(sz[e[i].y]-k)*(n-m-sz[e[i].y]+k);
bwl=bwl*e[i].v+f[e[i].y][k];
f[x][j]=max(f[x][j],f[x][j-k]+bwl);
}
}
}
int main(){//freopen("ddd.in","r",stdin);
memset(f,-,sizeof(f));
cin>>n>>m;
ll l,r,v;
for(int i=;i<n;++i){
l=rd(),r=rd(),v=rd();
ist(l,r,v),ist(r,l,v);
}
dfs(,);
cout<<f[][m]<<endl;
return ;
}

【HAOI2015】 T1的更多相关文章

  1. 【HAOI2015】树上染色—树形dp

    [HAOI2015]树上染色 [题目描述]有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色.将所有点染色后,你会获得 ...

  2. 【HAOI2015】树上染色

    [HAOI2015]树上染色 这题思路好神仙啊,首先显然是树形dp,f[i][j]表示在以i为根的子树中选j个黑点对答案的贡献(并不是当前子树最大值),dp时只考虑i与儿子连边的贡献.此时(i,son ...

  3. 【POI】T1 特工 szp

    T1 特工szp [问题描述] Byteotian 中央情报局 (BIA) 雇佣了许多特工. 他们每个人的工作就是监视另一名特工.Byteasar 国王需要进行一次秘密行动,所以他要挑选尽量多的信得过 ...

  4. 【BZOJ】【4034】【HAOI2015】T2

    树链剖分/dfs序 树上单点修改+子树修改+链查询 其实用dfs序做也可以…… 其实树链剖分就是一个特殊的dfs序嘛= =所以树链剖分也可以搞子树-(Orz ZYF) 至于为什么……你看在做剖分的时候 ...

  5. BZOJ 4034 【HAOI2015】 T2

    Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所 ...

  6. 【HAOI2015】树上操作(树链剖分)

    题面 Description 有一棵点数为N的树,以点1为根,且树点有边权.然后有M个操作,分为三种: 操作1:把某个节点x的点权增加a. 操作2:把某个节点x为根的子树中所有点的点权都增加a. 操作 ...

  7. 【BZOJ4033】【HAOI2015】树上染色

    Description 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会 ...

  8. 【BZOJ4034】【HAOI2015】树上操作

    题目请自行查阅传送门. 典型的树剖题,线段树维护操作,记一下子树在线段树内范围即可. 时间复杂度:\( O(m \log^{2} n) \) #include <stdio.h> #def ...

  9. 【BZOJ4033】【HAOI2015】树上染色 树形DP

    题目描述 给你一棵\(n\)个点的树,你要把其中\(k\)个点染成黑色,剩下\(n-k\)个点染成白色.要求黑点两两之间的距离加上白点两两之间距离的和最大.问你最大的和是多少. \(n\leq 200 ...

随机推荐

  1. fzu1977

    题解: 和前两题差不多 只不过变成了有些一定走,有些不一定 代码: #include<cstdio> #include<cmath> #include<algorithm ...

  2. 【原创】QString 函数 replace()indexOf()、 lastindexOf()

    1.替换函数 示例: QString x = "Say yes!"; QString y = "no"; x.replace(, , y); // x == & ...

  3. day36 数据库表操作 数据类型 完整性约束

    今日内容 1.存储引擎表类型 2.数据类型 3.完整性约束 1.存储引擎表类型 指令: 1.show engines:#查看MySQL所有的引擎, 2.show variables like &quo ...

  4. java的类class 和对象object

    java 语言的源代码是以类为单位存放在文件中,已public修饰的类名须和存放这个类的源文件名一样.而 一个源文件中只能有一个public的类,类名的首字母通常为大写. 使用public修饰的类可以 ...

  5. SmtpClient SSL 发送邮件异常排查

    上周使用 SmtpCliet 发送邮件测试,在服务端配置 SSL 465 / 993 情况 ,客户端使用 465 SSL 端口发送邮件异常,测试代码如下: System.Net.ServicePoin ...

  6. 深入理解java虚拟机---java虚拟机内存管理(七)

    本地方法栈.java堆.方法区 本地方法栈在HotSpot版本内与java虚拟机栈是合二为一的.不单独区分本地方法栈.但是java虚拟机中是有这样一块区域的. 作用: 1.本地方法栈为虚拟机栈执行ja ...

  7. 5.7 C++函数调用操作符重载

    参考:http://www.weixueyuan.net/view/6385.html 总结: 需要以类成员函数的形式对函数调用操作符“()”进行重载. 只有常成员函数才能处理常对象,故我们依然在类中 ...

  8. Git超实用总结

    Git 是什么? Git 是一个分布式的代码管理容器,本地和远端都保有一份相同的代码. Git 仓库主要是由是三部分组成:本地代码,缓存区,提交历史,这几乎是所有操作的本质,但是为了文章更加简单易懂, ...

  9. fk makefile文件的一些问题

    除了要按具神说的makefile修改之外,还发现了另外一个问题: 不然就改成SACLIB=-L/usr/local/sac/lib

  10. DM浅尝辄止

    都是大佬的笔记啊啊啊啊 dialog management 对话状态维护(dialog state tracking, DST) 生成系统决策(dialog policy) 系统行为(dialog a ...