2018.4.7
离第二轮省选还有40天,看有没有希望冲进前40……
bzoj 4033 树上染色
题意
有一棵点数为N的树,树边有边权。给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色。将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间距离的和的收益。问收益最大值是多少。
题解
首先N和k范围是2000,看上去就像是一个树dp
但是,我想了一会感觉状态并不好找
一开始先想dp[i][j]表示以i为根的子树里有j个黑点,可能的最大答案是多少,但是会发现转移十分困难,因为从一个子树到另一个子树的转变中所有的边的贡献都会变化
然后就不难想到把记录的当前子树的答案改成记录当前子树里面所有的边对最终答案的贡献的最大可能值
dp的时候得枚举j,再枚举当前儿子结点对应子树的黑点个数t,然后
[dp[i][j]=max(dp[i][j],dp[i][j-t]+dp[nowson][t]+curedgevalue*(blackpointsinv*blackpointsoutside+whitepointsinv*whitepointsoutside))
]
于是就做完了。。。
bzoj 4010 菜肴制作
题意
给定一个有向图,不一定连通,我们要找出他的一个拓扑序,使得序号小的能够放在可能的所有位置中最前的那一位,也就是让1号尽量靠前,保证其尽量靠前的基础上再让2号尽量考前...
题解
显然是拓扑排序,只是顺序不太好找
原来我naive地以为每次有多个入度为0的结果时选编号最小的肯定最优,但是省选题显然不会这么幼稚,于是我就把自己卡掉了
例如:
应该是1 5 2 3 4
因为要让2尽量靠前
而我的贪心会使得答案变成1 3 5 2 4
但是不难发现也不能让大的放在前面
主要问题出在有个小的跟在大的后头,所以考虑反向建图,然后每次选最大的加进去,最后再反着输出
这是对的