首页 > 其他分享 >atcoder

atcoder

时间:2022-12-24 09:25:25浏览次数:55  
标签:atcoder frac 可以 AGC leq 考虑 DP

AGC 001 D

题目大意:有一个长度为 \(m\) 的序列 \(a\),它的和为 \(n\),需要将 \(a\) 重排,并构造一个任意长度但和为 \(n\) 的序列 \(b\),使得对任意长度为 \(n\) 的字符串,如果它能被 \(a\) 划分成一堆长度为 \(a_i\) 的回文串,且能被 \(b\) 划分成一堆长度为 \(b_i\) 的回文串,那么它的所有字符一定相同。

转化为图论问题,相当于是要使 \(n\) 个点的图连通。

如果 \(a_i\) 的奇数个数大于 \(2\) 无解。

把长度为偶数的 \(a_i\) 放中间,长度为奇数的 \(a_i\) 放两边。

端点处的 \(a_i\) 伸出一个接口。

中间的 \(a_i\) 伸出两个接口。

AGC 001 E

考虑组合意义。

相当于是求从 \((0,0)\) 走到 \((a_i+a_j,b_i+b_j)\) 的方案数。

考虑平移一下,求从 \((-a_i,-b_i)\) 到 \((a_j,b_j)\) 的方案数。

然后设 \(dp(i,j)\) 表示走到坐标 \((i,j)\) 的方案数。

\[dp(i,j)=dp(i-1,j)+dp(i,j-1) \]

刚开始把所有 \(i\) 对应的 \(dp(-a_i,-b_i)\) 加 \(1\),最后还要减去 \((-a_i,-b_i)\) 到 \((a_i,b_i)\) 的贡献再除以 \(2\)即可。

AGC 001 F

没见过的套路。

考虑 \(Q_i\) 表示元素 \(i\) 在原排列 \(P\) 中出现的位置。

那么原来的条件可以转化为,当 \(|Q_i-Q_j|\geq K\) 且 \(|i-j|=1\) 时可以交换 \(Q_i\) 和 \(Q_j\)。

因此,当 \(|Q_i-Q_j|<K\) 时,如果 \(i<j\),无论怎么调整,总有 \(i'<j'\)。

也就是说,当 \(|i-j|<K\) 时,如果 \(P_i<P_j\),无论怎么调整,总有 \(P'_{i}<P'_{j}\)。

因此,可以根据初始时 \(P_i\) 的大小关系建立 \(DAG\),使得字典序最小。

暴力拓扑排序的话可以把点放到一个小根堆里,每次取出编号最小的删除。

可以考虑使用线段树优化这一过程,一个点 \(x\) 入度为 \(0\) 仅当它在 \((x-K,x+K)\) 中值最小。

每次从小根堆中取出元素后把这个点删去,再分别查询 \((x-K,x)\) 和 \((x,x+K)\) 中最小的点,检验一下是否入度为 \(0\) 即可。

AGC 002 D

题目大意:有一张连通图,第 \(i\) 条边的边权为 \(i\),每次询问给定 \((x,y,k)\) 询问从 \(x\) 和 \(y\) 走出来的点集满足大小等于 \(k\) 时最大边的最小值是多少。

方法一:

可以离线,因此可以直接使用整体二分,答案用可撤销的按秩合并并查集维护,可以做到 \(\mathcal{O}(n\log n)\)。

方法二:

可以考虑建出 \(kruskal\) 重构树,每次询问二分一个答案,倍增往上跳,维护子树内的最大点权,时间复杂度 \(\mathcal{O}(n\log ^2n)\)。

AGC 002 E

用画图法解决博弈论。

考虑把 \(a\) 从大到小排序。

然后把数列 \(a\) 看成一个阶梯状的网格。

操作 \(1\) 相当于删除最左的一列网格。

操作 \(2\) 相当于删除最下的一行网格。

因此可以看成在网格上移动。

网格突出的地方满足 \(a_i>a_{i+1}\),为必败点。

于是可以 \(dp\) 求出网格上所有点的状态。

直接 \(dp\) 是 \(\mathcal{O}(n^2)\),无法通过本题。

观察一下状态的取值可以发现,一条斜线上的 \(dp\) 值相等。

因此可以从 \((1,1)\) 出发,找到 \((1,1)\) 所在斜线在网格内的最远点。

考察一下那个点与初始必败点间的位置关系即可。

AGC 002 F

终于懂了。

考虑一种颜色一种颜色地加,那么任意时刻白点的个数都大于等于颜色的种类数。

考虑给其它颜色编号,编号为 \(i\) 的颜色对应第 \(i\) 个白点,即编号为 \(i\) 的颜色一定是从左到右第 \(i\) 种出现的颜色。

这样,在我们加颜色的过程中,相当于是在给颜色编号,可以做到不重不漏。

设 \(f(i,j)\) 表示加入了 \(i\) 个白点,\(j\) 种颜色的方案数。

\[f(i,j)=f(i-1,j)+f(i,j-1)\binom{nk-i-(j-1)(k-1)-1}{k-2}(n-j+1) \]

AGC 003 D

首先,只需要考虑 \(\leq\sqrt{maxv}\) 的质因子,一个数如果含有 \(>\sqrt{maxv}\) 的质因子,它肯定可以选。

其次,每个数分解质因数后的指数都可以模 \(3\)。

每个数都这样处理,会得到一个新的数列,满足新的数列中的数有唯一对应的不能同时选入集合中的值,这个值可能和它不等,可能和它相等。不等的话取个 \(\max\),相等的话只能选一个。

这样做的复杂度是 \(\mathcal{O}(n\frac{\sqrt{maxv}}{\log maxv})\),其中 \(\frac{\sqrt{maxv}}{\log maxv}\) 在 \(10^4\) 左右,无法通过本题。

考虑把分解所用的质因子调少,只考虑 \(\leq\sqrt[3]{maxv}\) 的质因子。

假设分解过后还剩的数为 \(x\)。

如果 \(x=1\),那么没有影响,正常处理。

如果 \(x>1\),那么只可能是 \(p\),\(pq\),\(p^2\) 这 \(3\) 种情况,其中 \(p\) 和 \(q\) 都是质数。

如果是 \(p\),那么它要匹配的数需要乘上 \(p^2\)。

如果是 \(pq\),那么它要匹配的数需要乘上 \(p^2q^2\)。

如果是 \(p^2\),那么它要匹配的数需要乘上 \(p\)。

因此,判断一下 \(x\) 是不是完全平方数分类讨论一下即可,时间复杂度为 \(\mathcal{O}(n\frac{\sqrt[3]{maxv}}{\log maxv})\)。

这道题提示我们根号分治不一定只是二次根号,还可能是多次根号。

AGC 030 D

一般的题目都是通过方案数求得概率,这道题说明还可用概率求方案数。

观察到每次交换只会影响 \(\mathcal{O}(n)\) 个点对间的概率,但被影响方案数的点对较多,因此可以从概率的角度入手。

设 \(f(i,j)\) 表示 \(a_i<a_j\) 的概率,每次转移为 \(\mathcal{O}(n)\),因此总复杂度为 \(\mathcal{O}(nq)\)。

AGC 041 D

第三个限制较难,先考虑第三个限制。

对于一个大小为 \(k\) 的子集 \(S\) 和一个大小为 \(k+1\) 的子集 \(T\),需要满足第三个限制,相当于使得 \(S\) 集合的最大值小于 \(T\) 集合的最小值。

于是贪心地构造,排序后把前 \(k+1\) 个数放到 \(T\) 集合,后 \(k\) 个数放到 \(S\) 集合,那么第三个限制等价于前 \(\lfloor\frac{n}{2}\rfloor+1\) 个数的和大于后 \(\lfloor\frac{n}{2}\rfloor\) 个数的和。

再考虑第一个限制,这相当于每次选择一段前缀减 \(1\)。

于是可以预处理出每段前缀减 \(1\) 后对前 \(\lfloor\frac{n}{2}\rfloor+1\) 个数和后 \(\lfloor\frac{n}{2}\rfloor\) 个数的差的影响,跑一个完全背包即可。

ARC 104 D(背包DP,平均数)

题意

有 \(N\) 种数 \(1\) 到 \(N\),每种数可以选择 \(0\) 到 \(K\) 个。

需要对每个 \(x = 1,2,3,\cdots n\),求出选择一些数,和的平均数为 \(x\) 的方案数,对 \(M\) 取模。

\(1 \leq N,K \leq 100\),\(10 ^ 8 \leq M \leq 10 ^ 9 + 9\)。

题解

发现平均数不好处理。

假设选出的集合为 \(S\),那么需要满足 \(\sum _ {v \in S} v = |S|x\)。

把每个 \(v\) 减去 \(x\) 得 \(\sum _ {v \in S} v - x = 0\)。

这相当于是从 \(1\) 到 \(x - 1\) 中选一些数,从 \(1\) 到 \(n - x\) 中选一些数,使它们的和相等的方案数。

设 \(f(i,j)\) 表示前 \(i\) 种数和为 \(j\) 的方案数。

使用多重背包的前缀和优化可以做到 \(\mathcal{O}(n ^ 3 k)\)。

ARC 104 E(搜索,DP)

题意

有 \(n(1\leq n \leq 6)\) 个数,每个数的范围为 \(1\) 到 \(a _ i(1 \leq a _ i \leq 10 ^ 9)\),求所有填数方式中最长上升子序列的长度和。

对 \(10 ^ 9 + 7\) 取模。

题解

\(n\) 很小,于是可以先搜出所有可能的相对大小关系。

对于一种确定的相对大小关系,考虑 DP。

将所有的上界从小到大排序后可以发现,每种数一定只会出现在某两个相邻的上界之间。

设 \(f(i,j)\) 考虑了前 \(i\) 种上界,放了前 \(j\) 种数的方案数。

转移考虑新的上界之间放几个数,判断一下合不合法即可。

ARC 105 D(博弈论,结论)

题意

有 \(n(1 \leq n\leq 10 ^ 5)\) 个背包,\(n\) 个盘子,背包 \(i\) 里有 \(a _ i(1 \leq a _ i \leq 10 ^ 9)\) 个硬币,初始时盘子里没有硬币。

两个人轮流操作,如果还有背包有硬币,那么可以选择一个背包,把全部硬币导入某个盘子中,如果没有背包有硬币,那么可以选择一个盘子,至少取走一个硬币,最后不能操作的人输。

题解

简单题结论题,虽然我还是没有做出来。

首先当背包里的硬币全部转移到盘子上的时候,就是一个简单的 Nim 游戏,如果异或和大于 \(0\),先手必胜,否则后手必胜。

如果 \(n\) 是奇数,Nim 游戏的时候后手先取,由于无论先手怎么放硬币,后手总能使一个盘子的硬币总数大于一半,因此后手必胜。

如果 \(n\) 是偶数,与奇数的情况类似,只是要特判所有数字出现次数都是偶数的情况。

ARC 105 E(博弈论,结论)

题意

有一张 \(n\) 个点 \(m\) 条边的无向图,两个人轮流操作,每次操作后需要满足下面两个条件:

  1. 节点 \(1\) 和节点 \(n\) 不连通。
  2. 没有重边和自环。

谁不能操作就输了,问谁能赢。

题解

假设最后 \(1\) 所在连通块的大小为 \(x\),那么能够连的边数为 \(\frac{n(n-1)}{2}-x(n-x)-m\)。

首先,如果 \(n\) 是奇数,那么这个公式的奇偶性固定,可以直接得到答案。

现在考虑 \(n\) 是偶数的情况。

假设 \(1\) 所在的连通块大小为 \(a\),\(n\) 所在的连通块的大小为 \(b\)。

如果 \(a\) 和 \(b\) 的奇偶性相同,那么除去 \(1\) 和 \(n\) 必然剩余偶数个点。如果 \(\frac{n(n-1)}{2}-ab-m\) 为偶数,无论先手怎么操作,后手总能消除他的影响,因此后手必胜。否则,\(\frac{n(n-1)}{2}-ab-m\) 为奇数,那么先手必然可以通过一次操作调整奇偶性,然后效仿之前后手的操作即可必胜。

如果 \(a\) 和 \(b\) 的奇偶性不同,那么必然存在一个除去 \(1\) 和 \(n\) 的连通块大小为奇数,因此,先手总可以调整使得这个式子为偶数且 \(a\) 和 \(b\) 的奇偶性相同,转化为上面一种情况可以得出先手必胜。

ARC 105 F(状压DP,容斥)

题意

有一张 \(n\) 个点 \(m\) 条边的简单无向图,问选出一个边集,使得 \(n\) 个点与这些边构成的图连通,并且图是二分图的方案数。

对 \(998244353\) 取模。

\(1\leq n\leq 17,n-1\leq m\leq \frac{n(n-1)}{2}\)。

题解

注意到连通图这个限制不好处理,于是可以考虑容斥。

设 \(g(S)\) 表示给集合 \(S\) 染色,不保证连通的方案数,\(f(S)\) 表示给集合 \(S\) 染色,保证连通的方案数,\(e(S)\) 表示集合 \(S\) 内部的边数。

\[g(S)=\sum_{T\subset S} 2^{e(S)-e(T)-e(S\oplus T)} \]

求解 \(f(S)\),可以考虑用总的方案数减去不连通的方案数,通过枚举 \(S\) 中的一个连通块转移。

为了防止算重,可以钦定 \(S\) 中的任意一个元素 \(x\) 在选择的连通块中。

\[f(S)=\sum_{T\subset S,x \in T}f(T)g(S\oplus T) \]

ARC 106 E(二分,Hall 定理)

题意

你经营着有 \(N\) 个员工的商店,每个员工会工作 \(a _ i\) 天然后休息 \(a _ i\) 天。

每一天你可以选择一个员工给他一枚奖章,问要使得每个员工都有 \(K\) 枚奖章最少需要多少天。

题解

首先,可以二分答案,问题转化为能否在 \(x\) 天内给每个人 \(K\) 个奖章。

这可以抽象成二分图匹配:左边有 \(NK\) 个点,右边有 \(x\) 个点,左边的点与右边的点有连边表示能够在那一天给那个人一枚奖章。

现在需要判断这张二分图是否存在最大匹配。

注意到只需要判断是否存在最大匹配,并不需要求出具体的最大匹配是多少,于是可以考虑 Hall 定理:对于任意一个左部点的集合 \(S\) 假设它能连到的右部点的集合为 \(e(S)\),满足 \(|S|\leq |e(S)|\)。

有一个结论是,我们并不需要枚举 \(2^{NK}\) 个集合,只需要枚举 \(2^N\) 个集合,并钦定集合中一定包含了每个人的那 \(K\) 个点。

这是因为我们只需要找到那些最不可能满足条件的集合就行了,而对于固定的人的集合 \(S\),\(|S|-|e(S)|\) 取得最大值是在每个人都选满 \(K\) 天的时候(天数越大越容易超过 \(x\))。

所以,只需要二分答案后枚举 \(2^N\) 个集合判断即可。

ARC 106 F(计数,prufer序列,生成函数)

题意

有 \(N\) 个点,每个点有 \(a_i\) 个孔,每次可以选择两个不同点,连接两个未被连接过的孔,有多少中方案使得最后形成一棵树。

题解

考虑 prufer 序列,假设第 \(i\) 个点的度数为 \(deg_i\),那么答案为

\[(N-2)!\prod_{i=1}^{N}\frac{a_i^{\underline{deg_i}}}{(deg_i-1)!} \]

考虑生成函数

\[f_i(x)=\sum_{j=0}\frac{a_i^{\underline{j+1}}}{j!}x^{j}=\sum_{j=0}\frac{a_i!}{j!(a_i-j-1)!}x^j=a_i\sum_{j=0}\binom{a_i-1}{j}x^{j}=a_i(x+1)^{a_i-1} \]

那么答案为

\[(N-2)![x^{N-2}]\prod_{i=1}^{N}f_i(x)=([x^{N-2}](x+1)^{\sum (a_i-1)})(N-2)!\prod a_i \]

\[\binom{\sum (a_i-1)}{N-2}(N-2)!\prod a_i \]

ARC 107 D(背包DP)

题意

选择 \(n\) 个数,每个数只能是 \(\frac{1}{2^i}(i\geq 0)\),使得它们的和为 \(k\) 的方案数。

题解

设 \(f_{i,j}\) 表示考虑了前 \(i\) 个数,和为 \(j\) 的方案数。

分两种情况:

  • 选 \(1\),从 \(f_{i-1,j-1}\) 转移。
  • 不选 \(1\),从 \(f_{i,2j}\) 转移。

若 \(i<j\),\(f_{i,j}=0\)。

AGC 030 F(DP)

首先,如果 \(i\) 和 \(i+1\) 都不是 \(-1\),那么可以直接配对。

于是现在只有两个 \(-1\) 或一个 \(-1\) 的情况。

先不考虑两个 \(-1\) 之间的排列顺序,最后乘上一个阶乘即可。

现在问题转化成给一大一小的数配对的方案数。

记 \(val_i\) 表示 \(i\) 是否在序列中出现。

按照从大到小DP,设 \(f_{i,j,k}\) 表示考虑了大于等于 \(i\) 的数,有 \(j\) 个 \(val=0\) 的未匹配的数,\(k\) 个 \(val=1\) 的未匹配的数,能够得到的数列个数(不考虑两个 \(-1\) 间的相对顺序)。

时间复杂度 \(\mathcal{O}(n^3)\)。

AGC 013 D(DP)

小粉兔的题解

AGC 036 D(差分约束,负环,DP)

不存在负环等价于差分约束存在一组解。

考虑差分约束的变量 \(x_i\),因为 \(i\) 向 \(i+1\) 连的边权为 \(0\) 的边不会删去,因此满足 \(x_i-x_{i+1}\geq 0\)。

令 \(p_i=x_i-x_{i+1}\),需要满足 \(p_i\geq 0\),再令 \(s_i\) 为 \(p_i\) 的前缀和。

如果 \(i\) 向 \(j\) 连了一条边权为 \(-1\) 的边,那么 \(x_i-x_j\geq 1\),即 \(s_{j-1}-s_{i-1}\geq 1\)。

如果 \(j\) 向 \(i\) 连了一条边权为 \(1\),的边,那么 \(x_i-x_j\leq 1\),即 \(s_{j-1}-s_{i-1}\leq 1\)。

可以发现 \(p_i\) 的取值只能是 \(0,1\)。

现在问题转化为有 \(n-1\) 个取值为 \(0,1\) 的变量,如果一个连续段的和大于 \(1\) 会付出一定代价,如果小于 \(1\) 会付出一定代价,求最小代价。

考虑 DP,设 \(f_{i,j}\) 表示最后一个 \(1\) 的位置为 \(i\),倒数第二个值为 \(j\),只考虑右端点小于等于 \(i\) 的连续段的最小代价。

使用二维前缀和优化即可做到 \(\mathcal{O}(n^3)\)。

AGC 040 E(DP)

将序列分成两个序列相加的形式,令 \(a_i=b_i+c_i\),于是答案等于 \(\sum[b_i>b_{i+1}]+\sum[c_i<c_{i+1}]\)。

设 \(f_{i,j}\) 表示前 \(i\) 个数,\(b_i=j\) 的最小代价。

\[f_{i,j}=\min_{k=0}^{a_{i-1}}(f_{i-1,k}+[j<k]+[j<k+a_i-a_{i-1}]) \]

可以发现对于同一个 \(i\),一定有 \(f_{i,0}\leq f_{i,a_i}+2\),而对于同一种取值的 \(f_{i,j}\),\(j\) 肯定越小越好。

于是只需要对每个 \(i\),维护 \(3\) 个 \(j\) 即可,时间复杂度 \(\mathcal{O}(n)\)。

AGC 032 E(结论,调整法,二分答案)

结论是一定存在一个分界点,满足左边首尾匹配后小于 \(M\),右边首尾匹配后大于等于 \(M\),可以通过调整法证明。

于是二分答案即可。

小粉兔的题解

AGC 010 E(拓扑排序)

先考虑 \(a\) 固定的下最终的序列是什么。

如果存在 \(i<j\),满足 \(a_i\) 与 \(a_j\) 不互质,那么 \(a_i\) 与 \(a_j\) 的相对顺序已经固定,可以根据这个建出一张 DAG。

而后手要使得字典序最大,用大根堆维护拓扑序即可。

下面考虑先手的策略。

先手要使得字典序尽可能小,于是可以从小到大枚举权值 \(a_u\),枚举所有与它不互质的数 \(a_v\),如果 \(v\) 没有访问过,那么 \(u\) 向 \(v\),然后访问 \(v\),递归下去。

对建出的图求一个最大拓扑序即可。

AGC 027 E(结论,贪心,DP)

参考 小粉兔的题解

首先,有个经典套路,将字符串中的 \(a\) 看成 \(1\),\(b\) 看成 \(2\),那么每次操作后模 \(3\) 意义下的和不会改变。

然后,有一个结论,对于一个固定的字符串 \(s\),\(s\) 能够变成字符 \(c\) 当且仅当 \(|s|=1\) 或 \(s\) 存在相邻的两个字符相同且 \(s\) 模 \(3\) 意义下的和与 \(c\) 相等。

根据这个结论,我们可贪心地判断 \(s\) 是否能够变成 \(t\)。

对于 \(t\) 的每个字符,找到 \(s\) 极短的一段前缀能够替换成那个字符,且必须满足最后 \(s\) 的字符在模 \(3\) 意义下和为 \(0\)。

先特判掉没有相邻字符相等的情况,然后考虑对这个贪心的过程DP。

设 \(f_i\) 表示以 \(i\) 开始的后缀能够变成的 \(t\) 的个数,为了方便,转移时可以加入一个空串,最后再减去即可。

时间复杂度 \(\mathcal{O}(n)\)。

AGC 017 F(轮廓线DP)

很妙的轮廓线DP。

先把一条折线用一个 \(01\) 序列表示,\(0\) 和 \(1\) 分别表示往左还是往右,然后不难想到一个暴力的状压DP,设 \(f(i,S)\) 表示考虑了前 \(i\) 条折线,其中第 \(i\) 条折线的状态为 \(S\) 的方案数,时间复杂度是 \(\mathcal{O}(m4^n)\)。

考虑轮廓线DP。

设 \(f(i,j,S,d)\) 表示前 \(i\) 条折线,第 \(j\) 行,轮廓线状态为 \(S\),第 \(j\) 行上第 \(i\) 条折线与第 \(i-1\) 条折线的距离为 \(d\) 的方案数,时间复杂度为 \(\mathcal{O}(mn^22^n)\)。

考虑继续优化。

可以发现当前状态如果合法,如果这一位没有限制,那么这条折线可以往左走,如果有,那么可以往右走,问题在于没有限制但却往右走的情况很麻烦。

可以考虑设 \(f(i,j,S)\) 表示前 \(i\) 条折线,第 \(j\) 行,轮廓线状态为 \(S\) 的方案数。其中 \(S\) 的 \(0\) 到 \(j-1\) 位表示当前折线的状态,而后面那些位表示限制,如果为 \(0\) 表示可以填 \(0/1\),如果为 \(1\) 表示只能填 \(1\)(类似数位DP)。

考虑转移。

  • 第 \(j\) 位为 \(1\),只能向右走,\(f_{i,j-1,S}\longrightarrow f_{i,j,S}\)。

  • 第 \(j\) 位为 \(0\),可以往左也可以往右,如果往左,之后的限制并不会被影响,\(f_{i,j-1,S}\longrightarrow f_{i,j,S}\)。

    如果往右,会改变之后的限制,因为先在可以不管限制往左一次,也就是说,可以去掉 \(j\) 位之后的第一个 \(1\),令 \(0\) 到 \(j-1\) 位构成的集合为 \(T\),\(j\) 位以及之后构成的集合为 \(U\),那么 \(f_{i,j-1,S}\longrightarrow f_{i,j,T\cup j\cup (U-lowbit(U))}\)(不严谨,看代码)。

ABC 276 G(组合数学,差分)

题目要求相邻两个数模 \(3\) 不同余,这个限制不好处理,考虑差分。

假设差分后的序列为 \(d_i=a_i-a_{i-1}\),那么需要满足如下限制:

  • \(d_i\geq 0\)。

  • 如果 \(i\geq 2\),\(d_i\) 模 \(3\) 只能是 \(1\) 或 \(2\)。

  • \(\sum d_i\leq m\)。

假设 \(d_i=3y_i+x_i\),那么 \(\sum y_i\leq \lfloor \frac{m-\sum x_i}{3} \rfloor=t\),方案数为 \(\binom{t+n}{n}\)。

AGC 012 D(组合数学,结论)

如果 \(a\) 能和 \(b\) 交换,且 \(a\) 能和 \(c\) 交换,那么 \(a,b,c\) 的顺序可以任意排列,因此,相对顺序可以改变的性质具有传递性。

于是可以轻易得到一个 \(\mathcal{O}(n^2)\) 的做法,枚举所有点对 \((i,j)\),如果 \(i\) 和 \(j\) 能交换那么就把它们合并到一个连通块,最后的答案就是所有连通块答案的积。

再思考一步可以发现,连边只和每种颜色权值最小的点有关,分类讨论一下即可。

AGC 018 F(欧拉回路,构造)

对于一个节点 \(u\),如果在两个树上儿子个数的奇偶性不同,那么一定无解。

考虑建出一张有 \(2n\) 个节点的图,其中 \(1\) 到 \(n\) 号节点表示第一棵树,\(n+1\) 到 \(2n\) 号节点表示第二棵树,它们均保留原来树上的边,特别的,两个根之间连一条双向边。

此时,对于 \(1\leq i\leq n\),如果 \(i\) 号点的度数为奇数,那么 \(i\) 和 \(i+n\) 之间连一条双向边。

这样,所有点的度数都是偶数,存在欧拉回路。

跑一遍欧拉回路,考虑之前新增的边的方向,如果是 \(i\) 向 \(i+n\),那么 \(i\) 的值为 \(1\),否则为 \(-1\),对于没有新增边的点,值为 \(0\)。

证明可以考虑欧拉回路中每个简单环的贡献。

AGC 035 D(DP,逆推法,搜索)

最后一定会剩下下标为 \(1\) 和 \(n\) 的两个数。

考虑逆推,假设要在 \(a\) 和 \(b\) 中间插入一个数 \(v\),考虑 \(v\) 对答案的贡献。

设 \(a\) 将会被记入答案 \(x\) 次,\(b\) 将会被记入答案 \(y\) 次,那么 \(v\) 的贡献为 \(v(x+y)\)。

于是考虑设 \(f(l,r,x,y)\) 表示当前剩下的两个数的下标为 \(l\) 和 \(r\),\(l\) 将会记入答案 \(x\) 次,\(r\) 将会记入答案 \(y\) 次的最小和。

转移考虑枚举新加的数的位置

\[f(l,r,x,y)=\min_{l<i<r}f(l,i,x,x+y)+f(i,r,x+y,y)+a_i(x+y) \]

最后的答案为 \(a_1+a_n+f(1,n,1,1)\)。

这个算法的复杂度是多少呢?

可以发现,当 \(r-l\) 相同时运算次数是完全相同的于是有一个大概的式子(不严谨,但可以这么分析):

\[T(n)=\sum_{i<n}T(i) \]

设 \(S(n)\) 是 \(T(n)\) 的前缀和,那么

\[S(n)=2S(n-1) \]

于是时间复杂度为 \(\mathcal{O}(2^n)\) 。

AGC 015 D(结论,分类讨论)

令 \(l\) 和 \(r\) 从高到低第一个不同的二进制位为 \(p\),m = (l >> p << p) + (1ll << p),\(q\) 为 \(p\) 以下,\(r\) 的二进制为 \(1\) 的最高位。

把区间分成两部分:\([l,m)\) 和 \([m,r]\)。

  • \([l,m)\) 区间的数能够得到的数为 \([l,m)\)。
  • \([m,r]\) 区间的数能够得到的数为 [m, (r >> p << p) + (1ll << (q + 1)) - 1]
  • 最后再考虑两个区间之间的影响,能够的得到的数为 [l | m, m | (m - 1)]

AGC 016 F(博弈论,状压DP)

小粉兔的题解

AGC 014 D(博弈论,结论,树)

首先,如果原图存在完美匹配,那么后手获胜。

如果不存在完美匹配,先手每次选择叶子的父亲,那么后手必然选择那个叶子,如果存在一个点,它的儿子是叶子的个数大于 \(1\),那么先手可以获胜。

于是,先手可以每次都选择一个叶子的父亲删除,在它选择之后,后手的选法就确定了。

由于不存在完美匹配,因此到最后一定存在一个点,它的儿子是叶子的个数大于 \(1\)。

标签:atcoder,frac,可以,AGC,leq,考虑,DP
From: https://www.cnblogs.com/yanchengzhi/p/17002007.html

相关文章

  • AtCoder Beginner Contest 282
    https://atcoder.jp/contests/abc282A-GeneralizedABC原题链接题意给出一个数\(k\),输出A~Z中的前\(k\)个字母。分析从\(0\)到\(k\)枚举,将A加上\(i\)输......
  • AtCoder Beginner Contest 282
    《MakeBipartite2》思维,二分图  这个简单图可以有两种情况:1.全部点都通过边连起来,即连通分量只有一个,其自己2.还有有些点没有全部连起来,即有多个连通分......
  • (AtCoder Beginner Contest 282) D - Make Bipartite 2(二分图)
    题目大意:给定一个n个点m条边的图,请你在其中加一条边使得整个图G是二分图,问有多少种可能。(已有的边不能加)解题思路:首先我们要知道,二分图内是没有长度为奇数的回路的所......
  • atcoder ABC 282(A-C)
    A输入k,要从A打印到第k个大写字母。只要看懂题目就行。#include<iostream>usingnamespacestd;intmain(){ intk; scanf("%d",&k); for(inti=0;i<k;i++){ prin......
  • AtCoder Beginner Contest 282
    A-GeneralizedABC(abc282a)题目大意给定\(n\),输出一个字符串,从'A','B','C'...拼接得到的长度为\(n\)。解题思路模拟即可。神奇的代码#include<bits/stdc++.h......
  • AtCoder Beginner Contest 281 (A-D)
    A题意:输入一个整数,输出(n+1)行,从n一直输出到0.解法/思路:一个循环完事儿。代码:#include<iostream>usingnamespacestd;intmain(){ intn; cin>>n; for(in......
  • AtCoder Beginner Contest 280 (A-D)
    本人第一次写博客,若有不足还望指出(•̀ω•́)✧A题意:输入一个H行W列的字符矩阵,统计'#'的个数。解法/思路:挺简单的,直接贴代码吧。代码:#include<iostream>#incl......
  • HHKB Programming Contest 2022 Winter(AtCoder Beginner Contest 282)
    前言好久没有打AtCoder了。有点手生。只拿到了\(\operatorname{rk}1510\),应该上不了多少分。只切了\(\texttt{A,B,C,D}\)四题。A-GeneralizedABC简要题意给出......
  • AtCoder Regular Contest 143 E Reversi
    AtCoder传送门洛谷传送门翻转一个点会把它相邻的点全部翻转,因此先从叶子开始自下而上考虑。不难发现,如果这个叶子是白色,那么它一定比它的父亲先翻转(否则它就翻不了了);而......
  • AtCoder Regular Contest 150 F Constant Sum Subsequence
    AtCoder传送门洛谷传送门定义\(\mathrm{nxt}(i,x)\)为最小的\(j\)满足\(a_j=x\)且\(j>i\),\(\mathrm{pre}(i,x)\)为最大的\(j\)满足\(a_j=x\)且\(j<......