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)

原文地址:https://www.cnblogs.com/Soulist/p/13846346.html