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

    A. 取石子游戏

    容易发现这个问题的 $sg$ 值就是每堆的石子个数的异或和。

    问题是后手能赢,也就是求删除 $d$ 的倍数个石子,使得剩余石子的异或和恰好为 $0$ 的方案数。

    然后发现直接 $dp$ 复杂度就是 $O(n*d*max(a_i))$ 的。

    发现题面中给出了一个很特殊的限制,所以考虑如何做到每次 $O(d*a_i)$ 的转移。

    容易发现给 $a_i$ 排个序就好了。

    坑点是不能全删完,所以当 $d$ 是 $n$ 的因数的时候需要给答案减一个 $1$。

    B. 路径计数

    容易发现不同的询问个数并不多,所以这题肯定要预处理答案。

    这样直接做一个 $dp$,复杂度就是 $O(n^4d)$的。

    然后发现这个 $n^4$ 是枚举点对+枚举边,肯定后者省不掉,所以想一下怎么把枚举点对转化为枚举一个点。

    比如枚举起点,那考虑弄一个容斥出答案。

    现在不妨让路径上都不经过起点,那么只要钦定路径上出现若干个终点,即可容斥出路径上恰好出现 $0$ 次终点。

    然后考虑每个钦定序列的方案数,发现这个玩意有两种形式。

    设 $f(i,j,x,k)$ 表示由 $i$ 走 $k$ 步到达 $j$,路径上不能经过 $x$ 的方案数。

    那么一个是 $f(s,t,s,k)$ ,一个是 $f(t,t,s,k)$ 。

    前者直接做一下 $O(n^3d)$ 的 $dp$ 就完事了,后者再套一个类似的容斥即可转化为没有任何限制,也就是个直接 $dp$。

    但是容斥的方法是枚举序列,这肯定不现实,容易发现只关心终点的最后一次出现,所以写成类似背包 $dp$ 的形式就好了。

    C. 方格操作

    考虑设 $f_x$ 表示第 $x$ 行 $1$ 出现次数的奇偶性, $g_x$ 同理表示列。

    然后发现一轮操作之后,有 $col_{i,j}=f_i xor g_j$。

    然后有一个想不到但挺显然的结论,就是说行、列的交换是不影响答案的。

    那么发现把 $f,g$ 的两种取值分别移动到角落,第一轮操作之后,形成的就是四个矩形。

    既然第一轮是矩形,以后的每一轮这个矩形始终存在,并且每个矩形中每个点的颜色是相同的。

    所以直接模拟,因为只有四个矩形,当超过 $16$ 轮模拟仍然没有结束,那肯定就是操作无限次了。

    所以问题只剩下如何求初始的 $f,g$ ,发现这个搞个扫描线就好了。

  • 相关阅读:
    1.惨不忍睹凌乱的定时任务
    二维码名片
    给定的逗号分隔的数字字符串转换为Table
    sql 列集合转换成逗号分隔的字符类型
    linq 分组
    触发器
    整合思路、步骤
    整合注意事项
    配置文件
    Struts2的线程安全性
  • 原文地址:https://www.cnblogs.com/skyh/p/12589591.html
Copyright © 2011-2022 走看看