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

    A. 签到

    如果权值在边上,那么问题就简单了,弄一棵生成树,然后对每个环权值塞线性基里就完事了。

    但是如果权值在点上,这个结论就并不成立了。

    所以可以联想+手玩发现,如果走一条路径然后回来,造成的贡献是两个端点分别状态取反,中间路径不变。

    然后可以得到一种构造方法,首先从起点走到终点,然后从一条不相交的路径走回起点,然后从原来的路径走回终点。

    这样就发现,问题的规模缩小了 $1$。不断重复上述过程,可以发现

    当 $n+m$ 为奇数,最终到达了终点,并且图中没有任何一个点有贡献。

    当 $n+m$ 为偶数,最终到达的终点,并且图中仅终点有贡献。

    然后就容易发现有贡献的点的个数的奇偶性等于 $n+m-1$ 的奇偶性。

    然后对于任何一个满足奇偶性的方案,都可以通过不断在终点和有贡献的点之间移动来构造出来。

    所以问题就是求满足奇偶性的最大异或和,大概可以想到用线性基解决,但是太菜了不会做。

    所以题解是这样的,给每个数都加上 $2^{30}$ ,于是选择个数的奇偶性就等于 $2^{30}$ 是否存在。

    所以在进行线性基取最大值之前,根据要求的东西,设置初值为 $0/2^{30}$ ,使答案满足性质。

    最后给答案减去 $2^{30}$ 即可。

    B. 树(tree)

    容易想到整个分块暴力。所以只要预处理一个数组 $f_{i,j}$ 表示第 $i$ 个块中的点与 $j$ 距离的最小值。

    然后对于整块直接用数组,小的部分暴力就行了。

    对于数组的处理,可以枚举块,然后问题就是多源点最短路,而且是树上的形式,写个换根 $dp$ 就行了。

    然后本题的正解是个类似线段树分治的东西。

    具体来说,离线询问,然后对于每个询问,都像线段树一样塞入 $log$ 个区间中。

    最后扫一遍分治结构,对于每个节点,都把节点管辖的区间、每个询问点建出一棵虚树来,在虚树上写一个上述换根 $dp$ 就好了。

    然后另外一个做法是弄个点分治。

    具体来说,在点分治结构的 $lca$ 处考虑每个点对的贡献。

    在分治中心扫所有的儿子,并把对应的权值塞进一个线段树里。

    然后对于每个子孙节点中的询问,都在线段树中查询一遍即可。

    C. 区间(interval)

    其实就是给暴力算法加个 bitset 优化。

    就是说分块然后弄个 bitset 来搞。

    但是这样的话两个 bitset 的合并是非常困难的,一次的复杂度就是 $O(frac{n}{w})$,所以对于一个询问也就只能做一两次。

    然后就是一个与解决随机数据下 $O(n)~O(1)$ RMQ 问题的算法差不多的算法,在分块的基础上再弄个 ST 表。

    所以每次只需要合并两个 bitset,就可以解决了。

    然后一个优化是对于出现次数小于 $1$ 的权值,可以单独拎出来考虑贡献,所以值域范围可以缩减到 $5*10^4$,就可以不卡常跑过了。 

  • 相关阅读:
    realmysql 配套书 资料
    韩国 DBA 博客
    Linux Storage Stack Diagram 4.0
    mysql56 在线源码查看
    导致“mysql has gone away”的两种情况
    mysqldump中使用flush tables with read lock的风险分析
    使用Percona Data Recovery Tool for InnoDB恢复数据
    mha-helper ----ovaistariq DBA GITHUB
    MySQL必知必会面试题 基础
    Zabbix-3.0.3使用自带模板监控MySQL
  • 原文地址:https://www.cnblogs.com/skyh/p/12727019.html
Copyright © 2011-2022 走看看