• Contest 987


    A

    开个 map 记录一下。

    时间复杂度 (Oleft(1 ight))

    B

    根据我们的常识,在正整数范围内,除了以下几个特例,其它情况都是指数较大值较大。

    • (2^4=4^2)
    • (1^x<x^1left(x>1 ight))
    • (2^3<3^2)

    然后就做完了,时间复杂度 (Oleft(1 ight))

    C

    树状数组裸题,枚举中间点。

    如果拓展到四个或更多位置的话用个 DP (f_i,j) 表示第 (i) 个位置强制,目前选了 (j) 个位置的最小值。然后用树状数组同样维护 (j-1) 的情况就好了。

    时间复杂度 (Oleft(nlog n ight))

    D

    发现 (k) 很小,考虑从它入手。

    以每种商品作为起点 BFS(注意可能有多个起点),这样就能算出每个点到每种商品的最短距离。

    然后对于每个点取出最近的 (s) 种货物就好了,时间复杂度 (Oleft(km+nslog s ight))

    E

    策神的题的弱化版。

    交换显然会更改逆序对个数的奇偶性,但可不可以做到线性呢?

    首先题目中进行的操作次数都是 (Oleft(n ight)) 级别的(虽然没什么用),这启发我们可以模拟交换的过程。

    我们枚举每一个 (i),如果 (a_i ot=i) 就交换 (a_{a_i})(a_i)

    直接理解起来可能会有一点点抽象,画个图来看看。

    因为是个排列,所以 (i)(a_i) 连边会形成一个个有向环。

    每次交换我们都会使得 (a_{a_i}=a_i),此后 (a_i) 位置不会再进行交换。

    因为一共有 (n) 个数,所以最多交换 (n) 次。

    时间复杂度 (Oleft(n ight))

    F

    虽然边数很多(同枚举子集的 (3^n) 级别),但我们并不关注具体的连边情况,我们只关心连通问题。

    考虑建立 (2^n) 个辅助点,向它们子集中 (1) 个数恰好(1) 的点连边。

    比如说 ( exttt{1101}) 就向 ( exttt{0101 1001 1100}) 连边。

    当然给定的 (m) 个点都要向 (left(2^n-1 ight)oplus a_i) 连边。

    然后这个连通性又比较优美,每次 dfs 下去肯定能遍历到整个连通块。

    所以访问过的点就不用访问了,总时间复杂度 (Oleft(2^n imes n ight))

    本质是通过分层的方式在保证连通的情况下缩减了多余的边数。

  • 相关阅读:
    linux历史及基本知识
    this关键字
    类加载与对象初始化
    学习之vim
    简单的登录界面(包括帐号密码验证)
    Web前端基础
    九大排序算法
    对“面向对象”思想的理解
    交换机
    网络编程协议详解
  • 原文地址:https://www.cnblogs.com/May-2nd/p/14059302.html
Copyright © 2020-2023  润新知