由于3比较水略过
Task1:其实是HDU5265,很久以前某BC皮球出的题
这个你只要对所有
vi
按
P
取模,然后排个序,再枚举每个点,按照
Task2:其实是BZOJ4033,一道简单的树形dp
这个你只要考虑每条边在答案里的贡献即可,枚举
v
子树
所以是一个类似分组背包的东西咯,看起来复杂度像是
O(n∗k2)
,其实在dp的时候注意一点,在合并状态的时候第一个for只for到目前的
sz[v]
(即
to
左边的子树),即可保证复杂度是
O(n2)
关于证明:你可以把转移时两层for视为for两个子树里的节点(for size和for 节点次数相同所以可以这么考虑),那么关于节点
u
和节点
Task3:其实是BZOJ2667,一道不太难的贪心。
题解之前写过,不过有些不详细,但是有代码,所以可以见这个传送门
首先 n 那么小除了暴力枚举相信你也不知道可以干什么。。
枚举得到那些订单,那么收益那一维可以丢掉了。
现在问题变成了如何在
先按时间排个序。
然后我们可以转化一下问题,订单
q
变成
这样问题可以简化为对于每个订单
q
,是否满足在时间
接下来我们用两次贪心和一个公式解决这个问题。
第一个很显然的贪心:在一段时间
t
里,如果你要选择
想到这里,并且看到我切分 n=1 的那部分,相信你已经想到如何解决这个问题了:可以用一元二次不等式解决这个问题。
考虑
n=1
的时候,选
x
天提高产率,剩下
展开这个方程,你会发现它是开口向下的一元二次方程。结合check的时候,有一个要求
a
,我们就得到了一个一元二次不等式。直接用求根公式解掉它(大家数学都很好不用我说吧),别忘了判定
那么 n=1 的情况都解了, n≠1 的情况自然轻松又愉快了,不就是联立一些不等式嘛,小学生都会的事开玩笑嘿嘿嘿
现在你有很多的由一元二次不等式解出来的简单不等式
x∈[li,ri]
,你该如何选择?或者说这些区间可能并不完全包含,区间
i
右端点会小于区间
那么我们可以这样想,你并不是只在一个区间里提升产率,相反的,你有
n
个区间可以提升产率,如果当前的
所以第二个贪心水落石出了。我们每次按顺序扫描一下这些区间,贪心地取
x=minnj=iri
,从数学的角度说这个值无疑可以在满足所有右端点的情况下满足所取的值
x
最靠近(如果有的话)左端点大于
接下来的事情不用我说了,每次按如上决策砍掉一个订单(即在商品总量里去掉
那么,这道BZOJ上不超过100人的题,解了。