IOI2020第一轮选拔模拟5

今天又是三道难题.

T1:题解待更新

T2:题解待更新

T3:这是一道dp。

设dp[i][j]表示用了i种物品构成的体积为j是否可行,其中j用bitset存。

那么我们可以把所有物品种类按照v来分类。设s[v][k]表示在体积为v的物品中选出k种物品的最多选出的个数。s[v][k]就等于体积为v的c前k大的c的和。

求出了s之后,我们就可以求dp了。

先枚举v,再枚举i,然后枚举t,表示当前要新增t种物品。这是枚举一个j表示要从这t种物品中选出多少个,其中t<=j<=s[v][t],这个想一想就明白了。这时我们可以从dp[i]<<(j*v)转移到dp[i+t]。

但是这样的时间复杂度是过不了的,需要优化。

接着我们发现可以用ST表(就是倍增)来处理。我们在枚举完了v和i之后,对dp[i]建出一个ST表。设f[x][y]表示dp[i]<<(j*v)(x<=j<=x+2^y-1)的或起来的结果。处理好之后,在算t~s[v][t]的贡献的时候直接用ST表倍增算就好了。

在实现过程中,我们严格控制j<=L/v且y<=log(L/v),这样时间复杂度就是n/w*L^2的。因为此时我们把log(L/v)求和,发现它的近似值就是L。

发布了149 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/chiyankuan/article/details/103498322