• 模拟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$处的信息,所以用虚树维护。

  • 相关阅读:
    C#(99):Queue<T>队列与Stack<T>堆栈
    C#(99):字典Dictionary<Tkey.TValue>与SortedList
    C#(99):列表:List<T>与HashSet和只读集合
    C#(99):C#数组Array
    C#(99):枚举类型与位域枚举Enum
    C#(99):结构类型:Struct
    C#(99):定义类成员(属性、方法、索引、运算符、事件)、接口实现
    C#(99):定义类、System.Object对象、构造函数与析构函数、抽象类与静态类
    SuperSocket.ClientEngine介绍
    C#(99):五、并行编程
  • 原文地址:https://www.cnblogs.com/skyh/p/11768126.html
Copyright © 2020-2023  润新知