ecf 之前训练纪要
-
icpc2022 济南
一道也没做出来。 -
icpc2020 上海
-
sky garden
第 \(i\) 个圆上的点向第 \(1\sim i-1\) 个圆上的点路径的最短路的第一步肯定是挪到第 \(i-1\) 个圆的对应点,这就很像一个 dp 的结构
另外发现圆上每个点地位相同,同一个圆上的结果可以直接×\(2m\)于是写 \(f_i\) 表示第 \(i\) 个圆上某点到 \(1\sim i\) 个圆上点的路径长度之和,\(g_i\) 表示一个圆内部长度总和。简单转移即可。
-
-
cf1819D
感觉没必要 deque。毕竟直接 set 或者二分呗。 -
cf1819C
注意到不是毛毛虫肯定无解。把直径当成毛毛虫的躯干。链上标号 \(1\to m\),那么肯定是从 \(1\) 跳到 \(2\) 的脚,最后 \(p_n\) 是 \(2\) 的脚,或者从 \(1\) 的脚调到 \(2\),这取决于直径的长度。
-
cf1819B
又笨了。想了好久才会。
注意到 \(h,w\) 其中一个在输入中出现过,以 \(h\) 出现过为例,那么取出所有 \(a_i=h\) 删去,然后变成了一个子问题,不过就要求 \(w\) (另一维)出现过,最后构造完之后还要满足子问题 \(h\) 和当前 \(h\) 一样。
因为总面积已知,那么知道一维之后就知道了两维,可以给子问题规定好大小。
-
cf1858E2
-
cf1838E
怎么我都会做来着。
枚举匹配了 \([0,m)\) 位来容斥。比如匹配了 \(i\) 位,那么选 \(i\) 个位置放 \(a_1\dots a_i\) \([1,p_1)\) 之间不能出现 \(a_1\),\((p_i,p_{i+1})\) 之间不能出现 \(a_{i+1}\) 所以方案数就是 $\binom mi (k-1)^{m-i} $
-
cf1856E2
一棵子树的标号肯定是一个连续区间,考虑树根放几。其实是我们希望它尽量靠近 \(\frac{siz-1}2\),这看起来就很像关于子树 siz 的背包。
注意到如果重儿子大小大于全树的一半,那么根的值容易确定。所以我们需要做背包的点的大小是 \(\le \frac{n}{2^i}\)。
不难发现子树的 siz 只有 \(\sqrt {siz}\) 种,所以可以进行二进制分组。那么复杂度是 \(\frac{m\sqrt m}{\omega}\) 有题解证明这里二进制分组不带 \(\log\) 所以总复杂度就是 \(\frac{n\sqrt n}{\omega}\)
这里 bitset 长度有点问题,可以使用 template 的语法实现:
template<int len=1>int sol(int n){ if(len<=n)return sol<min(len*2,N)>(n); bitset<len>st;st[n-1]=1; }
-
cf1849F
xor mst 就是 cf888G。做法是用 boruvka, boruvka 是 “每轮计算每个点向连通块外面呢的点的连边的边权最小值”。然后用这 \(n\) 条边合并连通块。每轮至少一半的连通块被合并了,所以 log 轮。
回到 cf1849F。对完全图建出 Xor MST,不难发现集合肯定是对 MST 黑白染色来划分最优,做完了。
最开始的想法是二分答案(按位确定),然后模拟黑白染色,复杂度也一样。 -
arc105e
最终状态一定是 \(1\) 和 \(n\) 所在的连通块分别是 \(x,n-x\)。那么要连的边的数量就是 \(\frac{n(n-1)}2-m-x(n-x)\),我们要分析它的奇偶性。
如果 \(n\) 是奇数,那么 \(x(n-x)\) 肯定是偶数,那么判断 \(\frac{n(n-1)}2\) 的奇偶性就行了。
否则考虑 \(1,n\) 初始所在的连通块的奇偶性。如果奇偶性相同,它们一定可以一直相同下去。还是归结到 \(\frac{n(n-1)}2\) 的奇偶性;如果奇偶性不同,那么先手必胜。 -
abc236G 倍增 floyd,矩阵乘法是直接取min
-
arc105f 又笨了。
联通的容斥肯定是放到最后去枚举 1 所在连通块来计算。
于是计算任选边得到二分图的方案数。那么枚举左部点,方案数就是中间那些边选或者不选。这个和之前的某题很像,不过那题好像一直在乘二,更笨了,最后整个除一手就完事了。
-
abc236H 重新看了一遍。
-
abc232g
把 \(a_u+b_v \bmod m\) 变成在数轴上走。即 \(\\ x\to -a_x c=0\\b_x\to x\ c=0\\\forall i\in[0,m),i\to i+1\ c=1\) 离散化之后再最短路就行了
-
abc232h
容易找到一个走法从矩形一个角进入,从对角退出。
那么分成终点在角/在边/在中间讨论即可,非常麻烦。
-
abc201f
\(b_i\leftarrow \min(a_i,b_i),c_i\leftarrow \min(a_i,c_i)\)
\(1\sim s\) to the left,\(t\sim n\) to the right. Those who choose \(a_i\) forms an interval on range. There must be some is not moving and their position forms an incresing subsequence.
\(dp_i\) 表示让 \(1\sim i\) 是任意动的和往左挪的元素花费总和,此时要么全部元素往左移(前缀和计算),要不一些往左移,一些任意动,最后一个不动(枚举上一个不移动的点,注意是二维偏序,要用树状数组)。
-
abc275g
so hard
首先可以发现存在一个有理数和精确值误差小于 \(10^{-6}\)
其次我们发现二分答案中被 check 的都是有理数
回归原问题了
原问题本质上是求 \(\dfrac{\sum k_i c_i}{\max\{\sum k_ia_i,\sum k_ib_i\}}\) 在分母趋向于 \(+\infty\) 时候的答案。我们上下同时除以 \(\sum k\) 那么将 \(k_i\) 的形式,由任意非负整数变成 \([0,1]\) 之间的任意有理数,且满足 \(\sum k_i=1\)。对于一个实数,我们都可以找到一个有理数让它们的差异小到影响不了最终答案,所以我们可以另写为 “\(k_i\) 是任意实数”对于上面的式子,可以理解为,对于某种特定的价值,求最小的 \(\max\{\sum ka,\sum kb\}\)。又因为 \(k\) 是任意实数,所以我们可以改写每个物品的 \(a\leftarrow \frac ac,b\leftarrow\frac bc,c\leftarrow 1\) 来表示它单位价值对 \(\max\{\sum ka,\sum kb\}\)。这肯定是不影响答案的。
剩下的是 \(01\) 分数规划.
-
arc099e
全错了。
原图能分成两个完全子图,等价于 supplement 中没有奇环。那么在补图里面求出来每个连通块的黑点数量和白点数量做一个表示“能不能凑出来的”背包就行了。
-
abc247g
行列建点,最小费用最大流。
-
agc008d
最好笑的一集。
两款限制,第一款 \(i-1\) 个 \(i\) 的位置小于 \(p_i\) 而且第 \(i\) 个 \(i\) 的位置是 \(p_i\) 第 \(n\) 个数的位置 \(\le n^2\)。
那么直接按照 \(p_i\) 从小到大处理,找到当前序列前 \(i-1\) 个空的位置放上 \(i\) 就行了,放不了就失败。同样在按照 \(p_i\) 从大到小处理,找到当前序列后 \(n-i\) 个空位置放上 \(i\).
-
agc045a
倒序维护 \(S_i\),如果 \(x\in S_i\) 表示 如果在进行完第 \(i\) 轮游戏后 obtain 了 \(x\),那么 0 号选手获胜
那么可以分析一下这个过程,如果 \(p_i=0\) 那么 \(S_{i-1}=S_i|(S_i\oplus x)\) 这里集合异或元素表示集合里面每个元素异或 \(x\) 得到的数。\(p_i=0\) 那么得要 \(x\oplus a_i\in S_i,x\in S_i\) 都满足才能使得 \(x\in S_{i-1}\)
But such constraint is equivalent to 'if \(x\in S_i\) then \(S_{i-1}=S_{i}\),otherwise \(S_{i-1}=\emptyset\)' thus use a linear basis to check whether \(\forall i\ s.t. p_i=0,a_i\in S_i\)
-
agc040D 就是强行把原题题形式化表述一下,然后贪心
-
agc040C 原题限制放到相邻两位上,这两位一定是一个奇数一个偶数。那么把奇数下表的 A 变成 B,B 变成 A。这时候变成了不能同时删除 AA 或者删除 BB。所以把 A 看成 -1 B 看成 1
这时候如果能删空等价于字符串权值和为 0,其中 C 可以任选 -1/1
assume that we have x As,y Bs,n-x-y Cs,then the contraints could be denoted as \(n-x-y\ge |x-y|\). we get \(x,y\le \frac n2\) by solving the inequalities. find the final answer by inclusion-exclusion priciple.
-
agc039B
有解的条件就是我们可以对图进行二分图染色
那么最大的 K 就是任意两点之间最短路的最大值。如果构造方案就是按照路径顺序进行铺设。
-
百度之星以赛代练。
-
cf1917F
将 \(l\) 排序,如果 \(l_n>\frac d2\) 那么 \(l_n\) 必然在直径上,背包一个 \(d\) 即可。如果 \(l_n+l_{n-1}>d\) 那么不行。
如果 \(l_n<\frac d2\) 那么需要满足找到两个子集满足 \(\sum S_1+\sum S_2=d\) 并且 \(\min(\sum S_1,\sum S_2)>l_n\) 使用
std::bitset
加速 dp 即可。这个加速分为两种,\(g_{i,j}\) 从 \(g_{i-l,j}/g_{i,j-l}\) 转移,对应 or“自己右移” 和 orbitset[i-l]
-
cf1916E
肯定是每个点当成 LCA 计算每个儿子子树里面 diff 最大。
本质上是在 dfs 序上一段区间计算每个点 diff 的最大值。那么就找到 \(x\) 子树里面满足“到 \(x\) 路径上没有颜色为 \(col_x\)” 的点 \(y\) 并且 \(col_y=col_x\) 给 \(y\) 子树对应区间减一,\(x\) 子树对应区间整体加一。这样的 \((x,y)\) 可以在 dfs 的过程中记录链上最后一次颜色出现来实现。
-
cf1916D
\(n=3\) 样例给了。想从 n 的结果变成 n+2 的结果,可以对这 n 个数字乘 100 来保证它们还是平方数。
此时还差两个数,不难发现你现在手头有 1 6 9 和一堆 0,观察一下 10..03 30..01 的平方发现他们正好能凑成这样,做完了。
-
cf1913E
这题做得最快,直接费用流就行了,原来是 \(0\) cost 就是 1,否则 cost 是 0。注意 mcmf 的 max flow 需要等于 \(\sum A\) 也要等于 \(\sum B\)
-
cf1904E
找到 x 的祖先中没有被 ban 且深度最小的一个,记为 y。找到 y 子树里面被禁止的点,这些点的区间被抠掉,剩下的点求一个直径,区间直径,可以通过线段树或者 st 表解决。不难发现这样的区间的数量和被 ban 的点数是同阶的。
-
cf1902F
点分然后维护分治重心到每个点的线性基(\(\Theta(n\log n\log B)\)),每个询问合并一次线性基 \(\Theta(q\log^2n)\)
题解做法是维护根到每个点的线性基,然后合并询问端点的线性基。因为要保证点在路径上,也就是深度大于 \(lca\) 深度,那么在构建前缀线性基的时候用最深的点来表示。
for(int i=max_wei;i>=0;i--)if(val>>i&1){ if(!p[i]){p[i]=val,pos[i]=w;return;} else if(pos[i]<w){swap(pos[i],w);swap(p[i],val);} val^=p[i]; }
-
cf1903F
最老年写不动的一集
二分答案,2-sat。限制就是 u 不选 v 选。u 选 |u-v|<k 的 v 一定不选。好像也没什么逆否命题的事情。