记录(2)

4月23日模拟赛

A

单独考虑一个连通块,可以证明,一个连通块如果不是完全图,点数至多是 \(P+2\)。因此若干个连通块并起来点数最多是 \(3P\)(而非 \(P+2\)!)

那么相当于对于每对 \((n,P)\)\(n\) 个点 \(P\) 个三元环的有标号联通图个数,\(n\le 17\)

直接搜有标号的图显然只考虑链就已经是阶乘的复杂度了,因此要想办法只搜无标号图。

对着图同构搜没法做。考虑对于 \(G\),从 \(1\) 号点开始 bfs,(若有多个点,优先访问编号较小的)按照 bfs 序重标号为 \(1...n\) 得到一个无标号图 \(G'\),则一个有标号图 \(G\) 唯一对应一个无标号图 \(G'\)。设 \(p_i\) 表示 \(i\) 最小的连边,则对于这个无标号图 \(G'\) 需要满足 \(p_i\) 单调不降,在此基础上有恰好 \(\frac{(n-1)!}{\prod c_i!}\) 个图能够映射到 \(G'\)

感受一下,这种图很多情况下大部分点都是直接连着 \(1\),因此 bfs 序很多就是 \(1...n\),所以这个 bfs 序的同构几乎就是完全的图同构了,跑得很快。

Balancing Network

第一问:
考虑将整个过程倒置,那么其实就是对于一对导线 \((x,y)\) 如果 \(x,y\) 有其中一个状态是 1,就可以把另外一个也变成 1,最后要求所有导线全都变成 1。可以枚举根之后贪心,那么设能成为最后一根的导线集合为 \(P\),任何一个 \(P\) 中的导线经过上述判定结果都是合法。对于每对 \((x,y)\),连接 \((x,y'),(x',y)\)\(x',y'\) 表示下一列的对应点),即从这个点出发,能到达任意第一列的点。再倒置,将边反向,对每个第一列点求出能到哪些导线。从右往左扫描列 \(j\),对每行 \(i\),维护一个 bitset \(f_{j,i}\) 表示第 \(j\) 列第 \(i\) 行能到第 \(m\) 列哪些行,那么一次 \((x,y)\) 造成的影响即 \(f_x|=f_y,f_y|=f_x\)。最后 \(P\) 即所有 \(f_{1,i}\) 的交集。
第二问:
对于 \(n=2\),由于 \(m\ge 1\) 显然无解。
对于 \(n\ge 3\),我们说明一定有解。如果 \(n>3\),将后 \(n-3\) 列的边都指向前 \(3\) 列,转化为 \(n=3\)

不妨假设第一条边是 \((1,2)\),那么操作完 \(1,2\) 总有一个 1 一个 0,恰好有两种可能。

维护一个状态,\((a,b,c)\),表示 \(a,b\) 之中恰有一个 1 一个 0,但具体还没有确定\(c\) 一定是 1。加入一条边 \((x,y)\) 时,如果 \(x,y\in\{a,b\}\),那么将上一次操作随意确定了,这一次先留着不动;否则不妨假设 \(x=c,y=a,z=b\),那么将上一次定为 \(z\) 指向 \(y\),状态变为 \((x,z,y)\)。最后可能剩一条边,任意定向即可。也可以说是“反悔”了上一次的选择。写起来代码可以利用一个小性质 \(1\oplus2\oplus3=0\)

Hard Cut

首先,假定/打表验证基本上(也就是可能有反例),总是能构出来 \(2^{\left\lceil\log_2 c\right\rceil}\)

那么考虑找到 \(1\) 的中点,分成两半,递归构造。假设猜想成立,那么除了 \(c=1\)\(c=2^k+1,k>0\) 就构完了,\(c=1\) 是平凡的,于是只需要考虑 \(c=2^k+1\)

这种情况下,尝试先用 \(2^k\) 构出 \(2^{k+1}\),再稍作调整。首先,经过分讨,我们确实可以用 \(4\)\(8\),那么递归就能构出任意 \(2^k,k\ge 2\)。那么加上最后单独的 \(1\),就构出了 \(2^k+1\),那么想怎么去掉 \(1\),枚举一些子段擦掉,假设值为 \(v\),然后背包看看能不能凑出 \(v-1\)。当 \(c\) 比较大的时候总是有解的,对于 \(c\) 比较小的情况,比如 11111,实际不一定有解,可以直接大力背包。

写起来代码,可以直接判掉 \(c\le 32\) 跑背包,若 \(c\ne 2^k+1\) 分治,若 \(c=2^k+1\) 用上面的方法构出 \(2^{k+1}+1\) 再调整。

排序大师 木林森 (剥叶子)Constructing a matrix (匹配)Summation By Construction (细节调整)Distinct GCDs (Hard Version) (固定k,求解f(k);lcm怎么做)Square Resistance Value(连分数逼近:两个定理,误差分析:最优性)星图重绘(前后缀最值、四个象限 证明、欧拉公式的应用)Urban Planning(更精细的构造)

4月28日模拟赛

A

B

C

建图,每条有向边是一个二元组 \((a,b)\),正着走是 \((a,b)\),反着走 \((-a,-b)\),询问是否存在 \(s,t\) 的长度为 \((a_0,b_0)\) 的路径。

求出任意一个 dfs 树,则只需要考虑用反祖边形成的环(或自环)线性组合。考虑维护 \(a,b,c\) 表示有 \((a,b),(0,c)\),其中 \(a\ne 0\)。加入一组 \((d,e)\) 时将 \((a,b),(d,e)\)\(a,d\) 做辗转相除。

核心:用所有返组边构成的环可以线性组合出所有环/路径.

4月29日模拟赛

A

如果是空心的,可以在中间和两边随便填,然后转化为实心的.

分成 4 段构造. 有点像构造 \(|x_i-y_i|\) 要求构成排列.

B

考虑如何判定一个子串是否合法.则有结论:非法等价于,设 \(S_i=a_i-S_{i-1}\),则 \(S_0=S_n=0,S_i>0\).即将偶数位置的 \(a_i\) 取负,折线图上每一步都跨越 \(0\),最终回到 \(0\).

那么考虑如何判定整个串合法性,只需要维护对于每个左端点 \(\{S_i\}\) 的集合,且 \(1\le S_i\le m\).

时间复杂度 \(O(nm2^m)\)\(O(n2^m)\).

三种理解方式:匹配\dp\打表猜结论.

C

考虑 \(S=1,T=n\).首先这种情况不会走回头路,因为如果存在回头路,如果走了一圈回到自己下方则显然可以直接下去,如果回到上方,则不如直接上去.
如果是从较低的桥切换到较高的桥,则一定是在高桥的一个端点处进行切换.可以归纳+调整证明.
反之,只要确定了所有经过的桥,那么总是存在经过所有桥的路径(因为保证了端点处可以上桥).
所以,对于这个子任务,可以将 \(H_i\) 视为 \(+\infty\),转化为上一个子任务.
部分分做法1
将所有 \([L_i,R_i],[L_j,R_j]\) 有交的 \(i,j\) 之间连接一条 \(|H_i-H_j|\) 的边.不妨假设 \(H_i\le H_j\),则条件等价于 \(R_i\in [L_j,R_j]\)\(R_j\in [L_i,R_i]\).使用线段树优化建图,但可能存在负权边,但是因为时序是递增的,考虑在线段树上维护一个时间戳,可以在 pushup 时合并,时间只会顺流.点数和边数均为 \(O(m\log n)\) 量级,复杂度为 \(O(m\log n(\log m+\log\log n))\).

部分分做法2

做法1 并没有用到这个图的性质.
考虑从较低的桥 \(Y\) 切换到较高的桥 \(X\) 时,两座桥在高度上一定是相邻的.因为如果不是,考虑高桥 \(X\) 下方的桥 \(Z\),不如先从 \(Y\)\(Z\),再从 \(Z\)\(X\).因此对于一座较高的桥,只需要找到其下方的第一座桥连边.点数和边数均为 \(O(m)\) 量级,时间复杂为 \(O(m\log m)\).

完整解法

完整的路径可以分为三个阶段,第一阶段只会绕 \(S\) 螺旋 上升,第二阶段不会回头,第三阶段绕 \(T\) 螺旋下降(即第一阶段的对称).因为没时间,证明就不细写了.

对于一三阶段,对于每座桥找到 \(S,T\) 左右第一个支点一定是螺旋上升的较上的拐点,加入关键点集合.则关键点数为 \(O(n)\).考虑如何找出关键边.

则只有拐点到下方第一个点的边是有用的,证明仍然不细说.

时间复杂仍然为 \(O(m\log m)\).

Almost Multiplication Table

先二分答案不会使问题变难.

从极端情况开始调整,核心要求:让 \(X_i\) 逐渐变大,让 \(Y_i\) 逐渐变小.调整轮数为 \(O(n\sqrt V)\),每轮 \(O(n+m)\).

Graph Coloring

做法 1(全序图情况)

全序图即所有边的方向为 \(i\to j\),其中 \(i<j\).

构造 \(i,j\) 之间的边权为 \(\left\lfloor\log_2(i\oplus j)\right\rfloor\).

做法 2(全序图情况)

考虑分治,对于内部的链递归构造,对于跨过两边的链,要求两边之间的边的颜色不能同于任何内部的颜色,因此新设置一种颜色即可.

\(n=2^k\) 时两种做法等价.

做法 3(一般图 \(2\log_2 n\))

考虑两张全序图 \(G_1,G_2\),分别包含所有 \(i<j\)\(i>j\) 的边,对两张图分别构造,再将颜色拼接在一起,直接按进制是 \(log^2\),但是没必要,按等价类划分即可.

正解

末日三问

线段树,两条链,\(1+2+4+...=O(n)\),打tag
整块可以转化为全局加

全局加可以做单log,空间可以做线性(逐层处理)

先分治求出\(f_k\),(max,+)是闵和,逐位取max是合并点集求凸包

平面图最段路,分散层叠,……,k进制fwt,分园,单位根多项式,分治fwt,章两分解三个矩阵叠加法

4月30日模拟赛

C

\(m=0\) 做法1
到一个点 \(i\) 时,\(1...i-1\) 一定都是 L。设 \(f_i\) 表示从 \(i\) 第一次到 \(i+1\) 的步数,转移为 \(f_i=2+\sum_{j=a_i}^{i-1}f_j\)。设 \(F_i\)\(f_0+f_1+...+f_i\),则 \(F_i=2+2F_{i-1}-F_{a_i-1}\)

\(m=0\) 做法2
\(g_i\) 表示从 \(0\) 开始第一次到 \(i+1\) 的步数,到 \(i+1\) 一定会经过 \(i\),所以先算上 \(g_{i-1}\),然后会跳到 \(a_{i-1}\),则还需要加上从 \(a_{i-1}\) 开始第一次到 \(i-1\) 的步数,这等于 \(g_{i-1}-g_{a_{i-1}}\),因为到 \(i-1\) 的状态一定会经过到 \(a_{i-1}\) 的状态,这两个状态之间的步数为 \(g_{i-1}-g_{a_{i-1}}\)
\(g_i=2+2g_{i-1}-g_{a_{i-1}}\)

75分做法3

\(b_{i-1}=2\)\(i\) 设为关键点,则经过一个点时,前面的点,除关键点外,都是 L。
\(f_{i,S}\) 表示从 \(i\) 开始,第一次到 \(>i\) 的点时,走了多少步,到了哪个点,以及关键点的状态。先从 \(i\) 跳到 \(b_i\),再利用 \(i-1\) 之前的 dp 值,可以逐步跳到 \(\ge i\) 为止,此时如果在 \(i\),那么一定会跳到 \(i+b_i\)

复杂度为 \(O(n^22^m)\),使用并查集可以 \(O(n^22^m\alpha(n))\)

密码学第三次小作业

因为 \((e_1,e_2)=1\),存在 \(x,y\) 使得 \(xe_1+ye_2=1\)。则 \(m=c_1^xc_2^y\)。如果 \(x\)\(y<0\),需要先求 \(c_1^{-1}\),再快速幂。

5月1日模拟赛

A

B

C

部分分做法1

\(a_{i,j}=1\) 达到最大值 \(n^3\)
令 $a_{i,j}=

Game of Stacks

Go Play wallnut bowling

平衡树维护链,拆链合并+减半警报

有趣的家庭菜园 5

设区间左端点为 \(p\)
二分答案(还是,先二分一手是不劣的),对于每个 \(a_i\),若 \(a_i\) 在选中的区间内(这里有一个关于 \(p\) 的限制),存在 \(l_i,r_i\)\(a_i\) 只能匹配到 \(b_{l_i}...b_{r_i}\),那么设 \(f(p)\) 表示区间内 \(<a_i\) 的个数(假设 \(a_i\) 互不相同),对于 \(f(p)\) 有对应的限制,因为 \(f(p)\) 关于 \(p\) 是一个分段的一次函数(图像法),可以将 \(f(p)\) 的限制转化到 \(p\) 上,用差分维护。若 \(a_i\) 不在选中的区间内同理。

核心:考虑单个元素的限制

XOR-ranges

子问题,笛卡尔树,dp

先令 \(a_{i,j}=1\),答案取到最大值 \(n^3\)

5月2日模拟赛

A

\(r_i\) 表示 \(i\) 后面第一个 \(j\) 满足 \(a_j<a_i\)

\(X\ge 0\) 做法

如果 \(i<p\le r_i\),变化到的位置是确定的,也就是 \(i\) 后面第一个 \(<a_i-X\) 的位置 \(r'_i\)
否则不变。使用差分维护。
\(r'_i\) 有三种做法:扫描值域 set 维护(好写)、单调栈(性质更好)、在 \(i\to r_i\) 的图上做倍增(\(i,r_i,r_{r_i},...\) 就是整个单调栈)。

这一部分 \(O(n\log n)\)

\(X<0\) 做法

\(Y=-X\),那么也就是选择一个非空且非整个数组的前缀 \(+Y\)

性质1 答案不会变小。
性质2 \(ans'-n\le ans\le ans'\)
性质3 如果存在 \(a_i<0\),一定可以取到 \(ans'\)
证明:
性质4 一定选择后缀最小值。

证明:

枚举后缀最小值 \(p\),那么只有后缀最小值的 \(r_i\) 会变化,且变化的 \(i\) 是一段区间,双指针统计,这一部分时间线性。

B

\(f_{i,j}(x)\) 表示 \(i\) 子树选择 \(j\) 层,最上层的点权值 \(\le x\) 的方案数,设 \(F_{i,j}(x)\)\(f_{i,j}(x)\) 的前缀和。
\(f_{i,j}(x)=\prod f_{v,j}(x)+\sum_{y\le x}[L_i\le y\le R_i]\prod f_{v,j-1}(y)\)

显然 \(f_{i,j}(x)\) 是关于 \(x\) 的函数,更具体的,\(f_{i,j}(x)\) 是分段函数,每一段都是关于 \(x\) 的不超过 \(n\) 次多项式。

对每一段维护前 \(n\) 个连续点值,点积点和可以轻松维护,前缀和需要求一个插值。

对连续点值插值的复杂度为 \(O(n)\)。对着式子写一下,就是 \(i!(n-i)!(-1)^i\),需要求 \(\frac{\prod(x-j)}{i-j}\),可以线性逆元/前后缀积。

做法2

不同于做法1,设最上层权值最大值等于 \(x\) 的方案数,但是需要差分,可以考察 \(F_{i,j}\),给出 \(F_{i,j}\) 的转移,避免了差分。
做法3
如果真要差分也能做。

秋季限定生成树问题

观察1\((x,y)\ge 2\) 时一定不优,证明:

待补

因此答案不会超过对于所有 \(1\le x<n\)\(x\) 最大的出边求和。即 \(\sum_{x=1}^{n-1} x(\max_{x<y\le n,(x,y)=1}y)+1\)。并且上界可以取到。

对于每个 \(y\),计算有多少 \(1\le x<y\),满足 \(x\)\(y+1...n\) 都不互质,\(x\)\(y\) 互质。容斥成和 \(y+1...n\) 都不互质的减去和 \(y...n\) 都不互质的。

\(n-y\) 不会很大,一个比较松的界是 prime gap。

暴搜,依次 dfs 每个数,维护 \(d\) 表示限制 \(d\mid x\)。对于一个数 \(y\)\([(x,y)\ne 1]=1-\sum_{t|y}\mu(t)[t\mid x]=-\sum_{t|y,t>1}\mu(t)[t\mid x]\),将 \(d\) 变为 \(d,t\) 的 lcm。因为 \(t>1\),不会搜很多步就会搜出一个 \(>n\)\(d\)

剪枝1\((d,x)\ne 1\),已经蕴含了有关 \(x\) 的限制,可以直接 dfs 到下一个数。可以省去求 lcm。
剪枝2 按照 \(|\omega(x)|\) 从小到大 dfs。
剪枝3 直接从大到小 dfs,就不需要对每个 \(y\) 单独求一遍了。

不要在 dfs 的过程中把 ss[S] 覆盖掉了,注意别爆 longlong

一般图最大权完美匹配的一(两)个错误的费用流建模:

一般图大小为 \(k\) 的最大匹配的点集 \(S_k\subset S_{k+1}\)

动态维护点集 \(S\) 的重心、求一个点 \(c\) 到点集 \(S\) 所有点距离和、求点集 \(T\) 内的点到 \(c\) 的最大距离。

求法:

  1. \(S\) 的重心一定在 \(S\) dfs 序第 \([m/2]+1\) 个点(中位数)到根的路径上。/ 点分树 / 全局树剖,二分 / satt
  2. 淀粉树/拆贡献/
  3. 淀粉树

删点、找到 \(S\) 中距离 \(c\) 最近的点、找到

考虑变化

5月4日模拟赛

B

欧拉图(非孤点联通,且每个点入度=出度)欧拉环排列个数为 \(T*\prod (\deg_i-1)!\)(证明:双射)。

\(T\) 为:以任意一个点为根的外向树/内向树(两者是相等的(将边全部反向),任何一个根得到的结果也是相等的)个数。

欧拉环排列,也就是任意一个循环移位被视为和他相等。

\(1\) 开始回到 \(1\) 的欧拉路径额外乘上一个 \(\deg_1\)

状态如果记录内向树的边集,状态数为 \(6\);如果利用矩阵树定理,记录 \(2\times 2\) 的矩阵行列式,状态数为 \(4\)

C

枚举在 \(G_1\)\(Y\) 的对应点以及 \(G_2\)\(X\) 的对应点。

\(G_1\)\(G_2\) 叠在 \(T\) 上,同时删掉 \(X,Y\)\(T\) 被分裂为若干连通块 \(G'\)\(G_1',G_2'\) 分别是 \(G_1,G_2\) 删掉 \(Y,X\) 的图,中间的连通块(如果 \(X,Y\) 不相邻)同时属于 \(G_1',G_2'\)\(X\) 一侧的联通块属于 \(G_2'\)\(Y\) 一侧的属于 \(G_1'\)

那么 \(G'\) 的形态是已知的,也就是所有联通块内部的形态都已知,那么只需要将 \(G_1'\)\(G_2'\) 的联通块两两匹配,需要满足一些要求。首先,同时属于 \(G_1',G_2'\) 最多一个,不能有既不属于 \(G_1'\) 又不属于 \(G_2'\) 的联通块。先将 \(G_1',G_2\)\(G_2',G_1\) 贪心匹配,如果有剩余,必须是 \(G_1',G_2'\)

预处理子树和子树补的哈希。先假设联通块个数都对上号,那么总的联通块个数不超过 \(Y\)\(G_1\) 上的度数和 \(X\)\(G_2\) 上的度数之和,总复杂度 \(O(n^2)\)

tip:无根树哈希,如果有两个重心\(c_1,c_2\),求\(c_1,c_2\)的哈希值较大者作为整个树的哈希值。

求树哈希需要一个 random oracle,也就是\(F_{2^{64}}\to F_{2^{64}}\) 的随机映射,这个可以看成是给你上一个数让你生成下一个数,但是实际上并不能保证是真正随机的,可以使用环长(周期)来估测random oracle的好坏,可以选择的方法有:
1.

ll h(ll x) {
    return x * x * x * 1237123 + 19260817;
}
ll f(ll x) {
    ll cur = h(x & ((1 << 31) - 1)) + h(x >> 31);
    return cur;
}
  1. xor-shift 哈希
ull K=2010101220100326,mask=520520520520520,X=2222223333333331,K2=1;

ull xor_shift(ull x){
    x^=mask;
    x^=x<<13;
    x^=x>>7;
    x^=x<<17;
    x^=mask;
    return x;
}

ull xor_shift2(ull x){
    return x*X;
}

热身 1

两倍近似:按照任意顺序分配任务,每次贪心分配给结束时间最小的机器。
证明:待补。

1.5倍近似:按照时长最大到小分配。

设任务数为 \(m\),时长从大到小 \(t_1,...,t_m\)\(n\) 个机器。
证明:设最优解为 \(t^*\)。对于贪心出来的结果,取结束时间最晚的机器,取最后一个任务,不妨假设就是第 \(m\) 个任务,时长为 \(t_m\),以及这个机器上的其他任务,总时长为 \(t_0\),分别证明 \(t_0\le t^*\)\(t_m\le \frac12 t^*\)
证明 \(t_0\le t^*\):按照贪心策略最后一次选择给了这个机器,则其他机器肯定大于这个机器,因此 \(t_0\) 不超过平均值;而 \(t^{*}\) 不小于平均值。

证明 \(t_m\le \frac12 t^*\)\(n\le m\) 显然贪心出的就是最优解;否则最优解中一定存在一个机器有两个以上的任务,所花费的时间至少是 \(2t_m\)

倍增分块,重构

stern-brocot树,二分斜率

两个整点连线下方整点个数,picks theorem

5月5日模拟赛

A
假做法?
\(n\)个点连成森林的充要条件
题解做法
类似题:circuit
这种分析度数的构造题都不太会
B
分块,维护平面最近点对;带权
sqrt(log)
C
满足树的拓扑关系的贪心:考虑合并
取出除根以外最优的点 \(x\),如果选了父亲 \(fa_x\),就一定会选 \(x\),所以可以等效地向上合并,将 \(x\)\(fa_x\) 合并为一个点。

那么就只需要考虑如何比较两个点谁更优,这是一个 exchange argument。将信息扩展为一个二元组 \((a,b)\),考虑 \((a_1,b_1),(a_2,b_2)\) 谁放在前面列出一个不等式,再移项,变成比较各自的性价比。

hall定理 好题,要补

Good Graph

任意 \(|S|\le|N(S)|\) 等价于存在完美匹配。

不存在完美匹配时

考虑从一个为匹配点 \(s\) 出发 bfs,将所有 bfs 到的左部点加入集合 \(T\),则 \(|T|=|N(T)|+1\)。因为 bfs 到的生成树形成一个交错树,即任意一个 \(T\) 中的右部点,都存在对应的左部匹配点,且属于集合 \(T\);对于 \(T\) 中任意一个左部点,如果不为 \(s\),它的右部匹配点一定属于 \(T\)

(补充:设失配点个数为 \(c\),实际上可以构造 \(|S|-|N(S)|\) 取遍 \(0...c\)

存在完美匹配时

性质:对于紧集 \(S,T\)\(S\cup T,S\cap T\) 也是紧集。

证明:

\(|N(S)|=|S|\)
\(|N(T)|=|T|\)
两式相加得 \(|N(S)|+|N(T)|=|S|+|T|\)
\(|N(S)\cup N(T)|+|N(S)\cap N(T)|=|S\cup T|+|S\cap T|\)
\(|N(S\cup T)|+|N(S\cap T)|\le |S\cup T|+|S\cap T|\)
\(|N(S\cup T)|\ge |S\cup T|\)\(|N(S\cap T)|\ge |S\cap T|\)
所以.....

那么对于每个左部点 \(x\),都存在包含它的唯一的极小的紧集 \(P_x\)。求法:首先令 \(P_x=\{x\}\),然后对于所有 \(v\in N(P_x)\),将 \(q_v\) 加入 \(P\)。两个二分图的紧集相同当且即当 \(P_x\) 相同。

对于所有 \((u,v)\in E\),连接 \(u\to q_v\),得到一个有向图 \(G\)。一个有向图对应一个二分图,且边数相等。那么只需要找到一个有向图 \(G'\),满足 \(G,G'\) 的连通性相同。对于每个强连通分量,如果不是单点,连出一个环,缩点变成 DAG。对于 \((x,y)\in E\),如果不存在 \(x\to y\) 且不经过 \((x,y)\) 的路径,那么需要加入 \((x,y)\);如果 \((x,y)\notin E\),则 \((x,y)\) 一定不属于 \(E'\)

posted @ 2026-07-24 10:55  Network_Error  阅读(11)  评论(0)    收藏  举报