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

    A. 凉宫春日的忧郁

    数据范围就长得很可写高精度的样子。

    可以维护高精度的高位,舍弃低位信息。

    正解是取对数。

    $x^y=y*log x$

    $y!=sum limits_{i=1}^{y}log i$

    然后可以直接比较两个取对之后的$double$类型。

    B. 漫无止境的八月

    显然将问题转化为差分。

    单点修改转化为单点加一个值,下一位减去一个值。

    区间加法转化为当前位加上一个值和$k$位后减去一个值。

    然后发现可以把全部的信息都转移到最后$k$位,然后用一个变量维护$k$个数中有多少个不为$0$就完了。

    然而本题其实是语文题,谁能想到出题人修改的是终止区间呢。(并不看样例解释)

    C. 射手座之日

    显然区间$[i,j]$的$lca$为区间中的$dfs$序最小值和最大值的$lca$。

    所以想到分治维护最值,然后这个$lca$就并不像方案数/乘法/加法等信息可以用结合律简单维护。

    部分分提示我们:通过枚举$lca$,找出有多少个区间,满足最值在$lca$的$dfs$序范围内。

    然而这个似乎挺难做的,然后就完戏了。

    正解要继续这个思路:

    因为直接维护区间很困难,不妨考虑插入子树内每一个值的过程。

    将子树内的每一个值插入序列中,检查多少个序列可以形成了连续的区间。

    这个过程可以用链表(通过记录左右端点模拟)简单维护。

    为了保证复杂度,选择树上启发式合并。

    另一个思路是用线段树合并来维护这个过程,实际上区别并不大。

    更加大神的思路是分治:

    考虑分治区间$(l,mid,r)$,那么只要考虑跨过$mid$的方案。

    处理出由$mid$分别拓展到左右端点的$lca$数组,设左侧的$lca$数组为白点,右侧的$lca$数组为黑点。

    那么问题转化为每个黑白点对的$lca$的权值和。

    暴力做树形$dp$一定是不行的,但是显然只关注$lca$处的信息,所以用虚树维护。

  • 相关阅读:
    USACO提交方法
    洛谷 P1967 【货车运输】
    一本通 P1386 【打击犯罪】
    洛谷 P5767 【最优乘车】
    洛谷 P5658 【括号树】
    洛谷 P5657 【格雷码】
    洛谷 P2272 【最大半连通子图】
    二分图匈牙利算法
    最小生成树Kruskal算法
    觉得写出了抽象类和接口,以及概括了设计模式的宗旨
  • 原文地址:https://www.cnblogs.com/skyh/p/11768126.html
Copyright © 2011-2022 走看看