DTOJ 4718. 管理

题意

一排 n n n 个物品,第 i i i 个物品权值为 a i a_i ai,请将其分成恰好 k k k 非空段,且让同段中 a i a_i ai​ 相同的二元组 ( i , j ) (i,j) (i,j) 尽量少。亦即,假设在第 i i i 段里权值为 j j j 物品有 c ( i , j ) c(i,j) c(i,j) 个,则请最小化 ∑ i = 1 k ∑ j ( c ( i , j ) 2 ) \sum\limits_{i=1}^k\sum\limits_{j}\binom{c(i,j)}{2} i=1kj(2c(i,j)).

20 % 20\% 20% 的数据, n ≤ 100 n\le 100 n100.

50 % 50\% 50% 的数据, n ≤ 5000 n\le 5000 n5000.

对另外 20 % 20\% 20% 的数据, a i ≤ 2 a_i\le 2 ai2.

对所有数据, 2 ≤ n ≤ 1 0 5 ,   1 ≤ k ≤ min ⁡ { n , 20 } ,   1 ≤ a i ≤ n 2\le n\le 10^5,\,1\le k\le \min\{n,20\},\,1\le a_i\le n 2n105,1kmin{n,20},1ain.

题解

套路题啊,可惜没见过。(其实应该要自己想出来的,本质上还是太菜了)
显然有DP:f[i][j]为前i个分为j段的最小代价,先枚举j,每层由f[x][j-1]转移到f[y][j],显然有决策单调性(反证法容易证明),但显然不能枚举x的时候直接向右推y(以前我所认识的决策单调性),然后就不会了。
不会就分治啊!(雾
考虑分治找出所有决策点,记目前要找的区间为[l,r],决策点范围为[x,y],找出mid的决策点p,可以分治到[l,mid-1,x,p]和[mid+1,r,p,y],找决策点时,由于最后一段的贡献不能直接算,先保证原本的贡献为x-1对l-1的贡献,然后扫一遍加一下即可,效率 O ( k n l o g n ) O(knlogn) O(knlogn)
以下是对决策单调性的小结(之前完全不会啊):
发现:我一般是感性认知+反证法,目前见过的题好像都OK。
实现:
1.类似双指针那样推,一般比较显然
2.如果最后一段的贡献可以O(1)直接计算,那么考虑每个点会作为后面哪段区间的最优决策点,用一个单调栈(或单调队列,视题目具体要求),每加入一个点,就和栈顶比一下,二分找到边界,查询的时候直接在里面找即可。
3.如果不能,比如本题,就用万能的分治了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值