zoukankan      html  css  js  c++  java
  • 省选模拟15 题解

    A. 倒计时

    考虑50%的部分分。

    分块来削这个数。

    后四位形成一块,预处理出9991~9999在前五位的最大值为0~9情况下分别会削到的值和削的次数。

    对于零散的后四位暴力削,这样就可以通过根号预处理,根号削$n$了。

    容易发现,对于$n$比较大,我们多分几次块,每次用较小一级的块来预处理大块就行了。

    B. 旅行路线

    容易发现问题可以转化为一棵1为根的树,统计每个点到树上祖先的本质不同子串。

    将点到祖先转化为祖先到子孙,于是问题是一个简单的广义后缀自动机。

    C. 流浪者

    最终只关注路径上经过的障碍点个数。

    容易发现这个向下取整在不断进行的情况下最多有$log2(s)$种取值。

    对于障碍点个数很多(>$log2(s)$),最终的$s$为1。

    对于50%可以直接在原网格图上dp。

    $dp_{i,j,k}$表示 到$i$行$j$列 已经经过了$k$个障碍点。

    特别的$dp_{i,j,25}$(这里我认为25已经大于$log2(s)$)表示到$i$行$j$列 已经经过了不小于$25$个障碍点的方案数。

    对于比较大的数据 在原图上dp不可行

    但是k比较小,所以将k个障碍点抽离出来

    为了方便 如果不存在障碍点(1,1)和障碍点(n,m),加入这两个点

    然后考虑从一个障碍点到另一个在它右下角的障碍点的方案数,是一个组合数。

    问题在于暴力进行这个dp过程,算得的结果是不准确的。

    因为两个障碍点之间可能存在着其他的障碍点,一个方案实际上经过了中间的障碍点但没有统计到。

    可以把这样的情况容斥掉。

    一个自然的想法是令$dp_{i,j}$表示到第$i$个障碍点,已经经过了至少$j$个障碍点的方案数。

    最终得到了$dp_{k}$数组,对这个数组进行二项式反演即可。

    但是容易发现,如果使用这种容斥方式。

    $dp_{k,i}$需要通过所有$dp_{k,j}(j>i)$来进行容斥,同时对于每个$j$的转移系数是不同的。

    这也就导致了无法通过原来的特殊性质(即只考虑比较少个数的障碍点)来进行dp了。

    一个解决办法是将最终的容斥提前,改为对每个$dp_{i}$数组进行容斥,使$dp_{i,j}$表示恰好经过$j$个障碍点。

    考虑一个非法的方案,一定可以表示为$11111100$,其中一个数字$1$表示经过了一个障碍点并统计到了,$0$则表示经过了但没统计到。

    这样的话实际上还对应着一种方案为$11111110$,这样考虑的话使$dp_{i,j}$减去$dp_{i,j+1}$就可以了。

    $dp$数组中不统计超过$log2(s)$的方案,最终通过每个点的$dp_{i,log2(s)}$乘组合数即可,实际上直接用总方案数减也可以得到。

    D. 摆棋子

    因为一些特殊的原因,出现了$D$题。

    因为一些特殊的原因,这场考试成为了唯一一场赛时超过300分的考试。

    然而这是一道原题 土兵占领

    通过将摆棋子转化为删棋子,实现跑最大流而得到最小的答案。

  • 相关阅读:
    C# 常用小点
    WebClient下载文件
    redis常见错误处理
    win2008R2环境配置
    C#程序员知识体系
    js中json的添加和指定位置的删除
    关于本博客的美化
    箭头函数中可改变this作用域,回调函数用箭头函数this指向page,自定义事件用箭头函数this指向undefined
    json_decode 和 json_encode 区别
    tp6中使用微信支付sdk
  • 原文地址:https://www.cnblogs.com/skyh/p/12253814.html
Copyright © 2011-2022 走看看