第一道传说中的二维偏序!
题目本身是一个很经典的模型,事实上只要把n和m的数据范围缩成1000左右,就是一个o(nm)的DP入门题。然而这道题的数据范围显然这样时间和空间都会爆炸。于是经过观察我们发现k很小,是一个可以接受的数据范围,所以我们从k入手,只考虑有人的那些点。易得当(i,j)的答案可被(x,y)更新需满足的条件为i>=x且j>=y。我们开一个结构体记录一下有人的点的坐标,把他们按照x排序一下,就能保证x的单增。然后我们考虑y的顺序。首先肯定是要把y离散化一下,然后我们定义f[i]表示按x排序后前i个点里选一定要选点i时的最优解,可得方程为f[i]=max(f[j])+a[i](1<=j<=i)
,其中a[i]表示第i个点的人数,于是我们只要快速的求出满足y小于等于当前点中的f最大的点就行了。这里我们用树状数组来维护。
事实上根本不用f数组,直接用一个变量记录即可。
贴出代码:
|
|
一开始WA了好几次,发现都是n和k弄混了。。。。都换过来就A了QAQ