2024.3 总结 / 在万籁归于灰烬时

倒序总结。建议倒叙阅读......?


link [tag: 构造]

考虑颜色数 \(c\) 一定时可以构造出的最大图,当 \(c=1\) 时最多直接放 \(k\) 的点两两连 1 的边。再递推 \(c=2\) 的情况,将 \(c=1\) 的图当成一个点,按照那种方式再连一次边即可,逐次递推。这样子大小为 \(n\) 的图需要 \(\log_kn\) 种颜色。具体而言,对于每条边,查询来自哪一层图即可。


link [tag: 网络流,曼哈顿]

有一个 navie 的 \(O(n^2)\) 建图,非常的不好。然后曼哈顿距离有一个好好の性质,\(|x-x'|+|y-y'|\) 四种绝对值的柿子直接算出来取 max 即为 real 的曼哈顿。

对于每一种运算,建立一个虚点,左右连上对应贡献的边,最大流保证距离最大,费用流保证最大贡献即可。


link [tag: 线性基,差分,线段树]

序列加入这个不会做,考虑一个差分数组 \(b_i=a_{i-1}⊕a_{i}\),那么对于一个 \(a_i\),其值可以通过 \(b\) 的前缀和 \(b_1⊕...⊕b_i\) 表示。

我们拓展这个结论,首先 \(a_r=a_l⊕b_{l+1}⊕...⊕b_r\),所以 \(a_l⊕b_{l+1}⊕...⊕b_r\) 的线性基与 \(a_l⊕...⊕a_r\) 的线性基等价,可以看出后者的 \(a_x\) 总被前者包含,并且差分数组没有什么奇怪东西进去。

现在变成了单点修改线性基,查询区间线性基来维护 \(b\),然后还要维护 \(a\),这个可以用树状数组。


link [tag: 线性基,数数]

这么套路的题真的不多见 /fad

首先生成树然后环扔线性坤,变成了线性坤随便 xor。不一定联通分开处理,下面做一只子图 >w<

然后答案可以按位考虑,考虑到根的前缀 xor 和,\(c_1\)1\(c_0\)0,然后再考虑贡献。

考虑线性鸡钦定这一位的方案数,如果这一位可以表示成 1 那么可以钦定这一位,然后方案数分别为 \(2^{s-1}\),其中 \(s\) 为线性鸡大小。如果这一位没有办法 1,无法钦定,那么 0 的方案数为 \(2^s\)

1^1=0,方案数为 \(C_{c_1}^2\)0^0=0 跟上一个同理,0^1=1 方案数为 \(c_0c_1\),乘上对应的钦定的贡献即可。


link [tag: 线性基,构造]

首先因为值域的限制答案 \(x\leq \log V\),我们考虑枚举 \(x\) 再考虑其可不可以成为合法答案,假设 \(S\) 实际用到的子集为 \(D\)

比较有启发的观察,每一位一定有 \(0/1\) 交替的位置,所以 \(D\) 必然包含第 \(i\) 位为 \(1\) 的数,否则肯定无解。还容易观察到 \(D\)\(a\) 的异或差分的母集,因为 \(a\) 包含 \(0\),那么 \(a\) 一定是 \(D\) 的子集异或,所以说 \(D\) 的异或和一定可以构成 \([0,2^k-1)\)。这些长的都很线性基,那我们先考虑 \(S\) 的一个线性基 \(X\),那么 \(|X|=x\),线性基最多可以做出 \(2^x\) 个数刚好是 \(a\) 要的,并且每一个数都要,你既然要线性基的全集了那么直接用原本的数来异或也是等价的了而且方便题目构造,我们可以用我们用 \(D\) 组成 \(X\)。现在的问题就是你要构造那么多长度为 \(x\) 的 01 串串表示选/不选某个数,这个要求相邻两个串不一样的位恰好为 \(1\) 个且串串不重不漏,考虑递推,\(o\) 位变成 \(o+1\) 位可以考虑左边放开头为 \(0\) 的右边放开头为 \(1\) 的,这要求别的位 \(T_r=S_l\),那么复制左边的前面加上 \(1\) 反转后接入即可。


link [线性基,二进制数数]

考虑 \(n\) 个数构成的线性鸡大小为 \(s\),那么能构成 \(2^s\) 个不同的 xor 和。

数被我们分成 加入线性坤的 和 不加入线性坤的,此时 不加入线性坤的 每一个数都可以通过 线性坤里的数 xor 表示。

考虑一个合法的 xor 和 \(v\),在不加入线性坤的数里面任意选,有 \(2^{n-s}\) 个方案,加入这些选的数后,通过改变线性坤的选择都可以表示出 \(v\)。所以对于每一个 \(v\),至少有 \(2^{n-s}\) 个方案,然后你又有 \(2^n\) 个数,两个撑起来就是总方案数 \(2^n\) 了,这就取满了......?

所以我们得出了结论,\(n\) 个数凑成了大小为 \(s\) 的线性鸡,有 \(2^s\) 个 xor 和,每一个都有 \(2^{n-s}\) 种方案。

然后回到这个题目,考虑 \(Q\) 在线性基中的排名即可,这个排名相当于把线性基的选不选抽成二进制数,对应的二进制数就是 ranking。


link [tag: dp]

米奇妙妙屋。

考虑相邻合法的转换,将数分类为 \(\frac{k}{2}\leq a_i\)(大)和 \(a_i<\frac{k}{2}\)(小),再考虑相邻的合法条件 >w<

  • 可以同为大

  • 不能同为小

  • \(i\) 为大,\(j\) 为小,那么 \(|a_j-\frac{k}{2}|\leq |a_i-\frac{k}{2}|\)

对于 \(a_i\) 为小,旁边只能放极大(大中差绝对值比祂大的)数。

对于 \(a_i\) 为大,旁边只能放 大 或者 极小(小中差绝对值比祂小) 的数。

这里有很多关系,我们考虑用排序去掉一种约束,那么两个取并,得到了一种按照 \(|a_i-\frac{k}{2}|\) 从大到小的排序方式,用此方式排序后我们按顺序插入。

此时我们发现,约束条件 2 中的第二条没了,然后新加入的数只需要考虑其两边都是大数即可 。但是注意等于是合法的,所以对于 \(|a_i-\frac{k}{2}|\) 的一大一小,我们大数排在前面。

我们再分讨贡献,对于最新的 \(y\)\(a_i\),维护当前两边都是大数的位置有 \(s\) 个,有两种贡献:

  • \(a_i\) 为大,在空里面随便插,相当于把 \(y\) 个 lkx 分给 \(s\) 个 lsy,可以有 lsy 分不到 lkx,方案数为 \(C_{y+s-1}^{s-1}\),然后多了 \(y\) 个合法空。

  • \(a_x\) 为小,每个空里面只能插一个,相当于把 \(y\) 个 lkx 分给 \(s\) 个 lsy,一个 lsy 最多只能有一个 lkx,方案数为 \(C_s^y\),然后少了 \(y\) 个空。

累计一下贡献就行了......?


link [tag: 构造,数论]

正着做很困难,正难则反,现在考虑一个数 \(a_x\) 能否作为结尾,显然要满足 \(F(x)=lcm\{a_i|i\neq x\}\)\(F(x)\) 不是 \(a_x\) 的倍数。

在考虑不断取到最后一个数的过程中,\(F(x)\) 显然不会上升,可以使用任意顺序的意思。

现在还有一个问题,\(F(x)\) 会爆 long long,我们要转换的考虑(这个问题解决办法其实好像不少的。\(a_j\)\(a_x\) 的影响部分其实只有 \(\gcd(a_x,a_j)\),我们再对这部分取 \(lcm\),如果等于 \(a_x\) 就是不行,不然的话显然......?


link [tag: 博弈论]

考虑最后两个数为 \(x,y\),选手和为 \(a,b\),不存在取法 A 赢则 B 赢。

那么有 \(x+a\equiv y+b\pmod m\)\(x+b\equiv y+a\pmod m\),可以推得 \(x-y\equiv a-b\equiv b-a\pmod m\),因为 \(x=-x\pmod m\) 只有 \(0,\frac{m}{2}\)(要求 \(2|m\),下面我们只讨论严格更难做的这种情况) 两种情况,所以 \(x-y=a-b=b-a=0/\frac{m}{2}\pmod m\),那么最后一手 \((x,y)\) 应该是 \((v,v)\) 或者 \((v,v+\frac{m}{2})\)

人比较会去猜按这个配对拿就是充要条件,注意 \((v,v+\frac{m}{2})\) 这种必须是偶数对(这个奇偶性是一定的),不管怎么说先描述一下这个配对拿。按照 \(a_i\mod{\frac{m}{2}}\) 分组,每次 B 都拿 A 拿的那一组的另一个,这样子 B 一定赢。

要做出这个题目我们还需要构造不满足上述条件的情况下 A 的必胜方案,重写题解的时候发现题解区都是假的,流汗了。

将数按照上述方式随意一一匹配。匹配的部分一一对应且总的差值贡献一定为 \(0\),注意到对于不匹配中的 \((u,v)\)\(u-v\not\equiv v-u \pmod m\),我们依据这个讨论做大分套可以构造方案,具体的可以看 at 官方题解我就不赘述了。


link [tag: dfn,树状数组,离线]

唐,感觉做法很多。直接 stack 处理祖先,然后变成子树里面数 \(dep_i=x\) 的个数,这个 dsu on tree 啊什么的就能做。也可以直接离线按照不同深处分别处理,对应的点贡献 +1,然后查询对应深度询问的子树和,再清掉 +1 的贡献即可。


link [tag: 树形 dp]

考虑反着走,处理出每个点合法的一群蚂蚁的上下界,对于每个叶子,在原序列中二分有多少个合法的蚂蚁群即可。


link [tag: 贪心,主席树]

假设集合 \(S=\{a_{p_1},...,a_{p_d}\}\) 可以表示出 \([0,x]\),此时答案就是 \(x+1\) 了。我们考虑新加入一个 \(a'\) 带来的影响。

  • \(a'\leq x+1\),此时可以表示的区间扩张到了 \([0,x+a']\)

  • \(a'>x+1\),根本就,无法产生影响嘛 /fad

那很朴素的,假设现在我们的区间是 \([1,x]\),我们将所有没有加入的第一类数加入 \(S\),额那不就变成所有 \(a_i\leq x+1\)\(a_i\) 和了嘛......?第一类数中加入了的跟 \(S\) 等价呀。

就这样加,知道某一次加前加后的 \(x\) 相等就是答案了。

in fact,这样子加的 \(x+1\) 有一个倍增复杂度就差不多是 \(log\) 的了,不需要再继续优化。具体而言,我们考虑一个最 poor 的加法的 x 的变化是 1,3,6,11,19,... 这个形式的。


link [tag: 贪心,排序]

呜呜呜怎么是套路 /lh

首先 \(b_i\gets a_i-b_i,c_i\gets c_i-a_i\),然后变成了强制选 \(a\),然后 \(y\) 个换成 \(b\)\(z\) 个换成 \(c\)

考虑两个人 \(i,j\) 一个选 \(b\) 一个选 \(c\) 的时候 \(i\) 什么时候贡献更好,那么是 \(b_i+c_j>b_j+c_i\)\(b_i-c_i>b_j-c_j\)

我们按照 \(b_i-c_j\) 降序排序,那么一定存在一个分界点,使得左边只有选 \(b\) 的,右边只有选 \(c\) 的情况下去到最好答案。这个很好反证(

然后就是前后分别处理一下,用堆做出前若干大的和,再枚举分界点取 \(\max\)


link [tag: 数数]

无语了重写题解的时候忘记保存了,重写潦草说一下算了。说句鲜花感觉这个题目题解区好烂,很不自然的题解挺多的,自己真的能说服自己吗。

首先设计势能函数 \(a_i=\sum_{j=1}^{i-1}[p_j>p_i]\),势能就是 \(\sum_{a_i>k}a_i-k\),我们现在想要势能下降到 \(0\)

讨论容易发现 \(swap(p_{i-1},p_i)\) 可以使势能下降的只有满足 \(p_{i-1}>p_i,a_i>k\) 一种情况,且恒使得势能下降 \(1\),如果能一直做这个操作那么可以最小化操作次数。然后对于 \(a_i>k\) 如果 \(p_{i-1}<p_i\) 那么一定有 \(a_{i-1}\geq a_i\),这样一直找到开头一定可以操作。

感性理解可以发现最终序列和操作顺序无关,我们现在钦定操作顺序为每次操作 \(a_i>k\)\(p_i\) 最小的,联系上文不难说明正确性。

要计数我们再来考虑点性质,首先 \(a_i=k\) 的才有肯能是被移动过来的,对于最终序列 \(j>i\) 的一定有 \(a_j\leq a_i\) 得出 \(p_j>p_i\),对于 \(j<i\) 的,\(a_j<k\) 的没动过,\(a_j=k\) 的一定有 \(p_j<p_i\),综合这些性质我们按照 \(p\) 从大到小复原一定没问题,这个也就是从后向前复原了,显然每一个 \(a_i=k\) 可以移动回去 \([0,n-i]\) 步,这个方案数 \(n-i+1\) 累乘起来就是答案。


link [tag: AC自动机,树论]

\(S\) 建立 AC 自动坤,并且建立 fail 树。考虑一个 \(P\) 的匹配过程,\(P_i\) 匹配到自动机上的 \(x\),那么 fail 树上 \(x\) 到根的路径上的都合法 >w<

但是对于每一个 \(P\),一个 \(x\) 的贡献只能算一次。这时候,对于一个 \(P\),合法的点贡献应该是所有 \(x_i\) 到根的路径取并。

现在问题变成了怎么快速的做这个贡献加法,要求是正常复杂度且不依赖遍历整颗树,感觉很困难的说。

我们考虑加入一个节点带来的影响,强制根到其的路径 \(+1\) 的话,可能还要有另一个点 \(y'\) 到根的 \(-1\) 的路径。

这个 \(y'\) 我们能否具体的表达?考虑 \(x\) 的祖先 \(y\),如果 \(y\) 的祖先的子树里面当前不只有 \(x\) 这个节点,那么减法路径显然包含 \(y\)。意思是,\(y'\) 其实就是 \(x\) 的最深的满足 \(siz>1\) 的祖先(这里 \(x\) 已经被加入,不然是 \(0\) )。

这是什么意思的,从下往上考虑子树里面,这不 dfn 一样嘛.....?

我们可以考虑把当轮节点按照 dfn 排序,然后顺次做,考虑轮 \(i\),祂的上一位是 \(i'\)

  • \(1\to i\) 的路径做 \(+1\)

  • \(1\to lca(i,i')\) 的路径做 \(-1\)

这样做保证了加贡献的顺序,原本 dfn 好像要考虑的右边的东西也不需要了,操作可以直接差分然后树状数组,非常优秀(((


link [tag: AC自动机,dp]

建立出 AC 自动坤,然后感受到贡献会乱飞。。。

数据范围极小,可以在状态上面直接约束。设 \(F[i][j][u]\) 表示填了 \(i\) 个字符,后 \(j\) 个字符没有被匹配,在自动机上点的 \(u\),然后直接 dp 即可......?


link [tag: AC自动机]

萌萌题,大概告诉了我们可以 bfs 的时候记录 stack 来 dp 可以压行。

考虑 fail 树,然后就是查询子树和。


link [tag: 数学]

扩展欧拉定理:当 \(b>\phi(p)\)\(a^b\equiv a^{b\mod \phi (p)+\phi (p)}\pmod p\)

设这个值为 \(F=2^{2^{2^{2^{2^{...}}}}}\),由题意得 \(F\equiv 2^{F\mod \phi(p)+\phi(p)}\pmod p\),这里只考虑了 \(F>\phi(p)\),因为这个很大的......?

这个 \(F\mod \phi(p)\) 是一个递归的柿子,最后会变成 \(\mod 0\),我们考虑递归求解即可 >w<

然后由于跟 \(x\) 的互质的数总是成对出现,即 \(\gcd(i,x)=1\) 那么 \(\gcd(x-i,x)=1\),所以对于 \(x\neq 1\)\(\phi (x)\) 是偶数。然后对于偶数 \(x\),其 \(\phi(x)\) 至少减半,所以层数是一只 log 的。


link [tag: dp,暴力]

这个 随机数据 真的吓人,立方过 3.5w /lh

单调严格上升,这不直接 \(a_i\gets a_i-i\) 然后做单调不降 ovo

嗯哼我们考虑第一个 query,显然是最长不降子序列啊。直接处理出 \(len_i\) 表示最长不降子序列长度!

然后第二问我们考虑 dp,先左右加端点 -inf/inf 减少情况。

设计 \(f[i]\) 表示到这个位置的最好答案。那么对于一个 \(len_j+1=len_i,a_j\leq a_i\)\(j\) 可以转移到 \(i\)

怎么转移,对于 \(a[j,...,i]\),肯定是前一段 \(a_j\),后一段 \(a_i\),前缀和算一下即可。

这个随机数据期望比较好,具体而言合法 \(j\) 个数在 \(\sqrt n\) 左右,长度也在这个左右,加起来是不太能满的平方以下,可能更低但我不会分析。


link [tag: 数学]

这个写总结差不多等于默写题解,但是我已经在纸上默写过了。

核心就是学会换元,约数等价的话可以换个写。

还有就是 P4193 那里写过的互质的数成对出现,所以平均数,然后就有一个 \(n\neq 1\) 的互质数之和为 \(\frac{n\phi(n)}{2}\) 的说。


link [tag: 树论,结论]

好唐啊,只需要考虑奇偶性直接 \(a_i\to b_i\) 改成 \(1\to a_i,1\to b_i\),这个可以树上差分,令 \(d\) 为差分数组。然后再考虑树的形状,显然要求子树和为偶数,所以有奇数 \(d\) 怎么放都会寄。


link [tag: AC自动机]

这么唐,直接前后做一遍然后枚举分界点乘起来就没了。


link [tag: AC自动机,树论]

字符串的一些公共前缀必须要一起做才能保证复杂度......?

首先按照题目建立自动 AC 坤,然后考虑 \(S_x\)\(S_y\) 中出现次数是个什么东西,显然是把 trie 上面 \(S_y\) 的路径都打成 \(1\),然后在 fail 树上查询 \(S_x\) 的子树和就是答案了。大概就是说,如果 \(S_x\)\(S'\) 的后缀,那么 \(S'\) 的节点跳 fail 可以到达 \(S_x\) 的节点。

我们直接按照建立 trie 的路径去做,每一个时刻刚好加对了一个路径,所以离线把询问挂到点上,树状数组维护就没了 >w<


link [tag: AC自动机]

还是那个熟悉的建立出 AC 自动坤,考虑这一个串的匹配过程,如果匹配到的节点的的子串是模式串,那么就不可以,那么就变成了在 AC 自动坤上面找一个不触碰禁忌的环......?

注意如果一个节点的 fail 节点的是禁忌的,那么祂也是禁忌的,因为匹配到一个位置后缀可能是假的而不一定在 fail 的同一条路径所以要处理一下的。

找环可以用一个极度简化的 tarjan,差不多就 dfs 的实现了 >w<

void dfs(int x) {
	in[x]=1;
	up(i,0,1) {
		int v=tr[x][i];
		if(in[v]) {
			cout << "TAK";
			exit(0);
		}
		if(sr[v]||cnt[v]) continue;
		sr[v]=1, dfs(v);
	}
	in[x]=0;
}

link [tag: AC自动机]

这么唐?删除直接按 stack 退回即可。


link [tag: AC自动机,dp]

考虑建立出 AC 自动坤然后在上面做 dp,预处理处新匹配到这一位的影响(fail 的路径和),设 \(f[i][j]\) 表示填了前 \(i\) 个字符在点 \(j\) 上的最大次数,狂卷 dp!!(


link [tag: 绝对值不等式]

很有素质的题目(迫真,直接列出绝对值不等式,非常的丑陋。

老老实实分讨是不可能哒,考虑 \(Ans\leq t\) 形式的不等式和所以零点端点,判断合不合法,对于合法的取 min 即可。注意可能会出现差一点点的取到的情况......?可以加偏移量来做。


link [tag: 莫队,dp]

我们用莫队艹这个题目,设 \(f(l,r)=\min\{a[l,...,r]\}\)问题变成了对于一个序列 \([L,R]\),考虑 \(\sum_{i=l}^r{f(i,r)}\)

考虑具体的形式,大概是一个 \(X_p< X_{p-1}<...<X_1\) 的形式的序列嘛,每个 \(X\) 再带个权,不管怎么说单调单调!

贡献不能直接算?rmq 不是端点导致的。假设 rmq 是端点,那么可以令 \(f[i]\) 表示以 \(i\) 结尾的前缀那个贡献,\(g[i]\) 是后缀的。

我们可以先求出不服管教的最边上的 rmq,直接算祂的贡献,然后用预处理的 \(f,g\) 补上整块的贡献。

posted @ 2024-03-12 22:13  Hypoxia571  阅读(22)  评论(0)    收藏  举报