C.Ina of the Mountain
一个积木城堡,可以把任意一个积木的长度+k任意次,求最少用多少横线可以覆盖积木城堡
做一个差分,得到一个数组d[]
,如果某个d[i]>0
,就会对答案产生+d[i]
的贡献,如果我们遇到两个相邻积木的长度分别为c[i-1]
和c[i]
,讨论:
c[i-1]<c[i]
,那么我们要么付出c[i]-c[i-1]
的代价,要么牺牲之前的某个位置(该位置满足c[k-1]>c[k]
)让\([k,i]\)这个区间上每个积木长度+k,付出的代价就是c[k]-c[k-1]+K
,用一个优先队列来取最小值即可c[i-1]>=c[i]
,维护优先队列的c[i]-c[i-1]+K
的最小值
D.Miriany and Matchstick
设\(f_{A/B}(i,j)\)表示第\(i\)个元素填\(A/B\),产生总共\(j\)个不同是否可行,\(f_{A/B}(i,j)=0/1\)
我们会发现\(f_{A/B}(i,?)\)中连续为1的\(j\)的段数并不多,暴力维护这些段即可
(即从bool f[A/B][i][j]
变成了set<segment> f[A/B][i]
)