• 省选模拟55


    A. 调兵遣将

      直接做不好做,因为要枚举区间复杂度就已经炸了,所以考虑用总方案数减去不包含当前位置的方案数。

      由于整个序列的gcd种类数只有$nlogw$种,所以可以考虑对于每一种gcd分别考虑。

      对于每一种$gcd=w$,用$(x,l,r)$表示$[l....r,x]$这样的区间满足$gcd=w$,然后考虑dp,令$f_i$表示前i个位置满足条件的方案数。

      那么转移实际上就是区间求和和区间加,直接用线段树可以简单维护。

      于是这样就可以求出来总方案数。

      同理用$g_i$表示$i$到$n$的合法方案数,转移类似。

      然后就可以用$f$和$g$表示不包含当前位置的方案数,发现方案数不同的区间实际上只有不同的区间端点种,所以对于每个区间统一考虑即可。

    B. 一掷千金

      发现这是个经典的翻硬币模型,所以可以对于每个白点分别求出SG值然后异或起来。

      对于每个白点(x,y),打表可以发现SG值是$lowbit(max(x,y))$,所以现在的问题是对于若干矩形的交求出所有这个东西的异或值。

      然后可以想到线段树扫描线,那么剩下的问题就是直接计算一段区间$lowbit$的异或值。

      考虑把线段树的节点长度开成2^k,那么这样的区间的值是容易算的,实际上两两抵消掉了,只剩下区间中点和左端点。

      所以直接上线段树扫描线就没了。

    C. 树拓扑序

      考虑$dp[i][j][k]$表示$i$的子树中$j$的排名为$k$的方案数。

      有了这个东西就可以暴力枚举子树中的点对和排名来统计贡献,预处理一下前缀和可以做到每对点$O(n)$求出。

      然后考虑这个东西的转移,实际上还是枚举一个排名,再枚举前面出现了几个点,类似的转移即可。

  • 相关阅读:
    程序员面试金典-面试题 16.15. 珠玑妙算
    程序员面试金典-面试题 16.14. 最佳直线
    程序员面试金典-面试题 16.13. 平分正方形
    程序员面试金典-面试题 16.11. 跳水板
    程序员面试金典-面试题 16.10. 生存人数
    程序员面试金典-面试题 16.08. 整数的英语表示
    程序员面试金典-面试题 16.07. 最大数值
    程序员面试金典-面试题 16.06. 最小差
    python学习笔记-47 UDP编程
    python学习笔记-46 TCP编程
  • 原文地址:https://www.cnblogs.com/hzoi-cbx/p/12584500.html
Copyright © 2020-2023  润新知