Atcoder做题总结

ARC058C

发现 \(x+y+z\) 最多只有 \(17\) ,考虑状压,状态中第 \(i\) 位表示是否可以得到和为 \(i\) 的后缀。
注意一下每个位置是放 \(1\) ~ \(10\) 而非 \(0\) ~ \(9\)


ARC133D

区间异或和不好搞,差分一下设 \(w_i = XOR_{k=1}^i k\)
容易发现规律: \(w_{4x}=4x\) , \(w_{4x+1}=1\) , \(w_{4x+2}=4x+3\) , \(w_{4x+3}=0\)
于是就可以快速计算了。


ARC129D

\(a_i\) 是在 \(i\) 处的操作次数,则有

\[2a_i - a_{i-1} - a_{i+1} = -A_i \]

注意到这个形式类似差分,所以设 \(b\)\(a\) 的差分,由上述式子可以得到 \(b_2\) ~ \(b_n\) ,又因为 \(\sum b_i=0\) 可以算出 \(b_1\) ,接下来找一个最小的 \(a_1\) ,使所有 \(a_i\) 都非负即可。


ARC129E

做不明白的网络流题终于有个懂的了!
最小代价 => 最小割
首先当然是 \(n\) 排点,每排 \(m\) 个依次相连,\(S\) 连最左边,最右边连 \(T\) ,此时割一条边 \((i,i+1)\)\(i\) 处的取值。
剩下的贡献,考虑对于一个 \([x,x+1]\) 的区间,它有贡献当且仅当两侧取的点穿过这个区间,于是由一侧的 \(x+1\) 连至另一侧的 \(x+1\) ,流量为 \(w\),注意要合并多条边。


ARC130F

有些许恶心。
跟“鱼戏团表演”可以说是非常相似了。
观察题目性质,当操作次数趋于无穷时,最后的结果会像是一个凸包的形式。
如果只是这样就没有什么恶心的地方了,直接求凸包算就行。

但是!
问题在于题目是取整的,这就导致了得到的结果实际上应该是折线。
对于“凸包”上的两个点,如何算他们之间的贡献呢?

很容易犯的错误是直接把直线画出来,然后对每个点下取整。
我们发现的问题在于,“下取整”这一操作会使直线发生改变,从而影响后面的答案。
稍微玩一下就能确定算贡献的过程,如果区间是 \((l,r)\) ,且 \(a_l < a_r\) ,就应该从 \(l\) 开始向右一个一个求贡献, \(f_i\) 应该由 \(f_{i-1}\)\(f_r\) 得到,而非 \(f_{l}\)\(f_r\)
正因为这一奇特的求贡献方式,我们要求的“凸包”长歪了。
联系题目性质,知道求凸包时斜率应下取整


AGC034F

《深度理解集合幂级数》

写出式子

\[F_x = 1 + \sum_{y}F_yG_{x \oplus y} \]

特别地,

\[F_0=0 \]

看到异或卷积联想到 FWT 。
用普通多项式的思路来看异或卷积的多项式,很自然的想法是

\[F=A+F * G \]

原本认为这里的 \(A\) 是系数全为 \(1\) 的多项式,但特殊项 \(F_0=0\) 需要额外处理,考虑特殊计算 \(A_0\) 的值。
\(x=1 , 2 ,\cdots n\) 时的式子累加,得到

\[\begin{align*} \sum_{i=1}^{2^n-1} F_x &= 2^n-1 + \sum_{y}F_y\sum_{x \not = y}G_y\\ &=2^n-1 + \sum_{y}F_y \left(1-G_y\right) \end{align*} \]

移项可得

\[F_0 = 1-2^n + \sum_{y}F_yG_y \]

于是 \(A_0=1-2^n\)
那么就是直接求 \(F=\frac{A}{1-G}\)

但很可惜,这是行不通的。

对于求逆,我们的想法是把 FWT 后的数组每个位置取逆元,再 IFWT 回去。
由于 \(G\) 的零次项一定是 \(1\),这个多项式 没 有 逆
于是我们把零次项拎出来另外看,可以发现其他项一定都不是 \(1\) ,每个数一定都有逆元。
一起做失败了那就分开每一项做,由线性性可知这是完全可行的。
那么就是每项都解一个一元一次方程,得到答案。

最后,我们一开始就知道了 \(F_0=0\) ,又因为 \(FWT(F)[0]=\sum_{i=0}^{2^n-1}F_i\) ,可以直接计算出 IFWT 前的 \(F_0\)


ARC148E

链的形式不完整,加一个极大值变成环。
\(< \frac{K}{2}\)\(\ge \frac{K}{2}\) 考虑,后者可以连续,前者有较紧的限制。
那么将前者从小到大处理,同时维护当前可用数的个数。
每次将最小值和左右两个数合并,保留一个极大值(它跟剩余的任意数都是可以相邻的)。
最后留下的若干可用数求圆排列数。

注意上面没有处理一些特殊情况。

  1. 原本的 \(a\) 中有相同的数,跟处理可重集排列一样除一个 \(cnt!\) 即可。
  2. 圆链中左右端都 \(< \frac{K}{2}\) ,此时可能出现的情况是可用数只有 \(1\) 个。
    由于此时环只有两个数,特判一下。

AGC058D

稍不一样的容斥。

按照正常的容斥,枚举有多少非法的段,问题在于段与段之间可能重合,不好计数。
然后观察非法段的性质,发现两个有重的非法段可以合并成一个大的非法块。
于是改一改容斥,钦定枚举的非法段一定是该非法块的结尾。
考虑计数,散块可以不受影响组合数直接填。非法段由其后的格子 ban 掉了一种形式,
于是分最后一块靠右和不靠右分别计算贡献。

posted @ 2022-03-02 21:24  Kelvin2005  阅读(280)  评论(0)    收藏  举报