jzoj2573 序列

    xiaoxiao2026-09-27  10

    题目大概

    给一个长度为N的序列,请删除尽量少的数,使得新序列中满足第I个数为I条件的数最多。

    Input

    第一行有一个正整数N。 第二行有N个正整数Ai,表示原序列中第I个数为Ai。

    Output

    只有一个整数ANS,表示最多能有多少个数满足条件。

    解法

    首先不难发现,i-ai<0的数是肯定不能归位的,然后我们忽略他. 最直观的一个想法就是动态规划,设 fi,j 为在原序列第i个位置,删了j个数的最大收益 然后也不难发现,删的个数肯定是某个i-ai,所以我们将方程改一改,变成 fi 表示将i放到原位所获得的最大收益. 不难看出有 fi=max(fk)+1 ,k表示上一个放到原位的是哪个位置

    然后我们再来看k需要满足什么条件 好像需要满足 i−a[i]>=k−a[k] 后面需要删的必须比前面的多,不然就会删过头… 然后没啥条件了啊… 那不是可以直接线段树维护差值,然后单点修改区间查询? YES这题我切了! b( ̄▽ ̄)d

    .

    . . .

    . .

    那你就太too young too simple了,难道你就没有发现,还有一个条件 a[i]>a[k] 吗 (代码打到一半) (°o°;)… 那怎么办,方了 (其实根据某神牛的分析,这个条件是完全可以忽略的,因为满足上面那个条件就必定满足这个条件,只不过线段树常数太大估计只能拿80分,我蒟蒻不会…)

    其实 fi=max(fk)+1 不就是等价于i-a[i]的最长不下降子序列么 但还有一种特殊情况就是,有数个为i的位置,这些位置必然有大有小,但我们只能取一个. 怎么办呢? 其实我们按倒序排一下他的i-a[i],这样每一种就最多会取下一个了 然后nlogn dp,就可以解决这题了

    转载请注明原文地址: https://ju.6miu.com/read-1312366.html
    最新回复(0)