CF887

C.Ina of the Mountain

Problem - C - Codeforces

一个积木城堡,可以把任意一个积木的长度+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

Problem - D - Codeforces

\(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]