Noip 模拟 18 2018/11/6

T1:merchant
有 n 个物品,第 i 个物品有两个属性 k i , b i ki,bi ki,bi,表示它在时刻 x 的价值为 k i ∗ x + b i ki*x + bi kix+bi.
当前处于时刻 0,你可以选择不超过 m 个物品,使得存在某个整数时刻 t, t >= 0,你选择的所有物品的总价值大于等于 S.
给出 S,求 t 的最小值。

第一眼二分,但是一看,发现好像不单调
其实还是单调的
假设如果是单峰的情况(也就只有这种情况不单调),那么可以发现, t = 0 t=0 t=0 的时候一定是最优的,否则单调
那么就是需要特判一下 t = 0 t=0 t=0 的情况
判断时,需要选取前 m 大的,直接 sort 会 TLE(蒟蒻自带大常数),可以用 STL 中的 nth_element,期望 O ( n ) O(n) O(n) 的情况下给出前 m 大的

T2:排列计数 (permutation)
求有多少个 1 到 n 的排列满足恰有 k 对在排列中相邻的数满足前小于后,答案对 2012 取模。
发现 O ( n k ) O(nk) O(nk) 可以过
二维 dp f [ i ] [ j ] f[i][j] f[i][j] 表示选到第 i i i 个数,有 j j j 对的方案数
如果第 i i i 个产生了一个新的对,那么有 ( i − j ) (i-j) (ij) 个位置可以放
如果第 i i i 个没有产生了一个新的对,那么有 ( j + 1 ) (j+1) (j+1) 个位置可以放
所以 f [ i ] [ j ] = f [ i − 1 ] [ j ] ∗ ( j + 1 ) + f [ i − 1 ] [ j − 1 ] ∗ ( i − j ) f[i][j]=f[i-1][j]*(j+1)+f[i-1][j-1]*(i-j) f[i][j]=f[i1][j](j+1)+f[i1][j1](ij)

T3:最短路(shortest)
给出一个 n 个点 m 条边的无向图,n 个点的编号从 1~n,定义源点为 1。定义最短路树如下:从源点 1 经过边集 T 到任意一点 i 有且仅有一条路径,且这条路径是整个图 1 到 i 的最短路径,边集 T 构成最短路树。
给出最短路树,求对于除了源点 1 外的每个点 i,求最短路,要求不经过给出的最短路树上的 1 到 i 的路径的最后一条边。

可以发现,一条非树边只会对这条边的两个端点到他们的 lca 产生影响
d i s [ i ] dis[i] dis[i] 表示 i i i 的最短路径即树上路径
a n s [ i ] = m i n ( d i s [ j ] + d i s [ k ] + c o s t ( j , k ) − d i s [ i ] ) ans[i]=min(dis[j]+dis[k]+cost(j,k)-dis[i]) ans[i]=min(dis[j]+dis[k]+cost(j,k)dis[i]) ( j , k ) (j,k) (j,k) 为一条非树边且 k k k j j j i i i 的子节点
那么就将非树边按 d i s [ j ] + d i s [ k ] + c o s t ( j , k ) dis[j]+dis[k]+cost(j,k) dis[j]+dis[k]+cost(j,k) 排序,对于修改过的节点,用并查集压缩路径,保证每个节点只会被最小的值更新一次

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值