record ?-?
[YDRG#005] E
这个数数题对吧,我们一看这个条件,直接做很难做,考虑容斥。
注意到我们每次只会钦定模 k 意义下同余的两个位置相同,所以我们可以把模 k 同余的放到一排,这只是为了方便考虑,对解法没什么影响。
现在,我们每次选一个条件不满足,都相当于是覆盖当前这条边以及之前一共 k 条边,最后的贡献是 m 的连通块个数次方。
这就给出了一个单次 \(O(n^2)\) 的 dp,这方面好像没什么可以优化的。但是,我们注意到这个方案数、贡献,都只跟连续段相关,也就是说我们可以把一个方案拆成若干个连续段,最后总的方案数是每个段的方案数相乘,总的贡献是每个段的贡献相乘。
观察到这个之后,并没有什么用,但是我们可以写出一些生成函数,然后导出一个 \(O(n\log n)\) 的做法。
具体来说,你可以写出一个连续段的生成函数 \(W(x)=\sum_k w_kx^k\),然后求个逆一类的。
[YDRG#005] C
这个 C 据说还是很困难的。
我们首先肯定要找这个要求的充要条件,经过一些思考之后,我发现,你考虑假设有 \(k\) 个颜色段,每个颜色段的颜色 \(v_i\) 和大小 \(s_i\),那么要求 \(v_1=s_1+\dots+s_k,v_2=s_1+\dots+s_{k-1},\dots,v_k=s_1\)。
这个条件,跟相邻两数的差分表示这个值的出现次数,是等价的。
这个条件,跟把这个子序列画出来,图形是对称的,是等价的。
我们考虑接下来怎么 dp。我可能只会做 \(O(n^4)\sim O(n^5)\)。
看了 sol。
我们观察到对称的性质之后,可以考虑与之相似的子结构。我们记 \(f_{x,y}\) 表示以 \(a_x\) 为开头,目前每个数都减了 \(y\) 想要合法,最右侧最靠左是多少。
转移枚举下一个数是谁即可。感觉很有道理,利用了这个结构。
[湖北省选模拟 2024] D1T2
我们把不能放在同一个集合的点之间连边,这样你就得到了两张图,问题转化成给每个点分到一个集合里,满足一些形如两个点不能同时在某个集合的限制的方案数。
首先,这样的图我们大概是有些方法建出来的。具体来说,只需要一棵 trie 树,每个点会向 log 个区间连边。
接下来我们看看部分分,A 是很好做的,我们相当于要求有多少个连通块,每次我们会合并一些区间,这个可以使用并查集做到均摊线性。
然后我们考虑 B。因为如果有三个同样美味度的,我们就寄了,所以最多有两个。如果是两个,那肯定得一边一个。所以相当于我们事先确定了一些数放在哪个集合,然后接下来有一堆不同的数,你只需要考虑第二个集合的限制。总之还是很好做的。
没有特殊性质的话,我觉得大概率需要找一下这个图的别的性质。
这个关系,没有传递性,哪怕限制所有数都在 \(<k\) 的范围内也没有。有一个我们之前说的区间的性质,
如果我们考虑容斥的话,你钦定一些边不满足,然后相当于你要去算剩下没有被钦定的点的个数,这个是相当困难的。如果你考虑钦定一些点在某个集合里,那么你需要去算能钦定成这样的容斥系数之和,这东西我还是不会算。
所以我大概还是有个性质没找到。
额,sol 出来了,我大概还是糖丸了。
我们注意到,两数异或的最小值,只可能出现在按大小排序之后相邻的两个数之间。依据这个,我们可以设计 \(dp_{i,j,0/1}\) 表示目前考虑到 \(i\),它在集合 \(0/1\),上一个在不同集合的是 \(j\)。转移考虑 \(i+1\) 在哪个集合即可,这个在 Trie 上维护就可以了。
总之很简单就做完了,没考虑到的话,感觉是如何判断一个集合合法,我没有深入想,直接就当成是不选一对不能在一起的,然后就想到找这种关系的性质。但事实上,判断集合合法有其他的方式。
这个题的思路应该是,我们先假装自己有一个解,然后去看看这个解满足要求的充要条件。我之前就武断地认为直接连边之类的,想歪了。
[湖北省选模拟 2024] D1T3
这个可以走走走,一看就跟这个路径实际怎么走的没啥关系,大概率我们对相邻的两个反复走就可以达到很多解。
我们可以简单写一下,你考虑最后走的路径当中,有一个 \(ab\),然后你对它反复走,你发现可以得到的是 \(ab\times1,ab\times101,ab\times10101\),也就是说 \(ab\times(1+100+\dots)=ab\times\frac{100^p-1}{99}\)。
我们非常好奇,\(100\) 是不是 \(1145141\) 的原根。很不幸,并不是。
但是,\(10\) 是 \(1145141\) 的原根,也就是说,如果我们可以重复走一个点,那么几乎可以得到所有解。现在,相当于我们对这个东西进行了奇偶分类。
那么,如果整个连通块都是同样的一个数,或者更精确地,两个数交替出现,我们是没办法的,这个东西打表之后发现构成了两个环和一个自环。
但是,一旦这个连通块不是这样的,就相当于我们除了加 \(ab\) 以外,还多了一种加 \(ac\) 的选择,打表之后发现所有情况都能得到。
所以,我们进行线段树分治,维护每个连通块是不是交替出现即可。
zroi Day 11 A
场上的想法,是有两条路,一个是通过一些预处理去优化枚举 + chk 的过程,另一个是注意到你每次取的是极小值,我们把每个极小值所“管辖”的区域分成一组,然后考虑不同组之间的影响和组对自己的影响。
sol 中我们先考虑降维,对于一维情况。你考虑把水划分成若干部分,把一定会同时被吸干的划分到一起,去找每个部分被吸干的一个充要条件。
经过观察,你发现对海拔建笛卡尔树,然后每个点是一个区间,这个区间对应的水是这个区间到它的父亲这段海拔,这段水被吸干当且仅当这个区间内有海绵。
那么就变成了一棵树,每个点上有一个数,每次可以删一个到根的路径,然后就做完了。
考虑二维情况,发现只不过是区间变成了连通块,考虑反过来,从底向上建树即可。
[湖北省选模拟 2023] D1T1
这个感觉比这次 D1T1 有水平。
我们肯定要考虑最后我们到底能通过这样的操作达成什么局面。我感觉这个操作很强,所以可能绝大部分都能达到。
呃呃,仔细想了一下大概是对的。因为你可以先把空格交换到一个叶子,然后把所有数都交换到跟这个叶子相邻的那个点上面,然后我们把这个点当成根,每次往下交换到叶子就可以。
哦不太对,这样我们只能钦定每个位置只有一个数。如果有些位置想要有很多个数的话,首先叶子肯定没办法有很多个数,别的情况应该类似都能做到。
好的,那么现在我们需要把这个树重排,然后要求是叶子节点最多只有一个数。在此前提之下最大化最后的权值。
如果没有叶子的限制,我们肯定就全部都堆到直径上去了。
观察到这个数据范围过于小了,我们直接考虑 dp,设 \(dp_{u,x,y}\) 表示 \(u\) 子树内堆了 \(x\) 个白的,\(y\) 个黑的,只考虑子树内部的边的权值最大是多少。转移考虑你在根上堆了多少东西。
这转移复杂度对不对啊,感觉可能差不多是这么个东西。
我天读错题了,这东西不是个树,这是个无向图!!!
没关系,应该差不多。我们考虑所有 \(deg=1\) 的点,这些点上面最多堆一个数,别的限制,应该没有。
然后我们还是先不管叶子的限制,你发现肯定是堆到最大的那条边上面去,这个时候,如果你有 \(c_0,c_1\) 个点,你注意到它们之间最多也就能让 \(c_0c_1\) 条边产生贡献,而你现在取到了最大的。
如果这个边的一个点是叶子呢?
又读错题了。我要疯了。
我们先考虑一棵树。
这个操作就比较弱了,感觉中间有一些不变量。刚刚 chk 的时候瞄到 sol 里这么说的经过观察,我们发现任意两点之间距离的奇偶性是不变的,这说明,对这个树黑白染色之后,在黑点上的棋子只能跟在黑点上的棋子合并,白点同理。并且我们有方法把它们扔到任意一个树边的两端去,这就是此时的最优解。
但是你仔细一想,发现一个简单的链就是一个反例。所以上述操作想要进行要求一个 \(deg\ge 3\) 的点。
对于链而言,我好像不太会啊。
对于一个有环的图而言,如果有奇环,那么我们事实上可以把所有棋子都合并到环上的同一个点,然后再把 01 拆开,然后再扔到任意一个边的两端,也取到了理论最优解。
对于一个只有偶环的图而言,我们大概还是要黑白染色,然后之前说的东西现在仍然适用,我们直接考虑一个生成树,你发现如果原图存在一个 \(deg>2\) 的生成树,那么一定存在一个包含最大值那条边的 \(deg>2\) 的生成树。
所以我们现在,还不会的,就是链和单独一个偶环的情况。
为什么不会链呢?因为我们对操作还不够了解,现在仍然分析不出来最后可以被操作成什么样子。不过这个感觉有点难分析的,我们考虑一个 dp 状物。dp 的问题在于,我们的操作要求这个位置是空,操作之间会互相影响,不同位置也会互相影响,关联太多。这里需要一些性质把它们独立开来。
注意到操作带来的影响,只有整体左/右移,拉近两个块的距离(以及可能带来的合并操作)。
那这样我们肯定每个块每个块地考虑,你枚举第一个块开头所在的位置,然后依次考虑后面每个块要放到哪个位置,这样我们可以做一个顶多 \(O(n^3)\) 的算法。
最后就是偶环的情况。我们染色之后,发现仍然可以类似于一个树的情况,那么我们就做完了。
[湖北省选模拟 2023] D2T1
给一个竞赛图,每次询问给一个终点和若干个起点,问最多能找到多少条从起点到终点的边不相交路径,一个起点可以引出多条路径。
我们首先可以想到一个网络流做法,建图一类的都是显然的。但这显然不是正解,我们没利用竞赛图的性质。
我手头好像没啥处理竞赛图的工具。
我们进行一些猜测:任意走能走的路径直到不能走为止,这样就可以得到最优解。
尝试构造反例,先从一般图的反例开始。构出来了。竞赛图的反例也构出来了。
图论算法,会不了一点。我们尝试从网络流方向优化。
我们考虑最大流转最小割,然后你发现直接考虑最小割不好想,我们转成枚举两个点集。
你考虑那些 \(s\) 必须在 \(S\) 中,那一个 \(t\) 必须在 \(T\) 中,然后贡献就是所有 \(S\to T\) 的边。
你发现所有的边可以分成 \(S\to S,T\to T,S\to T,T\to S\),如果我们在每次选一个 \(S\) 的点的时候,把向它的连边删掉,在选 \(T\) 的时候,把向别人连的边删掉,这样我们会多删一次 \(T\to S\),但是我们只要记录有多少个 \(S\),我们就可以算出 \(S\to T+T\to S\),这样就可以分别解出来了。
那我们现在会了一个 \(O(mn^2)\) 的做法。太逊了,我们如果做到 \(O(nm)\) 就厉害了。
现在的几个方向:让 dp 精确出解,把最后要加的东西 gank 到 dp 里头去算,加速每次 dp 过程。
你发现现在是每个点选 S 有一个权值,选 T 有一个权值,然后我们不妨假设你最开始选的都是 T,每次考虑新加一个点选到 S 当中,这个只需要排序就可以了。
[湖北省选模拟 2024] D2T2
我们考虑 dp。你设 \(dp_{l,r,k,x}\) 表示把 \([l,r]\) 删成最后只剩若 \(k\) 个 \(x\) 的方案数。
然后你考虑你最后一步操作是什么,如果最后一步删的是若干个 \(x\),那么这个是可以转移的。
如果最后一步删的是 \(t\) 个 \(y\),那么你可能还要再去枚举一些乱七八糟的东西,总复杂度肯定爆了。
呃呃,我现在的做法是,你考虑记 \(dp_{l,r,x,v,0\sim 3}\) 表示把区间 \([l,r]\) 用 \(v\) 次操作删成只剩若干个 \(x\),并且是否强制保留左右端点的方案数,以及 \(f_{l,r,v}\) 表示把 \([l,r]\) 用 \(v\) 次删干净的方案数。
转移枚举最后一次删的区间 \([p,q]\) 以及一个颜色 \(y\),进行一些讨论就可以转移了,复杂度 \(O(n^9)\)。稍微优化可以做到 \(O(n^8)\)。
注意到我们的复杂度瓶颈大概来自于枚举操作次数。这个操作次数大概还是得记录的,问题出在我们需要枚举三个段的操作次数,考虑能不能少枚举一些段。
我之前考虑的是你去枚举最左边的点和谁一起删除,但是这个顺序还是比较重要的,不太好考虑。
我们考虑优化我们现在的转移过程。你现在要算 \([l,r]\) 区间内,删干净的方案数。
你考虑最后删的数是 \(x\),那么相当于这个区间内的每个数,都可以选择,在这一次被删除,或者在之前被删除。在之前被删除的,可以用更小的 dp 值计算,在这次删除的,就删除了。
这样直接写是 \(O(n^6)\) 的,但是我感觉分析分析可以做到更好。
[湖北省选模拟 2023] D2T2
这种题面,非常明显,你首先要找博弈能赢的充要条件,然后用一些数据结构去做。因此我们的解答可以清晰地分成两个部分。
让我们先来写个暴力吧。
呃呃暴力什么都看不出来。
怎么又看了 sol?
你考虑一个链的情况,如果此时我们在一端,那么必胜等价于链长为奇数。
如果我们不在一端,如果此时链长为奇数,那么肯定一边是奇数一边是偶数,我们走向奇数即可。
如果链长为偶数,如果两边都是偶数,那么无论怎么操作对手都会遇到奇数情况,必败;如果两边都是奇数,那么我们可以获胜。
如果我们在环上,类似地分成奇环和偶环讨论。
对于奇环而言,我们清空一条边即可让对手面临偶链的情况,必胜。
对于偶环而言,我们发现谁清空边谁就输了。一个人必须清空边,当且仅当两端都是 1,你发现如果我们把所有位置都减去 1 的话,按照同样的方式操作,可以得到一个两端都是 0 的解,也就是说,必胜必败态不变。所以我们把所有位置减去最小值,转化成链的情况。
[湖北省选模拟 2023] D1T2
zroi Day 12 A
我们考虑枚举钦定每个点选的是哪个维度,然后求出来所有可能的 P,因为只有五维,所以这样的点不会很多。
然后考虑双指针。
USACO 2024 Feb pt C
首先一个显然的做法是把每个点拆成 \(\max(T_i)\) 个点,然后我们在基环树上随便做就行了。
但这样做在 \(\max(T_i)\) 太大的时候显然不行,我们考虑可能的两个方向:简化这张图,或者加速跳的过程。
你发现,如果 \(T_u\ge T_v\),那么我们是非常方便去跳的,所以我们现在可以预处理出来所有从某个位置开始能向小了跳多少步,以及跳到什么位置。我们得到了一个复杂度跟这个路径上向大跳的次数有关的一个做法。
我们考虑这样的一个做法:进行根号分治,我们记录小的若干个二进制位,这样,根据高位的不同,我们有根号张图,然后相当于在这根号张图上面跑,复杂度大概是一个根号乘若干个 log。但这个根号是值域的根号,我们还是没办法解决原问题。
能不能做得更精细一些?我们上面根号做法的本质,是基于一个大点要过很久才会改一次。但现在我们跳的次数实在是太多了,以至于大点也会被修改很多次。
[省选联考 2023] D2T2
Alice 和 Bob 博弈,每个人都要填 \(n\) 个 \([1,m]\) 内的数,Alice 填完,Bob 在 Alice 基础上去填。每个人每个位置会告诉你可以选择哪些数(最多 2 个选择),Alice 想最大化 Bob 与她填的相同位置上相同的数,Bob 想在自己填的数互不相同前提下,最小化与 Alice 相同位置相同的数。
这种东西,我们肯定要先考虑假装知道 Alice 填的是 \(a_i\),然后 Bob 怎么填。
首先,Bob 要互不相同,我们把一个位置的两个选择看成一条边,每个连通块最多只能有一个环。可以发现这是能填成互不相同的充要条件。
如果这个连通块是一个基环树,那么填法唯二,Bob 会选择更小的那个填法,而 Alice 会尽量让更小的填法变大。相当于是 Alice 的每个位置,会有 4 种给两个集合贡献 0/1 的方案,我们可以简单贪心。
然后我们要考虑的就是树的情况。这时填法一共有 \(n\) 种,我们显然无法类似于环的情况来做。
这个时候,你考虑 Bob 的一个位置,这是一条边 \((u,v)\),以及考虑 Alice 对应于这个位置的两个值 \(x,y\)。
如果说,\(x,y\) 当中只有一个或者没有人跟 \(u,v\) 相等,那么我们的选择方案唯一。
剩下的情况是 \(x,y\) 两个数分别跟 \((u,v)\) 相等,这时我们要进行决策。你发现两个决策分别对应于这条边分成的两个部分进行加 1,然后我们最后 Alice 的目标是让点上的最小值最大。
问题转化成现在这个样子:给你一棵无根树,执行了一些某个子树加 1 的操作,然后还有剩下一些特殊边,这些边可以选择一边进行子树加 1,问最后最小值最大是多少。
看了一点 sol。
我们考虑这个边的定向,你发现最优解一定是形如:选择一个点作为根,剩下每个边都往子树外去定向。
那我们随便做做就行了。

浙公网安备 33010602011771号