zoukankan      html  css  js  c++  java
  • 模拟5 题解

    星际旅行

    题中很特殊的给出,恰好2条边1次经过,m-2条边2次经过,让我有一点想到了欧拉路。

    然而考试中还是没有想到拆边这个巧妙的方法,只打了一个dfs。

    正解是将每条边拆为两条,问题转化为删去两条不同的边,使图中存在欧拉路

    判断每个点的度即可。

    在每个边拆为两条之后,每个点的度一定是偶数。

    题中给出,不存在重边,存在自环。

    我们分类讨论即可:

    1.删去一个自环,奇偶性不发生任何改变。

    2.删去一条普通边,所连的两个点奇偶性发生改变。

    现在所要求的是,存在两个点度为奇数 或 所有点度均为偶数,且要保证一个边不能被删除两次。

    所有的方案是:

    1.删去一个点所对应的两条边

    2.删去一个自环,再随便删一条边

    3.删去两个自环

    砍树

    考场上推出来了很接近正解的式子,然后也想了一下能否使用数论分块。

    但很快把自己否定了,没有继续把式子推下去。

    本题给了很多部分分:

    对于$k=0$,直接求gcd。

    对于$k=1$,舍弃一个,求其他的gcd,尝试用gcd的约数在符合条件的情况下更新答案。

    对于$k>=a_max*n-sum$,即k能至少满足选最大的,可以$O(1)$计算。

    对于$a_i<5e5$,暴力枚举。

    正解是数论分块,推出的式子为:

    $sum limits_{i=1}^{n} lceil frac{a_i}{d} ceil <= lfloor frac{k+ sum limits_{i=1}^{n} a_i}{d} floor$

    求d的最大解。

    发现等号右侧的分子是定值,设为C,

    由数论分块的知识我们知道右侧的取值只有$2 sqrt{C}$个。

    显然当d更大时左侧的值更小,也就更能更新答案,

    于是枚举使每个定值符合的最大的d,尝试更新答案即可。

     

    超级树

    看到数据范围,考场上虽然想到了dp,

    但无从设计状态,更别说转移。

    dp状态设计的很神。

    $f(i,j)$设为i-超级树,存在j条不相交于任何一点的路径的方案数。

    为了方便,我们设num=f[i-1][l]*f[i-1][r]。
    什么都不做:

    $f[i][l+r]+=num$                                  ---1
    加上仅有根的路径:

    $f[i][l+r+1]+=num$                              ---2
    连接左/右仅一条路径:

    $f[i][l+r]+=num*(l+r)*2$                     ---3   *2的原因是双向
    沟通左右:

    $f[i][l+r-1]+=num*l*r*2$                    ---4
    沟通左/右两条路径:

    $f[i][l+r-1]+=num*(l*(l-1)+r(r-1))$      ---5   应当*2,但是与组合数的/2消掉

    初始 $f[1][1]=1,f[1][0]=1$
    目标 $f[n][1]$
    考虑j的实际含义,j可能飙到$2^i$。
    但是,根据dp转移,$f[n][1]$最多由$f[i][n-i+1]$转移。
    于是我们的复杂度是 $O(n^3)$。

  • 相关阅读:
    EL表达式格式化日期
    EL表达式格式化日期
    Jquery中find与each方法使用详解
    Jquery中find与each方法使用详解
    快递100接口使用
    快递100接口使用
    android 中context的具体作用和意义
    startactivityforresult使用
    android 获取sharedpreference的三种方法的区别
    关于contentprovider的几个问题
  • 原文地址:https://www.cnblogs.com/skyh/p/11209265.html
Copyright © 2011-2022 走看看