zoukankan      html  css  js  c++  java
  • CF1146

    CF1146 选做

    CF1146D [* easy]

    你在 (0) 处,每次可以往前跳 (b) 格,或者往后跳 (a) 格,对于 ([0,i]),你希望知道你从 (0) 开始在不越界的情况下能够遇到的整点数。

    我们记其为 (f(i)),你需要求 (sum_{i=0}^m f(i))

    (mle 10^9,a,ble 10^5)

    Solution

    (i) 足够大的时候,我们可以凑出所有 (x|gcd(a,b))(x)

    首先显然 (\% a) 相同的元素都是可以单向到达的。

    对于 (j),我们连接 (j o j-b),那么显然 (j-b) 会取 (0sim a),当 (ige a+b) 时,我们可以到达所有 满足 (x|gcd(a,b))(x)

    于是较大的情况,答案就是 (lfloorfrac{i}{gcd(a,b)} floor+1),然后显然可以枚举 (i\% g=j),然后等差数列求一下和。

    考虑小的情况怎么做,每次加入一个点,我们连接 (i\%a o i)(i o (i-b)\% a)

    不难发现等价于给 (i\%a) 的权值 (+1),然后连接 (i\%a o (i-b)\%a) 的一条边。

    所以如果起点是与 (0) 联通的点,那么就暴力 dfs 更新答案即可。复杂度是 (mathcal O(a+b)) 的。


    CF1146E

    给定一个数列 (a),每次操作给定两个参数:

    • > x,将所有大于 (x) 的数乘以 (-1)
    • < x,将所有小于 (x) 的数乘以 (-1)

    (nle 10^5,a_iin [-10^5,10^5])

    Solution

    不会。

    想了 20min 不会做,我是该被毙了吧。


    CF1146F [* easy]

    给定一棵树,以 (1) 为根,对于叶子节点集合 (L),定义 (f(L)) 为将其连通的最小联通子图。

    你需要将叶子节点分成若干个集合,使得任意 (f(S))(f(T)) 满足 (f(S)land f(T)=varnothing)

    (nle 2cdot 10^5)

    Solution

    自底而上的做 dfs,每个 LCA 最多会将集合分割开来,此处有两类方案:

    1. 所有子树独立为集合,此时 LCA 不会被选中。
    2. LCA 被选中,将部分集合并在一起。

    于是不难发现这个问题存在另一个表述,给每条边染一个颜色 (0/1),使得每条 (1) 边连接到了至少一个叶子节点的方案数,同时每个非叶节点不能只连接了一条 (1) 边。

    那么设 (f_{u,0/1/2}) 表示 (u) 处有 (0/1/2+)(1) 边的方案数。复杂度 (mathcal O(n))


    CF1146G [* easy]

    初始有一个数组 (a),全体为 (0)(a_ile h),定义贡献为 (sum a_i^2),有 (m) 个限制,第 (i) 个限制为 ([l_i,r_i],x_i,c_i),即这个区间的最大值严格大于 (x_i) 那么就将花费 (c_i) 的代价。

    求贡献减去代价的最大值。

    (n,h,mle 50)

    Solution

    比较显然的最大权闭合子图,考虑最大权闭合子图建模:

    对于点 (i=1,2...n),拆成 (h) 个点,选择 ((i,x)) 必须要选择 ((i,x-1)),我们定义 ((i,x)) 的贡献为 (x^2-(x-1)^2)

    对于每个限制抽象成一个点,我们选择了 ((i,x)) 那么向对应的限制连一条边,表示必须选择这个点,此点贡献为 (-w_i)

    不难发现此图的最大权闭合子图即为答案,那么考虑网络流建模:

    • 初始答案为 (ncdot h^2)
    • 先拆出 (n imes h) 个节点,每个节点 ((i,x))((i,x-1)) 连一条 (infty) 的无向边,然后 (S o (i,x)),边权为 (2x-1)
    • 对于每个限制,连向 (T),每条边的边权为 (w_i)
    • 然后从每个 ((j,x_i+1),jin [l_i,r_i]) 连向此限制一条 (infty) 边。

    答案减去这张图的最小割即为答案。


    CF1146H [* easy]

    题意

    (nle 300)

    Solution

    考虑什么情况下会出现五角星,等价于出现了恰好由 (5) 个点组成的凸包。

    等价于选 (5) 条首尾相连,斜率单调的线段,预处理所有线段的斜率并离散化,dp 的时候枚举起点,然后转移形如 (f_{i,j,k}) 表示考虑到点 (i),上一个点为 (j),选了 (k) 个点的方案数。

    单次转移复杂度为 (mathcal O(n^3))

    总体复杂度 (mathcal O(n^4)),看着就过不去(然后听说可以过,那么这个题太拉跨了吧...)

    然后似乎可以更优,将所有线段进行极角排序,问题等价于选一些在极角序上升序的线段,所以依次枚举每条线段并加进来,发现线段都是可以加入的,将状态改为 (f_{i,j,k}) 表示 (i) 为起点走到 (j) 经过 (k) 条边的方案数,答案就是 (f_{i,i,5}) 的和,复杂度 (mathcal O(n^3))(每条边的转移量均为 (n)

  • 相关阅读:
    LeetCode 029 Divide Two Integers
    LeetCode 028 Implement strStr()
    Linux网络技术管理及进程管理
    RAID磁盘阵列及CentOS7系统启动流程
    Linux磁盘管理及LVM讲解(1)
    逻辑卷管理
    Linux磁盘管理及LVM讲解
    Linux计划任务及压缩归档
    Linux权限管理
    用户及用户组管理
  • 原文地址:https://www.cnblogs.com/Soulist/p/13846346.html
Copyright © 2011-2022 走看看