题目链接:P1973 [NOI2011] NOI 嘉年华
题解:
离散化每个活动时间后,用num[i][j]表示时间段[i,j]内的完整活动数量,用f[i][j]表示1-i时间内,第一个场所办了j个活动时,第二个场所能办的活动的最大数量,g[i][j]表示i-cnt时间内,第一个场所办了j个活动时,第二个场所能办的活动的最大数量,这样没有约束时就很好求了,有约束时我们枚举包含当前活动的区间左右端点,强制这段时间内活动都在第一个场地办,再枚举[1,左端点]和[右端点,时间结束]内在第一个场地办的活动数量,通过f和g函数就可以轻松求出第二个场地办的数量,此时复杂度是是O(N^5),我们需要剪枝下,观察转移方程ans[k]=max(ans[k],min(num[i][j]+l+r,f[i][l]+g[j][r])),因为f[i][l]和g[j][r]在i和j固定时都随着l或r递减,要使得min(num[i][j]+l+r,f[i][l]+g[j][r])最大,需要num[i][j]+l+r=f[i][l]+g[j][r],因为num[i][j]>=0,所以最优情况的l和r是满足g[j][r]>=r,f[i][l]>=l,再加上比较明显的剪枝,实际剪枝后只有O(n^3)左右
细节和注释见代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include