Noip 模拟 18 2018/11/6

本文解析了三道算法竞赛题目,包括商人问题中的最优时刻选择、排列计数的动态规划解法,以及最短路树问题的高效算法。通过深入分析,提供了清晰的思路和代码实现技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

T2:排列计数 (permutation)
求有多少个 1 到 n 的排列满足恰有 k 对在排列中相邻的数满足前小于后,答案对 2012 取模。
发现O(nk) O(nk)O(nk) 可以过
二维 dpf[i][j]f[i][j]f[i][j] 表示选到第i ii 个数,有j jj 对的方案数
如果第i ii 个产生了一个新的对,那么有(i−j) (i-j)(ij) 个位置可以放
如果第i ii 个没有产生了一个新的对,那么有(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 产生影响
dis[i] dis[i]dis[i] 表示i ii 的最短路径即树上路径
ans[i]=min(dis[j]+dis[k]+cost(j,k)−dis[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 kkj jji ii 的子节点
那么就将非树边按dis[j]+dis[k]+cost(j,k) dis[j]+dis[k]+cost(j,k)dis[j]+dis[k]+cost(j,k) 排序,对于修改过的节点,用并查集压缩路径,保证每个节点只会被最小的值更新一次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值