模拟7

T1

一眼看上去不可做的样子,于是考虑暴力一点的写法,先想(a_ileq300)的,可以开个桶,然后每次查询要找的数存不存在,正解可以对这个进行优化,仍旧是检查要找的数存不存在,但是由于值域比较大所以要分开找,那么假设模数为(mod),可以将值域分为([k mod,(k+1)mod )),于是每段里边查询((k+1)mod)的前驱即可。

前驱可以被预处理出来,即对整个序列分块,然后大块直接查,小块暴力。设块大小为(q)值域为(V),那么时间复杂度为(n/qVlnV+m(q+n/q)),所以(q)应该取(sqrt{nlnn})

T2

直接对(y)排序进行(dp),看起来会好点,但是发现转移过程中的数组大小太大,开不下。。。。不过貌似可以拍成一维的卡过去,开到(5000)可以拿一半的分,但是还可以再开大点,如果开到最大也就是(5800)左右,就有(80),所以还是能开多大开多大。。

正解是对(x)从小到大排序,然后类似于记个数,不是(dp)因为会修改之前的状态,然后新加的这个点一定是第一个点或者是第二个点

证明:假设它不是前两个,那么一定存在一个数比它大,不满足当前数是最大的。

于是就考虑它是第一个还是第二个,然后(f[x][0/1])表示是向左偏还是向右偏,注意将第二次循环倒序即可做到(N^2)

T3

可以将序列看成(n)个白球,每种颜色(k-1)个球,然后就往上放就行了,注意要把让数列有唯一的生成方式,即计数的时候不要算重了,可以这样做,规定放白球的时候必须放在当前第一个空位,色球必须放在白球后的第一个空位,每次放球一次性放完,最后如果放了(i)个白球,(j-1)个色球,那颜色有(n-j+1)种选择,从(nk-i-(j-1)(k-1)-1)中挑(k-2)个就完了。

int - > long long 0 - > 100
原文地址:https://www.cnblogs.com/anyixing-fly/p/13767385.html