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

    A. 小A的树

    超级钢琴、异或粽子、异或之几道题都是这个套路。

    对于每个右端点不断找区间最优解,然后把原区间分割为两个区间。

    用一个堆来时刻找到最大值。

    所以这个题要解决的就是一个点和区间内所有点的最大距离。

    点集合并的问题,直接搞一个线段树维护直径就好了。

    B. 小B的序列

    考虑位运算的一些性质,可以按位考虑。

    对于每一位而言,如果区间不同,执行 $or 1$ 或者 $and 0$ 操作之后,会使整个区间相同。

    所以说这个操作实际上意味着区间推平。

    当线段树区间内存在一个位满足当前不平,并且可以被该操作推平,那么就暴力递归下去。

    是否存在的判断可以直接通过维护区间的 $or$ 和 $and$ 然后用位运算实现。

    否则直接打一个标记来表示给区间整体执行 $or$ 和 $and$ 的操作。

    对二进制下的每一位势能分析一下,可以得知复杂度是两个 $log$ 的。

    所以问题是咋维护两个标记,来表示给区间执行 $or$ 和 $and$ 操作。

    可以钦定一个顺序,对区间内操作执行先 $and$ 后 $or$。

    那么$a and b or c or d =a and b or (c or d)$

    $a and b or c and d = a and (b and d) or (c and d)$

    然后再维护一下最大值支持查询就好了。

    C. 小C的利是

    首先要想到原问题可以用行列式来解决。

    因为行列式的定义就是枚举一个排列,然后贡献为权值的乘积 $*(-1)^{num}$。

    因为有个加法,所以把它提到指数上去,构造一个多项式就好了。

    因为有个 $(-1)^{num}$ 的系数,为了防止被卡需要再给每个多项式随机乘个系数。

    发现最终的答案显然不超过 $nk$ 次,所以暴力求值插值,复杂度大概是五次方级别的。

    然后发现我们只关注 $k$ 的倍数次方处是否有值,也差不多可以转化为 $k$ 的倍数次方的系数和。

    所以可以套个单位根反演上去。

    这样的话只要找出一个存在 $k$ 次单位根的质数来,然后在这个模质数意义下分别代入 $x=w_k^i$ $0 leq i < k$ 来求行列式的和。

    最终得到的答案就是 $k$ 的倍数次方的系数和。

    如果说这个值不为 $0$ ,即一定存在一组合法解,否则大概率无解。

  • 相关阅读:
    转:我们是否应该把后端构建为API
    转:浅谈命令查询职责分离(CQRS)模式
    转:如何在Linux上提高文本的搜索效率
    结对编程???该歇歇了
    码农语录•「程序代码的可信度,不会比写的人还可信。」
    七个错误可能引发网页布局灾难
    为什么我不再和别人比较了?
    顶级程序员的10条最佳实践
    程序员淡定的姿态和操蛋的心...
    【好文翻译】码农们:效率与质量,你选择哪个?
  • 原文地址:https://www.cnblogs.com/skyh/p/12533267.html
Copyright © 2011-2022 走看看