【T1】
这题实际上是大水题……但是脑抽忽略了DP的阶段性特征,而且明明已经写好了搜索却没有想到直接改记忆化……讲的是对于
[1,n]
的数的所有排列,有
m
个限制,即令某个数要在另一个数后面,问如果违反最多
另外这题或许可以找强连通分量然后各种组合数学讨论?也许这样可以让范围更大点。
【T2】
先叙述下题意
解法1:考虑到这道题有这么多区间,就上分治。考虑区间
[l,r]
,先算出
f[l,mid]
和
f[mid+1,r]
,然后算跨越中点的方案数。
我们先将跨越中点的区间分成左右两段,即左端点到
mid
和
mid+1
到右端点,然后我们分类讨论
max
和
min
所对应的数在哪一边,根据对称性不妨只对两种情况讨论,即
max
和
min
的对应点都在左边,和
max
对应在左
min
对应在右。情况1和2,都可以化成类似的情况,枚举左端点
i
,然后考虑
解法2:这是在考场上想到的做法……我们差分一下,令
f(i)
表示
i
对答案的贡献,实质上就是所有以
那么我们考虑一下,如同解法1中的思路,我们考虑找一个
j1
,,令
aj1>ai
且
j1
最大,即最靠近
i
。然后相应找一个
【T3】
这题很劲啊,竟然是对随机数的稳定排序的期望……完全不会
不过解法很妙啊
先来描述下题意,就是用稳定排序排序若干个数
ai
,而
ai
是在
[li,ri]
区间内随机生成的一个整数,设排序完后
ai
的排名
pi
,且每个
ai
带有一个权值
si
,求
E[∑i=1nsipi]
。
先给几个数据范围:
对于40%的数据,n<=10,0<=li<=ri<=20
对于60%的数据,0<=li<=ri<=1000
对于100%的数据,n<=10^5,0<=li<=ri<=10^9,0<=si<=10^9
题意的实质是求每个数前期望不大于这个数(稳定排序),后期望有多少个数比这个数小,所以我们根据对称性先求每个数前面的部分,后面的倒过来再扫一遍就行了,两边是互相独立的。
考虑40%,可以用下DP,我们设
fi,j,k
表示
i
前面有
考虑60%,我们来建一个桶,扫的时候顺便记录下这个数对后面的数的期望的贡献。我们容易算出这个数再每个取值上都对后面(就是比它大的数)数的排名有
1ri−li+1
的期望值的贡献,于是综合考虑下(因为是整数),一个在
[li,ri]
间范围的数对于桶的贡献,相当于在桶中
[li,ri]
处加了一条直线(换句话说,等差数列),在
ri
以后,则增加值相当于
ri
处的增加。这里暴力维护即可。
其实100%算法和60%的非常接近,我们只要注意到区间加等差数列是容易用线段树维护的。我们维护一个公差
d
和首项
还有一种线段树的解法,只要注意到等差数列的差分是相等的,那么我们只需要对桶差分,然后我们立即发现这就是一个区间加修改与区间和查询的经典线段树……直接做就好了。
另外提到下题解中最后的问题,就是把整数域换为实数域,这种时候只要积分一下期望得到所加上去的不是等差数列,而是等差数列的平方,那么由平方的性质,我们可以差分两次然后就做完了。
纪中集训d1 提高A组模拟
最新推荐文章于 2020-01-16 14:53:23 发布