模拟7

T1

一眼看上去不可做的样子,于是考虑暴力一点的写法,先想\(a_i\leq300\)的,可以开个桶,然后每次查询要找的数存不存在,正解可以对这个进行优化,仍旧是检查要找的数存不存在,但是由于值域比较大所以要分开找,那么假设模数为\(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\)个就完了。

posted @ 2020-10-04 15:56  An_Fly  阅读(81)  评论(0编辑  收藏  举报