zoukankan      html  css  js  c++  java
  • ZROI 19.08.11模拟赛

    传送门

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


    dlsnb!

    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)上的数放到它在循环里的对应位置。

    但是一步的期望是(frac{n}2)次操作,实际步数无法承受。

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

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

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


    • B

    欣赏一下swk的神奇错误:

    (frac{1}n sum(a_i-frac 1n sum a_i)^2=frac{1}{n}(sum a_i^2+frac{(1-2n)(sum a_i)^2}{n^2}))

    /cy/qiang

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

    (frac{1}n sum(a_i-frac 1n sum a_i)^2=frac{1}{n}sum(a_i^2-frac {2a_i}nsum a_i +frac{1}{n^2}(sum a_i)^2)=frac 1n (sum a_i^2-frac{1}n (sum a_i)^2))

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

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

    (frac 1n (sum a_i^2-frac{1}n (sum a_i)^2)=frac{n-1}{n^2}sum a_i^2-frac{1}{n^2}sum_{i ot=j}a_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}frac{n-1}{n^2}(^{l-1}_{n-1})sum a_i^2-sum_{n=1}^lfrac{1}{n^2}(^{l-2}_{n-2})sum_{i ot=j}a_ia_j)

    发现枚举(a_i,a_j)比较困难,重新将其转化为完全平方的形式,得到(sum_{n=1}^{l}frac{n-1}{n^2}(^{l-1}_{n-1})sum a_i^2-sum_{n=1}^lfrac{1}{n^2}(^{l-2}_{n-2})[(sum a_i)^2-sum a_i^2])

    整理得(sum a_i^2 sum_{n=1}^l [frac{n-1}{n^2}(^{l-1}_{n-1})+frac{1}{n^2}(^{l-2}_{n-2})]+(sum a_i)^2sum_{n=1}^lfrac{1}{n^2}(^{l-2}_{n-2}))

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

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

    (x_l)拆分成三部分:①(sum_{n=1}^{l}frac{1}{n}(^{l-1}_{n-1})-)(sum_{n=1}^{l}frac{1}{n^2}(^{l-1}_{n-1})+)(sum_{n=1}^{l}frac{1}{n^2}(^{l-2}_{n-2})),则(y_l)(x_l)的一部分。考虑分别求解。

    ①:(sum_{n=1}^{l}frac{1}{n}(^{l-1}_{n-1})=sum_{n=1}^{l}frac{(l-1)!}{n!(l-n)!}=sum_{n=1}^{l}frac{1}{l}(^l_n)=frac{2^l-1}{l})(注意(n)的枚举从(1)开始)

    ②:(sum_{n=1}^{l}frac{1}{n^2}(^{l-1}_{n-1})=frac 1lsum_{n=1}^{l}frac{1}{n}(^l_n)),发现不是很好求解,可以使用差分的技巧。设(P_l=sum_{n=1}^{l}frac{1}{n}(^l_n)),则(P_{l+1}-P_l=frac 1{l+1}+sum_{n=1}^{l}frac{(^{l+1}_{~~n})-(^l_n)}{n}=frac 1{l+1}+sum_{n=1}^{l}frac{1}{n}(^{~~~l}_{n-1})=frac{1}{l+1}(1+sum_{n=1}^l(^{l+1}_{~~~n}))=frac{2^{l+1}-1}{l+1})

    ③:(sum_{n=1}^{l}frac{1}{n^2}(^{l-2}_{n-2})=frac{1}{l(l-1)}sum_{n=1}^lfrac{n-1}{n}(^l_n)=frac{1}{l(l-1)}(2^l-1-sum_{n=1}^lfrac{1}{n}(^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(mlog n)),虽然(n)很大,但是在(log)上,所以可以通过。

  • 相关阅读:
    Android反编译apk并重新打包签名(Mac环境)
    Android Studio修改apk打包生成名称
    Mac搭建SVN服务器+Cornerstone连接服务器
    Android Studio中使用Git进行代码管理(分支、合并)
    Android Studio之SVN打分支、切换分支及合并分支
    一次真实的线上OOM问题定位
    水平分库如何做到平滑扩展
    case when / if else-if 的大坑,要当心!!!
    项目启动时 xml报错:Could not find SQL statement to include with refid 'mbgl.panDuanZbsfkxg'
    只需要返回一条数据,并且必须返回一条数据的时候的写法
  • 原文地址:https://www.cnblogs.com/suwakow/p/11375092.html
Copyright © 2011-2022 走看看