zoukankan      html  css  js  c++  java
  • 好题总结 PartII

    #36. 【清华集训2014】玛里苟斯

    首先需要发现的是,只有这些数的基有用,这是应为如果存在某一个数$a_i$,使得存在不包含$a_i$的一个集合$S$,其异或和等于$a_i$

    那么对于$S$的任意一个子集$T$所得到的异或和,都可以通过取$T$在$S$中补集,在异或$a_i$得到一个相同的值,那么每一个值就有两种方案,由于求期望,计算的时候会把这个因子$2$约掉,那么去掉$a_i$不影响答案

    由于题目保证了答案不大于$2^{63}$,$a$中数的上界为$2^{frac{63}{k}}$,可以发现如果$kgeq 3$,线性基中元素的个数最多只有$21$个,那么直接暴力统计答案,并且这道题有一个性质是,答案要么是整数,要么是$.5$,这个可以从下面的证明看出来

    那么现在只要考虑$k=1,k=2$的情况

    当$k=1$时,可以单独考虑每一位上的贡献,对于第$i$位上存在$m(m eq 0)$个$1$,其期望贡献为$frac{2^msumlimits_{i=0}^{m}[i\%2=1]inom{m}{i}}{2^m}$,等于$2^{m-1}$

    当$k=2$时,由于是乘积,那么只要考虑某两位上乘积的和,对于第$i$位和第$j$位,如果所有数都是$11$或者$00$,那么这就退化成$k=1$的情况,贡献为$2^{i+j-1}$

    否则,记$11$的有$a$个,$01$有$b$个,$10$有$c$个,所有不为$00$的个数有$a+b+c$个,那么贡献为

    $frac{sumlimits_{k=0}^ainom{a}{k}sumlimits_{i=0}^bsumlimits_{j=0}^b[i\%2=k\%2][i\%2=k\%2]inom{a}{i}inom{b}{j}}{2^{a+b+c}}$

    化简可得$2^{a+b+c-2}$

    那么直接暴力即可

    代码

    #62. 【UR #5】怎样跑得更快

    居然做出了UR的C

    首先这个解方程显然不能直接去高斯消元,这个矩阵一定有一些性质,再观察这个式子,一脸莫比乌斯反演的样子,再想到一定反演变化实际上就是矩阵互相求逆的过程,说白就是解方程的过程,那么以这个为指导思想,那么来考虑怎么具体做这道题

    首先式子里的$lcm(i,j)^d$改写为$frac{i^dj^d}{gcd(i,j)^d}$,原式化为$i^dsumlimits_{j=1}^n gcd(i,j)^{c-d}j^d x_jequiv b_i$

    令$b'_i=frac{b_i}{i^d}$,然后开始大力推式子

    $sumlimits_{g|i}g^{c-d}sumlimits_{j}^{left lfloor frac{n}{g} ight floor}[gcd(frac{i}{g},j)=1] (jg)^d x_{jg}$

    $sumlimits_{g|i}g^{c-d}sumlimits_{j}^{left lfloor frac{n}{g} ight floor}(jg)^d x_{jg}sumlimits_{k|frac{i}{g}}mu (k) $

    $sumlimits_{g|i}g^{c-d}sumlimits_{k|frac{i}{g}}mu (k) sumlimits_{j}^{left lfloor frac{n}{kg} ight floor}(kgj)^d x_{kgj}$

    $sumlimits_{t|i} (sumlimits_{j=1}^{left lfloor frac{n}{t} ight floor}(tj)^dx_{tj})(sumlimits_{g|t}g^{c-d}mu(frac{t}{g}))$

    令$C_t=(sumlimits_{g|t}g^{c-d}mu(frac{t}{g})),f(t)=sumlimits_{j=1}^{left lfloor frac{n}{t} ight floor}(tj)^dx_{tj}$

    那么莫比乌斯反演可得

    $C_if(i)=sumlimits_{t|i}mu(t) b_{frac{i}{t}}$

    预处理$C$和$mu$,那么就可以在$O(nlogn)$时间内得到$f$,然后从后往前解出每一个$x$(注意需要除以$i^d$),最后带回原式判断是否无解

    代码

    #345. 【清华集训2017】榕树之心

    首先考虑判断根是否合法,对于根节点$x$来说,可以使根节点的两个子树内互相抵消,经典结论,当所有子树最大值$MAX$,使得$2MAXleq (sz[x]-1-sz[son])$时可以全部抵消掉,最终剩下$(sz[x]-1)\%2$,加上自己$x$一个,否则会剩下$2MAX-(sz[x]-1-sz[son])$个点

    那么我们就要尽量消掉重儿子子树内的节点,那么可以设dp[x]表示在x子树内最少可以消到$dp[x]$个节点,考虑转移,根据上面的结论,那么只要$2dp[x]leq (sz[x]-1-sz[son])$就可以进入第一种情况

    因为贪心地想,只要可以得到重儿子子树内节点最小值是满足条件的,虽然有可能在取最小值的时候,不一定满足是所有子树的最大值但是可以通过调整来满足条件

    那么直接$DP$到根,判断$dp[1]$是否为$1$,如果为$1$那么可行,否则不可行

    接下来考虑如何判断其他节点是否可行,可以利用之前记录的信息,从上往下$DP$,记录到当前节点,子树外最少可以消到多少个,按照之前的做法类似换根$DP$即可

    代码

    #346. 【清华集训2017】某位歌姬的故事

    首先可以发现有效的数段只有$2q$个,那么可以把每一个限制的左右端点离散化,然后可以得到$2q$个连续的区间,并且可以发现每一个连续的区间可以填的数的上界是相同的,上界就是所有覆盖这一点限制$m$的最小值

    考虑如果只有一个限制的时候,方案数可以简单容斥计算,就是$m^{r-l+1}-(m-1)^{r-l+1}$,那么考虑多个限制的时候,就可以容斥地计算,即$sumlimits_S (-1)^{|S|} f(S)$,其中$f(S)$表示强制满足$S$集合中限制条件的,其他的条件不满足的方案数,记$xin S$的所有线段的并的长度为$a$,$x otin S$所有线段的并长度为$b$,那么$f(S)=m^a+(m-1)^b$,那么这个可以用$DP$解决

    设$dp[i][j]$表示到第$i$个区间,所选的区间最远到达$j$的容斥计算结果之和,注意需要把$-1$乘入到结果中

    转移如下

    $dp[i][j] ightarrow dp[i+1][j]$

    $-g(l[i],r[i],j)dp[i][j] ightarrow dp[i+1][max(j,r[i])]$

    $g(l,r,i)$表示$[l,r]$这个区间与长度为$i$前缀扩展的方案数,也就是讨论一下左右端点$l,r$与$i$的大小关系,利用上面计算容斥系数的算法计算即可

    注意到任意一个线段只会出现在点的上界为$m$的区域中,那么可以对于上界相同的点单独考虑,算出容斥系数,将所有的容斥系数相乘起来,就是答案

    需要特判某一个限制一定不会被满足的情况,并且需要注意常数,要预处理幂次,否则会在extra test被卡

    说白了也不是很复杂

    代码

  • 相关阅读:
    quartz 定时调度持久化数据库配置文件
    springboot项目下mvnw文件的作用
    mysql安装版卸载,解压版安装
    idea提示,格式化代码,清除不使用的包快捷键,maven自动导jar包
    JavaScript中call,apply,bind方法
    彻底理解js中this的指向
    Gradle系列之从init.gradle说起
    响应式网页设计简单入门
    开启MySQL远程访问权限 允许远程连接
    https原理
  • 原文地址:https://www.cnblogs.com/huangchenyan/p/14248889.html
Copyright © 2011-2022 走看看