ZROI 19.08.11模拟赛

Posted suwakow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZROI 19.08.11模拟赛相关的知识,希望对你有一定的参考价值。

传送门

写在前面:为了保护正睿题目版权,这里不放题面,只写题解。


技术图片

dlstql,wsl


  • A

\(10pts:\)

\(a=100,T=100\),对每个排列构造一个反的,一步到位即可。

\(20pts:\)

\(a=50\),构造\(1\)和所有元素交换的排列,实现交换\((v,u)\)可以令两者分别与\(1\)交换,选择排序即可。

\(40pts:\)

\(a=30\),构造前\(25\)个元素与\(1\)交换的排列,另有一个排列交换前\(25\)个与后\(25\)个元素。

\(a=20\)时可以分三块处理。

\(100pts:\)

考虑\(a=2\),步数不限时怎么做。

只需构造一个\(2-n\)的环,再构造一个\(1-2\)的交换。

每次可以把位置\(1\)上的数放到它在循环里的对应位置。

但是一步的期望是\(\fracn2\)次操作,实际步数无法承受。

考虑倍增。由于\(a=5\)的限制,难以二进制倍增,可以考虑三进制倍增。

【update:经过同学们反映,必须用dls的\(\1,3,8,20\\)才能获得满分】

一步的期望大约是\(4.5\)次操作,随机数据下可以通过。


  • B

欣赏一下swk的神奇错误:

\(\frac1n \sum(a_i-\frac 1n \sum a_i)^2=\frac1n(\sum a_i^2+\frac(1-2n)(\sum a_i)^2n^2)\)

/cy/qiang

显然方差直接算是不可做的,考虑拆一下式子。

\(\frac1n \sum(a_i-\frac 1n \sum a_i)^2=\frac1n\sum(a_i^2-\frac 2a_in\sum a_i +\frac1n^2(\sum a_i)^2)=\frac 1n (\sum a_i^2-\frac1n (\sum a_i)^2)\)

即,对于一个确定的大小为\(n\)的集合,它的方差为\(\frac 1n (\sum a_i^2-\frac1n (\sum a_i)^2)\)

如果只需要算一个方差,有上式就够用了。然而此处我们要算的是区间内所有子集的方差。

\(\frac 1n (\sum a_i^2-\frac1n (\sum a_i)^2)=\fracn-1n^2\sum a_i^2-\frac1n^2\sum_i\not=ja_ia_j\)

设每次求取区间长度为\(l\),枚举子集大小\(n\),考虑区间内每个\(a_i\)单独出现的次数,即\(l\)个数中选\(n\)个,其中\(a_i\)必选的方案数,等价于\(l-1\)个数中选\(n-1\)个的方案数。

同样,区间内每对\(a_i,a_j\)出现的次数为\(l-2\)个数中选\(n-2\)个的方案数。

由此得到长度为\(l\)的区间所有子集的方差和\(=\sum_n=1^l\fracn-1n^2(^l-1_n-1)\sum a_i^2-\sum_n=1^l\frac1n^2(^l-2_n-2)\sum_i\not=ja_ia_j\)

发现枚举\(a_i,a_j\)比较困难,重新将其转化为完全平方的形式,得到\(\sum_n=1^l\fracn-1n^2(^l-1_n-1)\sum a_i^2-\sum_n=1^l\frac1n^2(^l-2_n-2)[(\sum a_i)^2-\sum a_i^2]\)

整理得\(\sum a_i^2 \sum_n=1^l [\fracn-1n^2(^l-1_n-1)+\frac1n^2(^l-2_n-2)]+(\sum a_i)^2\sum_n=1^l\frac1n^2(^l-2_n-2)\)

发现原式被拆分成了形如\(x_l\sum a_i^2+y_l(\sum a_i)^2\)的形式,且\(x_l,y_l\)与序列形态无关,只与序列长度有关。现在原问题转化为两个子任务:维护区间和,区间平方和;迅速求解\(x_l,y_l\)

第一个子任务可以用线段树简单维护。

\(x_l\)拆分成三部分:①\(\sum_n=1^l\frac1n(^l-1_n-1)-\)\(\sum_n=1^l\frac1n^2(^l-1_n-1)+\)\(\sum_n=1^l\frac1n^2(^l-2_n-2)\),则\(y_l\)\(x_l\)的一部分。考虑分别求解。

①:\(\sum_n=1^l\frac1n(^l-1_n-1)=\sum_n=1^l\frac(l-1)!n!(l-n)!=\sum_n=1^l\frac1l(^l_n)=\frac2^l-1l\)(注意\(n\)的枚举从\(1\)开始)

②:\(\sum_n=1^l\frac1n^2(^l-1_n-1)=\frac 1l\sum_n=1^l\frac1n(^l_n)\),发现不是很好求解,可以使用差分的技巧。设\(P_l=\sum_n=1^l\frac1n(^l_n)\),则\(P_l+1-P_l=\frac 1l+1+\sum_n=1^l\frac(^l+1_~~n)-(^l_n)n=\frac 1l+1+\sum_n=1^l\frac1n(^~~~l_n-1)=\frac1l+1(1+\sum_n=1^l(^l+1_~~~n))=\frac2^l+1-1l+1\)

③:\(\sum_n=1^l\frac1n^2(^l-2_n-2)=\frac1l(l-1)\sum_n=1^l\fracn-1n(^l_n)=\frac1l(l-1)(2^l-1-\sum_n=1^l\frac1n(^l_n))\),发现与②式形式相同,可以简单处理。


  • C

dls:昨晚睡迷糊了,所以写了两份错的题面。

\(50pts:\)

按右端点排序dp,考虑需要记录哪些状态。

发现需要记录:未被覆盖的区间中,右端点最靠左的;选中的区间中,右端点最靠右的。维护这两维状态,转移时枚举当前线段是否选,直接做就可以,复杂度\(O(n^3)\)

\(100pts:\)

可以通过离散化,把端点改成两两不同的。

对每条线段求出\(l_i,r_i\),分别表示它左右两边第一条不能覆盖的线段。

可能会有右端点\(>r_i\),但是左端点较远所以被\(i\)覆盖的线段。发现它并不会影响答案,因为\(r_i\)完全被这条线段包含,因此任何覆盖\(r_i\)的线段都会覆盖它。

此时我们把每条线段转化成了一个区间,要求选出若干区间,使他们的并为\([1,n]\)

然后dls翻车了两次233333

显然区间右端点单调不降。设\(f_i,j\)为考虑了前\(i\)个区间,最左的未被覆盖的点为\(j\)的方案数。

转移时,发现\(f_i,[1,l_i)\)无论选与不选都不会受到影响,\(f_i,[l_i,r_i]\)只有不选才会保留,\(f_i,r_i+1\)若选,则会从\(f_i,[l_i,r_i]\)处转移来。

因此需要维护一个数据结构,支持区间乘法,区间和,线段树即可。复杂度\(O(m\log n)\),虽然\(n\)很大,但是在\(\log\)上,所以可以通过。

以上是关于ZROI 19.08.11模拟赛的主要内容,如果未能解决你的问题,请参考以下文章

ZROI提高组模拟赛05总结

ZROI 19.08.07模拟赛

ZROI 19.08.12模拟赛

ZROI 19.08.10模拟赛

ZROI 19.08.09模拟赛

ZROI 19.08.05模拟赛