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 最多会将集合分割开来,此处有两类方案:
- 所有子树独立为集合,此时 LCA 不会被选中。
- 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\))