Atcoder 记录
Atcoder 记录
ARC193C Grid Coloring 3
题面:
给你一个 \(n\times m\) 的网格初始全没有被染色,每次可以选择 \((x,y,c),1\leq x\leq n,1\leq y\leq m,1\leq c\leq C\) 将,第 \(x\) 行和第 \(y\) 列全部染成第 \(c\) 种颜色(覆盖之前的颜色),可以操作任意次,问最终有多少种不同的染色方案。\(n,m<=400,C<=1e9\)
题解:
因为后面染色能覆盖前面的颜色,所以要将操作序列时光倒流,现在变成每次染还没有颜色的格子,有多少种方案。
在第一次操作(翻转操作序列前的最后一次操作)染了一个十字之后,钦定后面的每一次操作中心 \((x,y)\) 必须已经被染过色,那第 \(x\) 行和第 \(y\) 列中必有一个已经全部染色了,那么操作就变成了每次给一行或者一列染一个颜色(分别记为 \(A,B\) 操作),显然最终的答案是不变的。
但这时直接枚举每次操作是啥仍然不太可做,原因是对于操作序列中两次连续的 \(A\) 操作或 \(B\) 操作,交换他们的操作顺序不影响答案,所以会算重。由于 \(A\) 和 \(A\) 之间互不干扰,\(B\) 和 \(B\) 之间也是,这启发我们每次可以同时操作操作序列中一段极长的 \(A\) 或 \(B\),显然这样转化后答案仍然是对的,这就好做了。
将第一段特殊处理,枚举最终有 \(i\) 行 \(j\) 列都是第一次操作的颜色,方案数是 \(C\binom{n}{i}\binom{m}{j}\),然后进行 \(dp\)。
先设一个大概的雏形 \(f_{n,m,* }\) 表示给 \(n\times m\) 的网格染色的答案。
在此之后的下一个极长段中,显然不能有一行或一列的颜色和第一次操作的颜色一样,于是我们将 \(dp\) 改成 \(f_{n,m,t,* }\) 表示有 \(t\) 中颜色不能作为一行或一列全部相同时的颜色,显然 \(t\in\{0,1\}\)。
考虑下一个极长段,不妨设其是 \(A\) 操作的极长段,设此次操作了 \(r\) 行,方案数是 \((C-t)^r\),后续操作中不再有 \(t\) 的限制,所以从 \(f_{n-r,m,0,* }\) 转移过来。
但是为了保证这一段 \(A\) 是极长的,要求剩下的 \(n-r\) 行中不能有某一行的颜色全部相同,列同理,所以要记 \(f_{n,m,t,x,y}\),\(x,y\) 分别表示当前是否限定每一行(列)的颜色不能完全相同。发现 \(x,y\) 两个限制最多同时存在一个(如果同时存在两个的话就没有能操作的东西了)所以我们可以只记一个(下面只记列是否有限制),通过交换行列数来限定是行还是列,例如上边的转移被写作 \(f_{n,m,t,0}\leftarrow f_{m,n-r,0,1}\)。
然后是 \(f_{n,m,t,1}\) 的转移,要求是没有一列的颜色全相同。分两类讨论,如果这 \(r\) 行本身的颜色就有不同的,肯定符合要求,方案数是 \((C-t)^r-(C-t)\),从 \(f_{m,n-r,0,1}\) 转移过来。如果这 \(r\) 行都相同,那要求这列其余部分不能全都是当前的这种颜色,这个状态就是 \(f_{m,n-r,1,1}\) 的限制,方案数是 \((C-t)\)。
最后答案是 \(f_{n-i,m-j,1,0}+f_{m-j,n-i,1,1}\) 即考虑执行完最终第一次操作的那些之后的第一个极长段时 \(A\) 还是 \(B\)。
ARC193D Magnets
题面:
给两个长为 \(n\) 的 \(01\) 序列 \(A,B\),每次可以选择一个位置让每个 \(1\) 都向选的位置靠近一位,若一个位置上有多个 \(1\) 认为是一个。问最少多少次操作能让 \(A\) 序列和 \(B\) 序列一样,或报告无解。\(n\leq 1e6\)
题解:
观察操作发现,如果我们操作在所有 \(1\) 前或所有 \(1\) 后,可以起到一个平移的效果,即 \(A\) 中所有 \(1\) 的相对位置不变,这启示我们算出 \(A,B\) 的差分数组 \(da,db\)。问题转化为要把 \(A\) 的差分数组变成和 \(B\) 的差分数组一样(删去所有 \(da_i=0\))。
考虑一次操作会导致 \(da\) 发生什么变化:如果操作在两个 \(1\) 中间,会导致 \(da_i-2\)(称为 \(X_i\) 操作);如果操作在某个 \(1\) 上,会导致 \(da_i,da_{i+1}\) 都减少 \(1\)(称为 \(Y_i\) 操作)。特别的,如果操作在第一个或最后一个 \(1\) 上,只会令 \(da_1-1\) 或 \(da_m-1\)。
先不考虑这两个特殊的操作,那么每次操作都会让 \(da\) 的总和 \(-2\),操作次数的总和就是 \(\frac{\sum da_i-\sum db_i}{2}\)。我们让 \(da_i\) 依次和 \(db_j\) 匹配,如果 \(da_i>db_j\) 那么我们一直 \(da_i-2\) 直到 \(da_i==db_j+1\) 我们让 \(da_i-1,da_{i+1}-1\),然后匹配 \(da_{i+1},db_{j+1}\),否则如果 \(da_i<db_j\) 就把 \(da_i\) 减成零。如果最后 \(db_j\) 有剩下的没有配上或者 \(da_{m+1}\) 被 \(-1\) 了就不合法,我们就需要通过特殊操做尽量让他合法并保证次数最小。
要求最小次数,那我们只要执行尽量少的特殊操作就行了,因为别的操作都是 \(-2\) 而特殊操作是 \(-1\)。
有结论,特殊操做只会在开头和结尾各最多做一次。
如果最开始一下做了两次特殊操作(不妨设是在开头做的),那么可以将其改为一个 \(X\) 操作并向左平移一位,这样更改后没有变化操作数,连绝对位置都没有变化,可以替换。
如果匹配了某个 \(da\) 和 \(db\) 的前缀后 \(da_i\) 现在成了队头并对其做了一次特殊操作,那么考虑对 \(da_{i-1}\) 执行的操作,如果执行了 \(X_{i-1}\),可以替换为 \(Y_{i-1}\) 和对 \(i-1\) 是队头时的特殊操作,如果执行了 \(Y\) 操作类似,这样我们就把 \(i\) 这个位置的特殊操作前移了,以此类推,我们可以全部都移到最开始的位置做。
所以这题的做法就是枚举首尾是否进行特殊操作,然后按上述方式检测是否合法,同时统计操作次数。
ARC195E Random Tree Distance
题面:
给定一个长为 \(n-1\) 的序列 \(a_2\sim a_n\),对于一个长为 \(n-1\) 的满足 \(p_i<i\) 的序列 \(p_2\sim p_n\),以 \(p_i\) 为 \(i\) 的父亲 \(a_i\) 为 \(i\) 和 \(p_i\) 之间的边权,构造一棵以 \(1\) 为根的树。
\(Q\) 次询问,每次给出一个 \((u,v)\),问对于所有合法的序列 \(p\),以如上方式构造一棵树,树上 \(u\to v\) 的距离的和是多少。
\(n,Q\leq 2\times 10^5,1\leq a_i\leq 10^9\)
题解:
考虑转成期望计数,显然所有合法的序列 \(p\) 的方案数是 \((n-1)!\)。
两点间距离转换成 \(dis(u,v)=dep_u+dep_v-2\times dep_{lca(u,v)}\)。
设 \(E_x\) 为 \(dep_x\) 的期望深度,有转移方程 \(E_x=a_x+\frac{1}{x-1}\sum_{i=1}^{x-1}E_i\)。
然后求 \(dep_{lca(u,v)}\) 的期望,不妨设 \(u<v\),则一定有 \(lca(u,v)<u\),考虑暴力跳 \(lca\) 的过程,若 \(p_v>u\) 则和最开始的情况没有区别,若 \(p_v<u\) 则这次跳之后的落点在 \([1,v-1]\) 的概率相等,即发现 \(lca\) 在 \([1,u]\) 之内的概率是相等的。
因此有结论 \(\forall j_1,j_2>i,E(dep_{lca(i,j_1)})=E(dep_{lca(i,j_2)})\),所以 \(E(dep_{lca(u,v)})\) 与 \(v\) 无关。
设 \(f_i\) 表示 \(E(dep_{lca(i,*)}),*>i\),当 \(lca(i,*)=i\) 时,贡献是 \(E_i\),否则若 \(lca(i,*)=j,j<i\),贡献是 \(f_j\)。所以有转移 \(f_i=\frac{1}{i}(E_i+\sum_{j=1}^{i-1}f_j)\)。
最终答案是 \((n-1)!\times (E_u+E_v-2\times f_{\min(u,v)})\)。
ARC196D Roadway
题面:
\(n\) 个点排成一条线,由 \(n-1\) 条边顺次连接。有 \(m\) 个人,每个人从 \(s_i\) 走到 \(t_i\),初始其体力为 \(0\),经过一条边权为 \(w_i\) 的边后体力会加上 \(w_i\)。每个人都想使得走到 \(t_i\) 时体力是 \(0\) 且每个中间点的体力都是正整数。
\(Q\) 次询问,每次问只考虑 \([L_i,R_i]\) 的人,是否有一种给边赋权的方案使得满足每个人的要求。
\(n,m,Q\leq 4\times 10^5,\ \ |s_i-t_i|>1,\ \ (s_i,t_i)\not= (s_j,t_j)(i\not= j)\) 注意不保证 $s_i<t_i $。
题解:
考虑将每个点设一个势能 \(v_j\),连接 \(i,i+1\) 的边权 \(w_i=v_{i+1}-v_i\)。那么若一个人 \(s_i<t_i\),其限制转化为 \(v_{s_i}=v_{t_i},\forall j\in (s_i,t_i),v_j>v_{s_i}\)。如果 \(s_i>t_i\) 就是 \(v_j<v_{s_i}\)。
那如果只有 \(s_i<t_i\) 怎么做?每个 \((s_i,t_i)\) 不能有相交的边,可以包含。形式化的说,对于每个 \((i,j)\) 都要满足以下条件之一:
- \(t_i\leq s_j\) 或 \(t_j\leq s_i\)
- \(s_i<s_j<t_j<t_i\) 或 \(s_j<s_i<t_i<t_j\)
我们称其为条件 \((*)\)。
若有一对 \((i,j)\) 不满足 \((*)\),不妨设他们端点从左到右是 \(s_i,s_j,t_i,t_j\) 那根据限制有 \(s_j>s_i=t_i>s_j\to s_j>s_j\),是不合法的。
若都满足 \((*)\),则相离的区间互不干扰,包含的区间大小关系是确定的,所以一定存在解。
如果同时有 \(s_i<t_i\) 和 \(s_j>t_j\):
- 只考虑 \(s_i<t_i\) 的人要满足 \((*)\)。
- 只考虑 \(s_i>t_i\) 的人要满足 \((*)\)。
- 首先对于任意不同方向的 \((i,j)\) 有 \(s_i\not= t_j\) 且 \(s_j\not= t_i\)。
否则在两区间相等的边缘处的势能一定无法满足。
例如说 \(s_i<t_i,s_j>t_j,s_i=t_j\) 设 \(x=s_i=t_j\),那 \(i\) 要求 \(v_{x+1}>v_x\),\(j\) 要求 \(v_{x+1}<v_x\),这是矛盾的。
这三个条件都是合法的必要条件,而他们三个加起来也是充要的。
考虑一个 \(n\) 个点 \(m\) 条边的有向图,每条边从 \(s_i\to t_i\)。
对于一个 \(s_i<x<t_i\) 的点 \(x\) 我们称 \(x\) 被这条边覆盖。
如果暂时的把每条边看做无向边,则这个图可以切割成若干联通块,每个联通块内的连边一定形如 \(a\gets \cdots \gets d\gets x \to e \to \cdots \to g\)(可能不存在向左或向右的延伸)。我们称它为一条路径。一条路径的最左顶点为 \(l\),最右为 \(r\)。
\([l,r]\) 不交的两条路径其势能之间没有限制。
考虑相交的两条路径 \((i,j)\),设 \(l_i<l_j<r_i<r_j\),如果 \(i\) 中覆盖 \(l_j\) 的那条边 \(k\) 满足 \(s_k<t_k\) 则 \(i,j\) 的大小关系是 \(i<j\),否则是 \(i>j\)。
假设是 \(i<j\),那么对于 \(j\) 覆盖的某个点 \(x\),若覆盖 \(x\) 的那条边是 \(s_p<x<t_p\) 的,那么根据上述条件的限制,\(i\) 中覆盖这个点的边肯定是 \(s_q<s_p<x<t_p<t_q\),符合 \(i<j\) 的关系,反之亦然。
所以各个路径之间的大小关系可以的到一个 \(DAG\),并以此确定解。
在判断合法时第三个条件容易检查,第一二个条件可以使用 \(bit\) 维护 \(xor-hashing\) 来解决,具体可见代码。
双指针的对于每个 \(r=1\sim i\) 处理最远的合法左端点 \(f_r\),在询问时判断是否 \(l\geq f_r\) 即可。
ARC197D Ancestor Relation
题面:
给定一个 \(n\times n\) 的 \(01\) 矩阵 \(a\),如果 \(a_{i,j}\) 是 \(1\) 表示在以 \(1\) 为根的树中 \(i,j\) 有祖先后代关系,反之则没有。问符合条件的树的方案数。\(n\leq 400\)
题解:
首先将一张图 \(G\),若 \(a_{i,j}=1\) 则 \(i,j\) 之间有边,思考一种映射方式将这个图映射到一棵树。
考虑当前的树根 \(x\) 要满足的条件是 \(x\) 跟其连通块中的所有点都有连边,方案数就乘上符合这个条件的点的个数。
如果有多个符合条件的点可以任选一个当根,连通性不变,然后递归到新产生的所有连通块中处理。
ARC197E Four Square Tiles
题面:
有一个 \(n\times m\) 的网格,要在网格上放 \(4\) 个 \(k\times k\) 的矩形,任意两个矩形不能有交,问方案数。\(n,m,k\leq 10^9,n,m\leq 3k-1\)
题解:
根据题目限制,没有一行或一列可以放下三个矩形,所以四个矩形一定是左上右上左下右下,设他们的左上角坐标为 \((x_i,y_i)\)。
考虑行或列相邻的两个不交,有不等式:
- \(1\leq x_1,x_1+k\leq x_3,x_3+k-1\leq n\)
- \(1\leq x_2,x_2+k\leq x_4,x_4+k-1\leq n\)
- \(1\leq y_1,y_1+k\leq y_3,y_3+k-1\leq n\)
- \(1\leq y_2,y_2+k\leq y_4,y_4+k-1\leq n\)
化简得:
- \(1\leq x_1<x_3-k+1\leq n-2k+2\)
- \(1\leq x_2<x_4-k+1\leq n-2k+2\)
- \(1\leq y_1<y_3-k+1\leq n-2k+2\)
- \(1\leq y_2<y_4-k+1\leq n-2k+2\)
方案数是 \(\binom{n-2k+2}{2}^2\binom{m-2k+2}{2}^2\)。
容斥掉不合法的情况就是对角的两个矩阵有交,显然不可能两对同时有交,所以只需要算一对有交的方案,另一对方案数是一样的。
那么有交的条件就是:
- \(1\leq x_1,x_1+k\leq x_3,x_3+k-1\leq n\)
- \(1\leq x_2,x_2+k\leq x_4,x_4+k-1\leq n\)
- \(1\leq y_1,y_1+k\leq y_3,y_3+k-1\leq n\)
- \(1\leq y_2,y_2+k\leq y_4,y_4+k-1\leq n\)
- \(x_4<x_1+k,y_4<y_1+k\)
化简得:
- \(1\leq x_2 < x_4-k+1<x_1+1<x_3-k+2\leq n-2k+3\)
- \(1\leq y_2 < y_4-k+1<y_1+1<y_3-k+2\leq m-2k+3\)
方案数是 \(\binom{n-2k+3}{4}\binom{m-2k+3}{4}\)。
所以最终答案为 \(\binom{n-2k+2}{2}^2\binom{m-2k+2}{2}^2-2\binom{n-2k+3}{4}\binom{m-2k+3}{4}\)。
ARC213B Hamming Distance is not 1
题面:
给定 \(L,R\) 求一个最大的集合 \(S\) 满足其中的元素都在 \([L,R]\) 之间,且任意两个元素的二进制至少差两位。\(0\leq L\leq R\leq 10^18\)。
题解:
考虑一个构造是发现所有 \(popcount\) 奇偶性相同的两两之间至少差两位,所以有一个答案是把所有 \(popcount\) 是奇数/偶数的所有数构成集合 \(S\),这样个数是 \(\lfloor\frac n 2\rfloor\)。
显然答案不可能超过 \(\lceil\frac n 2\rceil\),很多情况下上面的做法就最优了,但有一种特殊的是 \(L\) 是奇数 \(R\) 是偶数且最高位不同时,可以最高位是 \(0\) 的取 \(L\) 的奇偶性,最高位是 \(1\) 的取 \(R\) 的奇偶性。
ARC213C Double X
题面:
给你两棵 \(n\) 个点的树和一个数组 \(a_i\)。对于每个 \(1\leq k\leq n\) 求是否存在满足条件的四元组 \((x_1,x_2,x_3,x_4)\),如果存在求 \(\sum_{i=1}^4 a_{x_i}\) 的最小值。
- 四元组是四个不同于 \(k\) 的两两不同的数。
- 任意两点在任意一颗树上的路径都经过 \(k\)。
\(n\leq 10^5\)
题解:
先考虑不计复杂度的暴力,对于一个 \(k\),把它在第一课树中的所有子树染上不同的颜色,现在就是求 \(4\) 个点在第二课树种属于不同子树且颜色不同。
对于第一棵树 DSU on Tree 来染色,对于第二棵树的每个子树显然只有价值前四小的是有用的,可以线段树 dfs 序维护更改一个点的颜色。对于当前的 \(k\) 线段树询问所有子树有用的点,将颜色和子树连边求二分图最小权匹配。
由于每次点边个数是 \(O(deg_k)\) 级别的,总共就是 \(O(n)\) 的,注意费用流不能 SPFA。总复杂度 \(O(n\log^2 n)\)。
AT_xmascon20_f Famous in Russia
题面:
\(n\) 个顾客各点一道菜,做 \(i\) 顾客的需要 \(a_i\) 时间,顾客吃完需要 \(b_i\) 时间,同时只能做一道菜,但可以很多顾客都在吃。对于一个整数 \(k\),记 \(f(a,b,k)\) 表示任选其中 \(k\) 个顾客按任意顺序做他们的菜,从开始做到最后一个人吃完的最小时间。已知 \(b\) 序列,对于每个 \(k\) 输出,对于 \(a_i\) 在 \([1,V]\) 内任取整数的所有序列 \(a\),\(f(a,b,k)\) 的总和。 \(n\leq 30,V\leq 20,b_i\leq 600\)
题解:
首先考虑如果 \(a,b\) 都确定并且知道服务哪 \(k\) 个人,最优方案是什么,显然是按照 \(b\) 从大到小的顺序做这 \(k\) 个人的菜。
然后考虑如果知道 \(a,b\) 如何求出所有 \(k\) 的答案,做法将 \(b\) 从小到大排序,设 \(f_{i,j}\) 表示前 \(i\) 个人选了 \(j\) 个人服务的最短时间,转移是 \(f_{i,j}=\min(f_{i-1,j},\max(f_{i-1,j-1},b_i)+a_i)\),分别表示不选和选 \(i\) 的变化。
然后这个 DP 是下凸的,考虑如下 slope trick 计算答案:
- 将 \((a_i,b_i)\) 按照 \(b\) 从小到大排序,令 \(b_{n+1}=inf\),维护小根堆 \(q\) 初始有 \(inf\),变量 \(s=0\)。
- 然后遍历 \(i=1\sim n\):
- 若 \(s\) 与堆顶和 \(\leq b_i\),将 \(s\) 加上堆顶并将其弹出。
- 将堆顶元素减小 \(b_i-s\),令 \(s=b_i\)。
- 插入 \(a_i\)。
当 \(q\) 恰好弹出 \(k\) 个元素时的 \(s\) 即为服务 \(k\) 个人的答案。
考虑对此过程进行 DP,显然无法把堆放到状态中,所以考虑对于每个 \(a_i\),在插入式就提前决策其是否最终完全被弹出堆。下文弹出指完全弹出,如果部分被保留在堆中认为没有被弹出。设 \(f_{i,k,l,r,s}\) 表示考虑前 \(i\) 个已经钦定 \(k\) 个元素被弹出和当前答案 \(s\),以及最小不会被弹出的元素 \(r\),目前堆中最大的以后要被弹出的元素 \(l\),的方案数。
在上述 slope trick 中会发现 \(s\) 在任意时刻都是 \(\leq b_i\) 的,在 DP 中由于提前钦定一些东西最后一定会被弹出,他们的答案会在弹出前提前加入 \(s\),所以 \(s\) 可能会大于 \(b_i\)。
- 如果 \(s\leq b_i\),说明此时钦定被弹出的元素不在堆中,同时堆顶会减小 \(b_i-s\),所以 \(l'=0,r'=r-b_i+s,s'=b_i\)。
- 否则一定有元素钦定弹出但还在堆中,此时我们记录的是虚假的 \(s\),真正的 \(s\) 此时会变成 \(b_i\),那么 \(l\) 还能留在堆里的部分最多就是当前 \(s\) 和真正 \(s\) 的差值即 \(s-b_i\),其余不分不变。所以 \(l'=\min(l,s-b_i),r'=r,s'=s\)。
还有其余在加入一个元素时钦定它是那种情况以及统计答案的转移是简单的。

浙公网安备 33010602011771号