CF1146

CF1146 选做

CF1146D [* easy]

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

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

\(m\le 10^9,a,b\le 10^5\)

Solution

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

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

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

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

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

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

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


CF1146E

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

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

\(n\le 10^5,a_i\in [-10^5,10^5]\)

Solution

不会。

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


CF1146F [* easy]

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

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

\(n\le 2\cdot 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_i\le h\),定义贡献为 \(\sum a_i^2\),有 \(m\) 个限制,第 \(i\) 个限制为 \([l_i,r_i],x_i,c_i\),即这个区间的最大值严格大于 \(x_i\) 那么就将花费 \(c_i\) 的代价。

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

\(n,h,m\le 50\)

Solution

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

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

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

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

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

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


CF1146H [* easy]

题意

\(n\le 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\)

posted @ 2020-10-20 14:34  Soulist  阅读(131)  评论(0)    收藏  举报