牛客网NOIP赛前集训营-提高组(第四场) C灭虫

题面
考虑DP
先把所有点离散化,设 v i v_i vi为离散化后第 i i i大的点的位置.按 p p p排序,设 f i , j f_{i,j} fi,j表示当前DP到第 i i i个点,最右端覆盖到 j j j的最大区间总长度
考虑第 i i i个区间往左和往右两种转移:
往左:
从大到小枚举 k k k,假设 k + 1 k+1 k+1 i − 1 i-1 i1的点全部往右喷, m a ma ma表示 k + 1 k+1 k+1 i i i的点的 r r r的最大值, l , p , r l,p,r l,p,r分别为当前点往左喷覆盖区间的左端点,喷洒点,向右喷洒的右端点,那么
f i , m a = m a x ( f k , l + v [ m a ] − v [ l ] ) f_{i,ma}=max(f_{k,l}+v[ma]-v[l]) fi,ma=max(fk,l+v[ma]v[l])
往右:
f i , j = m a x ( f i − 1 , l + v [ j ] − v [ l ] ) f_{i,j}=max(f_{i-1,l}+v[j]-v[l]) fi,j=max(fi1,l+v[j]v[l])
Code

你可能感兴趣的:(======算法======)