zoukankan      html  css  js  c++  java
  • CF1394(div1)

    差 1E,看上去太仙了 (3500) 就咕了。

    A

    sb 题


    B

    • 给定一个 (n) 个点 (m) 条边的有向图,每个点的出度最多为 (k),每条边有个 (1sim m) 范围内的权值。

    • 求有多少长度为 (k) 的序列 (c) 满足如下约束:

    • (1le c_ile i)

    • 对于度数为 (i) 的点,保留出边权值第 (c_i) 小的边,这张图会构成若干个环。

    • (n,mle 2 imes 10^5,1le kle 9)

    ( m Sol:)

    每个点的出度都是 (1),所以入度也都是 (1),所以判定条件是这个。

    对于 (k=1sim 9),每个点的选择只有 (i),所以枚举会有一个 (mathcal O(9!))

    但是 check 是 (mathcal O(n)) 的。

    考虑优化 check,发现假设 (c_i) 选了 (j) 那么 (c_k) 不能选 (k) 之类的互斥关系可以预处理。

    复杂度为 (mathcal O(k! imes k^2+nk^2))


    C

    对于一个 (01) 串 S 你可以执行以下操作:

    1. 删除其中任意一个字符。
    2. 删除一个 01,10 类型的子串。
    3. 在结尾添加 0/1
    4. 在结尾添加 01/10

    对于两个字符串 (s,t),定义其相似当且仅当每种字符的出现次数相同。

    定义 ( extrm{dist}(s,t)) 为最小的操作次数使得 (s)(t) 相同,每次操作可以对 (t)(s) 进行操作。

    给定 (n) 个字符串 (s_{1,2...n}),求一个字符串 (t) 使得 (max_{1le ile n}( extrm{dist}(s_i,t))) 最小,输出最小值和字符串。

    Solution

    首先操作是对称的,所以 12 类操作无效。可以只考虑 3,4 类操作。

    每个 01 串可以被 0 的数量和 1 的数量两个维度描述 ((a,b)),每次操作为给 (a+1) 或者 (b+1) 或者 (a,b) 同时加 (1),或者给 (a-1)(b-1)(a,b) 同时减 (1)

    • 请注意从绝对值来描述答案是有问题的。

    不难想到二分,此时等价于 ((a,b)) 可以遍历到所有点。

    操作次数的上界是 (2n) 的级别。只需要考虑 ((a,b))(k) 次操作内可以到达所有点。

    等价于每个点可以到达的点的交集。

    于是只需要判定所有点形成的区域是否有交即可。

    复杂度 (mathcal O(nlog n))

    具体判定为,答案只关乎于差值的绝对值:

    ((a,b)) 均为正的时候答案为 (max(a,b)),均为负同理。

    一正一负的时候为 (|a|+|b|)

    很容易得到每个点可以到达的点的区域,对每个区域列一个不等式,于是这个题就做完了。


    D

    给定 (n) 个节点的树,每个点有点权 (v_i),有高度 (h_i)

    将原树的所有边划分成若干条链,使得每条链的高度递增,最小化所有链的点权和。

    (h_i,w_iin[1,10^6],nle 2 imes 10^5)

    Solution

    对于边 (u,v) 假设 (h_u e h_v),那么这条边的方向确定。

    一个点对答案的贡献是经过他的链数,设 (a) 为指向它的边的数量,(b) 为指出去的边的数量,那么不难发现其贡献为 (w_i imes max{a,b})

    问题等价于你需要给高度相等的链确定方向最小化贡献和。

    (f_{u,0/1}) 分别表示以 (u) 为根的子树,(u) 到父亲的边强制为连入/连出情况下的贡献和。

    更具体的,问题变成给定 (m) 个二元组 ((f_{v,0},f_{v,1})) 给每个二元组选择一个权值,然后设 (a,b) 分别为 (0/1) 的数量,(k=max(a,b)) 贡献为权值和加上 (k imes w_i)(当然部分是固定的,但是处理起来也很简单)

    可以先假设所有元素选 (0),然后依次枚举 (1) 的数量,不难发现我们肯定优先选 (f_{v,1}-f_{v,0}) 尽可能小的元素。

    然后即时更新一下贡献,特判一下 (1) 号节点,这个题就做完了。

    复杂度是 (mathcal O(sum deg(i) log)) 大约是 (mathcal O(nlog n))

    感觉评分偏高。。

  • 相关阅读:
    golang 数据结构 优先队列(堆)
    leetcode刷题笔记5210题 球会落何处
    leetcode刷题笔记5638题 吃苹果的最大数目
    leetcode刷题笔记5637题 判断字符串的两半是否相似
    剑指 Offer 28. 对称的二叉树
    剑指 Offer 27. 二叉树的镜像
    剑指 Offer 26. 树的子结构
    剑指 Offer 25. 合并两个排序的链表
    剑指 Offer 24. 反转链表
    剑指 Offer 22. 链表中倒数第k个节点
  • 原文地址:https://www.cnblogs.com/Soulist/p/13640869.html
Copyright © 2011-2022 走看看