T1:merchant
有 n 个物品,第 i 个物品有两个属性
k
i
,
b
i
ki,bi
ki,bi,表示它在时刻 x 的价值为
k
i
∗
x
+
b
i
ki*x + bi
ki∗x+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)
(i−j) 个位置可以放
如果第
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[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 产生影响
设
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) 排序,对于修改过的节点,用并查集压缩路径,保证每个节点只会被最小的值更新一次