现在问题就转化成了:有一个点 (-p,p),只能朝着右上方移动,被限制在 y=x 和 y=x+2m 两条直线之间。现在有一些垂直或水平的线段,要求以最小代价选取一些线段,使得无论点如何移动,都会碰到至少 k 条线段。
不妨先做 k=1,相当于要选出若干条线段使得老鼠无法通过。考察一组合法线段的形态:
黑色实线是我们选出来的线段。可以发现,选出来的线段一定能围出一个分界线(图中绿色虚线),使得一边是老鼠可达的区域,另一边是老鼠不可达的区域。不妨给分界线定向,以与 y=x 的交点为起点,与 y=x+2m 的交点为终点。可以发现这样定向之后,沿着分界线走,向左或向上走时一定是沿着线段走的,向右或向下走时则不是(这是老鼠只能往右上走的限制自然形成的分界线)。不妨考察相邻线段之间的限制,钦定一条线段的起点为靠近 y=x 的那一端,终点为另一端,设 u 为第 i 条线段的终点,v 为第 i+1 条线段的起点,则可以分讨得出,u 和 v 之间的限制为 u_x\leq v_x\land u_y\geq v_y。
据此考虑图论建模,套路地将线段 i 拆成 in_i,out_i 两个点,从 in_i 向 out_i 连一条权值为 w_i 的边。对于任意两条线段 i,j,若 i 的终点 u 和 j 的起点 v 满足前文中的性质,则从 out_i 向 in_j 连一条权值为 0 的边。最后建立源点 S 和汇点 T,对于每条线段 i,若 i 的起点在 y=x 上,则从 S 向 in_i 连一条权值为 0 的边;若 i 的终点在 y=x+2m 上,则从 out_i 向 T 连一条权值为 0 的边。这样建图后,不难看出答案就是 S 到 T 的最短路。
考虑进一步推广到 k>1 的情况,此时我们需要选出 k 条不交的分界线。不难想到网络流,将连边改为:
从 out_i 向 in_j 连一条容量为 +\infty,权值为 0 的边。
从 S 向 in_i 连一条容量为 1,权值为 0 的边。
从 out_i 向 T 连一条容量为 1,权值为 0 的边。
此时从 S 到 T 的 1 个单位的流量就代表选出了一条分界线,那么我们限制最大流 \leq k,求最小费用最大流即可。具体来说,每一轮增广的流量为 1,那么我们增广 k 轮即可,最终费用就是答案,若无法增广 k 轮则无解。