暑期记录

逻辑学家间的聚餐(logic)

原题

题意:给定无向图,把点集分成两个集合,使得两个集合中构成的子图都是欧拉回路。\(1\le n \le 10^3,1\le m \le \dfrac{n(n-1)}{2}\)

\(x_i = \{0,1\}\) 表示分在了哪个集合中,那么条件就是 \(\forall i,\sum\limits_{j} e_{i,j}[x_i = x_j]\equiv 0\pmod{2}\),即 \(\sum\limits_j e_{i,j}(x_i + x_j + 1)=0,x_i \cdot d_i + \sum\limits_j x_j \cdot e_{i,j} \equiv d_i \pmod{2}\)

那么就是一个模 \(2\) 的线性方程组,高斯消元后答案就是 \(2^{自由元个数}\)

复杂度 \(\Theta(\dfrac{n^3}{w})\)

CF1707E Replace

原题

\(f(l,r)\)\(a[l,r]\) 区间的值域,即 \([\min(a[l\sim r]), \max(a[l\sim r])]\)。设 \(f^k(l,r)\)\([l,r]\) 变化 \(k\) 次的区间,有以下结论:若 \([l_1,r_1] \cap [l_2,r_2] \neq \empty\),则 \(f^1([l_1,r_1] \cup [l_2,r_2]) = f^1(l_1,r_1) \cup f^1(l_2,r_2)\)。这是因为原来的值域相交,那么并起来肯定也是个完整的区间。可得推论:若 \([l_1,r_1] \cap [l_2,r_2] \neq \empty\),则 \(f^k([l_1,r_1] \cup [l_2,r_2]) = f^k(l_1,r_1) \cup f^k(l_2,r_2)\),这是因为 \(f^{k-1}(l_1,r_1) \cap f^{k-1}(l_2,r_2) \neq \empty\),所以根据上面的结论即可证明。

那么可以用一个数据结构维护一些关键区间,再倍增一下算 \(f^{2^p}\) 即可。

复杂度 \(\Theta(n\log^2 n+m\log n)\)

CF1710E Two Arrays

原题

首先二分答案 \(mid\),将 \(a_i + b_j \le mid\) 的看成是 \(0\),否则是 \(1\)。那么 A 想最后留在 \(0\),B 最后留在 \(1\)。每一步肯定是在 \(01\) 间交替,可以建一个二分图,将它复制 \(1000\) 次,使得每条边 \((u,v)\) 在任意两个复制的图之间都出现。

则这个问题等价于一开始在一个 \(1\) 的点,每次走到二分图的另一边,把上个点删掉,走不了的就输了。这是一个经典结论:

  • 二分图博弈,每次走到相邻的一个点并删除上个点,走不了的人输,先手获胜的充要条件是:二分图的所有最大匹配都包含起始点。

    • 充分性:由于起始点在所有最大匹配都出现,所以不存在一条从起始点的增广路,使得可以走匹配-非匹配边最后走到一个非匹配点(否则可以把起始点扔掉换成这个点),那么先手就一直走匹配边即可。
    • 必要性:假设存在一个不包含起始点的最大匹配,在先手走完第一步后后手可以一直沿着匹配边走,而先手不可能走到一个非匹配点(否则最大匹配 +1),所以先手肯定会输。

那么只需要求出这个二分图的最大匹配,删掉起始点再求一次看看是否相等即可,而复制了 \(k\) 次的二分图 \(G^k\) 的最大匹配 \(|M^k|=k|M|\),证明如下:

  • \(|M^k| \ge k|M|\),只需要把最大匹配复制 \(k\) 次即可

  • \(|M^k| \le k|M|\),将最大匹配复制 \(k\) 次后假设存在一条增广路,那么将这个增广路拿出来映射到原图上,显然对于一个 \((u_1,id_1) \to (u_2,id_2) \to \dots \to (u_1,id_1)\) 的环,将其删掉增广路依然合法,那么这条增广路就能完全映射到一个原图上了,得出矛盾。

所以只需求出原图最大匹配,可以将 \(a,b\) 从大到小排序,\(1\) 的点是左上角的一个凸的轮廓线。考虑 hall 定理,即求出 \(\max\limits_S (|S| - |N(S)|)\)。那么选出的 \(S\) 中,一定不存在 \((i,t),(j,t)\) 使得 \(i<j\)\((i,t) \notin S, (j,t) \in S\),这是因为 \(i\) 行的 \(0\) 个数肯定小于等于 \(j\)\(0\) 个数,换成它肯定不劣,列也同理。所以 \(S\) 肯定是一个左上角的矩形(只有前缀的行列),那么枚举行数是 \(i\),再双指针处理一下列 \(j\),当且仅当 \(j+1\) 列权值 \(>0\) 才加入,做个前缀和优化一下即可线性求出。

对于删掉起始点 \((x,y)\) 的最大匹配也类似,不过要将 \((x,y)\) 移到行中 \(1\)、列中 \(1\) 数量相同的行/列中最后一个就行。

复杂度 \(\Theta(n\log V)\)

P13833 【MX-X18-T5】「FAOI-R6」纯蓝

原题

对于一个有序的 \(\{ a \}\)\(\{ l \}\),分配的方案数为 \(\prod\limits_i \max(0,\sum\limits_j [l_j \ge a_i] - (n-i))\)

由于 \(\min\limits_{i<j} a_i \oplus a_j = \min\limits_{i<n} a_i \oplus a_{i+1}\),容易得到 \(n V^2 \log V\) 的 dp,枚举 \(f(a) >k\),方案数 \(f_{i,j}\) 为放了 \(i\)\(a\) 最大的是 \(j\),转移即枚举一个 \(p \oplus j > k \land p \ge j\)\(p\) 转移,显然只有 \(\log V\) 个区间,直接差分即可。

考虑 \(f(a)\) 的上界,设 \(t = \lfloor \log_2 f(a) \rfloor\),则这 \(n\) 个数放到 trie 树上,则 \(<t\) 位的那些子树 \(siz \le 2\),不然取这个子树里两个更优。

那么在前 \(\log V - t\) 层中,至少要有 \(\dfrac{n}{2}\) 个叶子,那么 \(2^{\log V - t} \ge \dfrac{n}{2}\),那么 \(f(a) \le \Theta(\dfrac{V}{n})\),于是上面的做法就是 \(\Theta(V^2 \log V)\) 的。

考虑继续优化,对每个 \(j\) 枚举 \(\log V\) 个区间也太不优了,直接枚举 \(j\oplus p\) 第一个比 \(k\) 大的位,再枚举 \(j\) 的前面这些位置,那 \(p\) 前面这些位置也是确定的,简单讨论前面这些位置的大小关系然后后面的位置都可以任意取,于是就有 \(j\) 的一段区间的和转移到 \(p\) 的一段区间,可以前缀和 + 差分求出。

复杂度 \(\Theta(V^2)\)

posted @ 2025-07-31 20:27  FantasyNumber  阅读(1)  评论(0)    收藏  举报