T1:merchant
有 n 个物品,第 i 个物品有两个属性 ki,biki,biki,bi,表示它在时刻 x 的价值为 ki∗x+biki*x + biki∗x+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)(i−j) 个位置可以放
如果第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[i−1][j]∗(j+1)+f[i−1][j−1]∗(i−j)
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 kk 或j jj 是i ii 的子节点
那么就将非树边按dis[j]+dis[k]+cost(j,k) dis[j]+dis[k]+cost(j,k)dis[j]+dis[k]+cost(j,k) 排序,对于修改过的节点,用并查集压缩路径,保证每个节点只会被最小的值更新一次