题面
内容
你经营着 n 家酒馆,第 i 家酒馆可以花费 ci,j(0≤j≤k) 元将这家酒馆的档次设置为 j。
有 m 个人,每个人会在区间 [li,ri] 种选择一家档次最高的酒馆消费 j 元(j 是这家酒馆的档次),求合理设置最大每个酒馆的档次,使得收益最大化。
输入
输入第一行三个整数 n,m,k。
接下来 n 行,每行 k 个整数,第 i 行第 j 个数表示将酒馆 i 档次设置为 j 的花费,特别地,有 ci,0=0,但不会在输入数据中。
接下来 m 行,第 i 行两个整数 li,ri,表示第 i 个人选择的酒馆区间。
输出
输出一行一个整数,表示最大收益。
样例1
输入
4 5 3
2 4 5
3 4 5
2 2 4
1 2 3
3 3
2 2
2 3
2 4
1 2
输出
7
思路
类似地,每个人会去能去的档次最高的店,定义fi,j为只考虑[i,j]这个区间里的人所能得到的最大收益是什么,枚举标准最高的店k,定义gk,t为有t人到第k家店,t为能到达k的人数,那么fi,j=fi,k−1+fk+1,j+gk,t。
g表示合理选择第k家店的档次使得收益最大的收益。
t=Si,j−Si,k−1−Sk+1,j
接下来就是求出所有的gk,t,用ci表示i的花费,hj代表有j个人来的最高收益,也就是gk,j。
hj=max(i×j−ci),
i1<i2
i1∗j−ci1
i2∗j−ci2
2比1优的时候,往后2都会比1优,由于2的斜率比1斜率大,交点之后2更优
假如i1×j1−c1≥i2×j2−c2
这样处理完之后函数的斜率是单调递增的,
往后优解不一定是连续的,优先选斜率大的。
所以维护的是所有可能成为最优解的斜线,被覆盖的没必要维护(覆盖可以通过函数图像的交点位置来判断),维护可以用单调栈。
最后处理出来就是一个永远最优的分段函数。