「2022/08」学习记录

烂。直接来点闲话不过分吧(为什么最近一堆人在写。)

人一点都不好,我不想开学。可能是在忧郁新班级,可能是在怀念旧班级。

从去年 5 月省选结束后一直有一种,自暴自弃的心境。怎么说嘛,毕竟学了这么久我之前从来没这样过?

但这种心境很影响学习效率,打开题目的时候时时听到心里说什么,啊你这水平有啥用,你努力了也没用。直接没动力。

很好现在才 \(8\) 月,我已经在害怕 NOIP 了。人很怕重蹈覆辙不是吗。

很可怕。非常可怕。

写了这么多等于没写。(?)不过我好像一直疯疯癫癫这些想法好像也很正常(不是)。

ok。从我这篇文章认真打 \(\LaTeX\) 来看我还是很正常(笑死(你说了个锤子(但是说出来感觉还不错(你是矛盾文学奖获得者吧(括号好多捏)。

下面是正文了。

昙花能接受凋落,我却不愿只做过客。

欲望若不能发热,那么我的呐喊中还剩下什么。

我说着信仰的谎,做没有领地的国王。

坠亡于高空缺氧,也要好过只能葬身狭小池塘。

她她她她,想要飞翔;

梦想梦想,病入膏肓。

带我去往生命未诞生的地方,让我看一看天堂。

Lorem ipsum dolor sit amet.


「联合省选 2022」卡牌

\(n\) 个数, \(m\) 次询问,每次给出 \(c\) 个质数,问有多少个 \(n\) 数的子集,使得每个质数整除子集内的数的乘积。

满足 \(n \le 10^6,m \le 1500,\sum c_i \le 18000\)

首先只有最多有 \(2000\) 个数,关于质数类可以自然想到根号分治,注意到 \(43 \times 47 > 2000\),这意味着后面的数最多选一个。而对于 \(\le 43\) 的数只有 \(13\) 个,考虑状压。于是先考虑处理出只含有前 \(13\) 个质数作为质因子的情况,设 \(f(s)\) 表示状压为 \(s\) 时满足条件的数有多少种。转移一下就好了。

再考虑比较大的质数,注意到他们只会出现一次,那么把贡献的数除以当前的质数,并不会影响他的答案。

「联合省选 2022」填树

给你一棵树,每个点要么权值为 \(0\),要么权值是 \([l_u,r_u]\) 之间的正整数,你可以选择上面的任意一条链使得它的权值不为 \(0\)

求满足树上非零权值的最大值和最小值的差小于等于的树的方案数。

保证 \(n \le 200,l_i\le r_i\le 10^9,k \le 10^9\)

首先有一个想法,枚举最小值,然后统计当前答案。容斥一下就可以了。然后再换根一下。就有一个 \(\mathcal{O}(nw)\) 的做法。

然后发现没法优化了。于是探讨一下性质,注意到每次移动 \([x,x+k]\) 这个区间的时候,对于一个点 \(u\),除非他在边界,即 \(l_u=x,l_u+1=x,l_u+k=x\) (其中 \(l_u+1\) 为容斥时),他的贡献只会加一,不变,或减一。

\(n\) 段区间,所以会有 \(\mathcal{O}(n)\) 段这样的变化。相当于每个点有一个类似一次函数的变化,然后所有点的贡献乘起来,也就是一个多项式。

于是枚举每一段变化,拉插插出多项式然后求和即可。复杂度 \(\mathcal{O}(n^3)\)

「联合省选 2022」序列变换

你手里有一个长度为 \(2 n\) 的合法括号序列 \(s\)\(s\) 的每一个左括号有一个权值。

具体而言,形如 \(\texttt{(A()B)}\)(其中 \(\texttt{A}\)\(\texttt{B}\) 均为合法括号序列,下同)的结构是你喜欢的,而形如 \(\texttt{(A)(B)}\) 的结构是你不喜欢的。你有两种操作来改变括号之间的位置。

这两种操作如下:

  • 操作 1:交换形如 \(\texttt{p(A)(B)q}\) 的串中 \(\texttt{A}\)\(\texttt{B}\) 之间的两个括号,变换为 \(\texttt{p(A()B)q}\)(其中 \(\texttt{p}\)\(\texttt{q}\) 为任意串,可以为空,但不一定分别为合法括号序列,下同),它的代价为 \(x\)\(\texttt{(A)}\) 中第一个左括号的权值加上 \(y\)\(\texttt{(B)}\) 中第一个左括号的权值,其中 \(x, y \in \{0, 1\}\)
  • 操作 2:交换形如 \(\texttt{pABq}\) 的串中的 \(\texttt{A}\)\(\texttt{B}\),变换为 \(\texttt{pBAq}\),这个操作不需要代价。

注意:交换的时候所有左括号的权值是跟着这个括号一起交换的。

你现在想知道的是,将 \(s\) 变换为一个不包含你不喜欢的结构的括号序列至少需要多少代价?

保证 \(2 \le n \le 4 \times 10^5,0 \le x,y, \le 1\)

不简化题意了(。下文的 set 一般也指 multiset

建出括号树,再观察一下两个操作。操作一,一个节点的两个儿子 \(a,b\),将 \(b\) 的所有儿子和自己都变成 \(a\) 的儿子。并且要付出 \(xv_a+yv_b\) 的代价。操作二,对于一个节点的儿子,可以任意顺序调换。

最终要操作成一条链,注意到 \(x,y\) 的范围很小。不妨分类讨论。

首先 \(x=0,y=0\),开摆,输出 \(0\)

然后是 \(x=0,y=1\),只计算 \(b\) 的贡献。因为最后要变成一条链,相当于同一层里只能保留一个点,其他点会到下一层。贪心,每层指保留最大值,set 维护即可。

其次是 \(x=1,y=1\),需要计算 \(a,b\) 的贡献。同样希望留下最大值,但是这样最大值会被多次计算,不优。于是考虑先把非最大最小的,需要丢到下层的点先挂在最小值的点上,然后最后把最小值的点挂在最大值的点上。这样最小值的贡献次数为 \(sz_i -2\),本层点的个数减去 \(2\)。依然用 set 维护。

最后是 \(x=1,y=0\),决策同上,最小值贡献 \(sz_i-2\) 次。但是因为不再计算 \(b\) 的贡献,但保留点会在下一层计算的时候贡献,所以保留点不一定是最大值。但能到最后一层的只有一个数,于是自然希望其为最大值。当 \(sz_i>2\) 时,留下非最小和非最大值。

如果 \(sz_i =1\),跟做完了一样。当 \(sz_i=2\) 时,模拟下方最小值和最大值即可。

「联合省选 2022」学术社区

\(n\) 个人和 \(m\) 个消息,一个消息有三种情况:

  • A B loushang:发消息的人叫 \(A\),它产生贡献当且仅当下一条消息是 \(B\) 发的;
  • A B louxia:发消息的人叫 \(A\),它产生贡献当且仅当上一条消息是 \(B\) 发的;
  • A xxx xxx(其他情况):\(A\) 发的一条学术消息,永远不产生贡献。

每人至少有一条学术消息,你要找到一种重排消息的方案,使得所有消息贡献之和最大。

多测,\(T\) 组数据,\(T \le 100,n \le m \le 77777, \sum m \le 2.5 \times 10^5\)

首先有一个建边的想法,也就是 A B loushang 建立 \(A \rightarrow B\)A B louxia 建立 \(B \rightarrow A\)

如果只看 C 条件的部分分,也就是不会同时存在 A B loushangA B louxia ,那相当于要求一个最小路径覆盖。但这是一张图不是二分图。会有环。

注意到每个人至少有一条学术消息,于是考虑把一个环拆开并接在一个学术消息上,这样并不影响答案,也成功消去环。然后就可以跑网络流了。

无特殊性质的做法。如果跑费用流复杂度寄。于是考虑性质,注意到让这两个点直接匹配一定不劣。所以直接连起来然后像上面一样跑网络流即可。

「联合省选 2022」最大权独立集问题

给定 \(n\) 个点的二叉树,点有权值 \(d_{1 \dots n}\)。需要依次删除所有边。删边代价为两端点权值和;删边前会交换两端点权值。求最小总代价。

保证 \(n \le 5 \times 10^3,d_i \le 10^9\)

?前有摧毁树状图后有最大权独立集问题。摧毁树状图后继有人!!!(悲

这题先咕咕咕。

「AGC006F」Blackout

我们有一个 \(n\)\(n\) 列的矩阵。第 \(i\) 行第 \(j\) 列的格子表示为 \((i,j)\)

开始时有 \(m\) 个格子是黑色,其他格子都是白色。特别地,开始时格子 \((a_{1},b_{1})\,(a_{2},b_{2}),...,(a_{m},b_{m})\) 是黑色。

接下来会按照以下的规则尽可能多的将白色格子涂成黑色:

  • 对于整数 \(1\le x,y,z\le n\),如果 \((x,y)\)\((y,z)\) 都是黑色,那么就把 \((z,x)\) 涂黑。

请计算出当再也没有白色格子能被涂黑时,黑色格子的个数。

其中 \(n,m \le 10^5,a_i,b_i \le n\)

把他看成一个图,意味着一个三元环必须同时染色。于是考虑给图染三中颜色,红只能接黄,黄只能接蓝,蓝只能接红。

对连通块进行染色,如果染色失败,以为这他可以操作成完全图,贡献为 \(x^2\)。如果成功了,但只用到了不到 \(3\) 种颜色,贡献就是 \(x\)。否则就是颜色直接相互贡献的数量。

「AGC009D」Uninity

定义一个单独的节点为一棵 Uninity \(0\) 的树。

\(x(x \geq 0)\) 棵 Uninity \(k\) 的树全部连到一个节点上形成的树,称之为一棵 Uninity \(k+1\) 的树。

显然,一棵 Uninity \(k\) 的树,同样也是一棵 Uninity \(k+1,k+2,k+3...\) 的树。

现在给你一棵树,求一个最小的 \(k\) 使得这棵树是一棵 Uninity \(k\) 的树。

ATcoder 搬题石锤。「2022/04」学习记录 中的「POI2004」JAS

「AHOI2013」连通图

给定一个 \(n\) 个点 \(m\) 条边的无向连通图和 \(k\) 个小集合,每个小集合包含 \(c\) 条边,对于每个集合,你需要确定将集合中的边删掉后改图是否保持联通。集合间的询问相互独立。

定义一个图为联通的当且仅当对于任意的两个顶点,都存在一条路径连接它们。

对于所有数据 \(n,k \le 10^5, m \le 2 \times 10^5,c \le 4\)

首先线段树分治可以解决这题。但是在 BZOJ 3569 DZY Loves Chinese II\(c\) 的范围更大。考虑用另一种方法。

在无向图中找一个生成树,于是所有边被分为了树边和非树边。对于所有的非树边,随机一个权值。

对于一条非树边,一定存在有且只有一条由树边组成的路径。于是所有的树边的权值为覆盖的非树边的权值异或和。于是如果删去 \(k\) 条边后不连通,当且仅当 \(k\) 条边存在一个子集异或和为 \(0\)。说明删除了一条树边和他的非树边删去了。可以用线性基维护。

「CERC2016」Lost Logic

给定 \(3\) 组随机布尔变量 \(v_{i,1},...,v_{i,n}(1\leq i\leq 3)\),每组均为 \(n\) 个。你需要构造关于布尔变量 \(x_1,...,x_n\) 的若干组 \(\text{2-SAT}\),使得满足全部条件的布尔变量赋值有且仅有 \((v_{i,1},...,v_{i,n})(1\leq i\leq 3)\)\(3\) 组。

数据保证 \(2\leq n\leq 50,v_{i,j}\in\{0,1\}(1\leq i\leq 3,1\leq j\leq n)\)

\(3\) 组中的每一位进行分类讨论。有 \(4\) 种,全是 \(0\);恰有 \(1\)\(1\);恰有 \(2\)\(1\);全是 \(1\)。但是去掉对称的本质只有 \(2\) 种。

  1. 如果要求全是 \(0\),可以构造条件 \(x_i \rightarrow !x_i\)

  2. 如果恰有一个 \(1\)。那么如果当前位 \(i\)\(1\),就意味着其他位的数必须和这组变量完全相同,利用这个可以构造 \(n\) 个条件。

注意到这样是 \(\mathcal{O}(n^2)\) 的,对于情况二,于是考虑将相同的合并,即另其中一个位置 \(x\) 去约束剩下的位置,其他的约束 \(x\) 即可。

这样构造出来看一下满足条件的解有几个。首先题目给的 \(3\) 个一定满足。不妨设一组 \(d\) 也满足条件,对于第 \(i\) 位,如果和上面第一个情况一样,这意味着第 \(i\) 位和其他三组一样都为 \(0/1\)。情况二,则不能和那个只出现一次的 \(0/1\) 相同。否则他就和那组完全相同。

换句话说,\(d\) 中的每组都是由给定的 \(3\) 中每位的众数。如果 \(d\) 和给定的其中一组相同,则满足题意。否则意味着无解。

假设存在一组条件 \(x_i \rightarrow x_j\) 使 \(3\) 满足但是 \(d\) 不满足,那么 \(d\) 一定满足 \(x_i \rightarrow !x_j\),说明前 \(3\) 组的 \(i\) 众数为 \(1\),位 \(j\) 众数为 \(0\)。那么意味着有一个数也满足 \(x_i \rightarrow !x_j\),与假设矛盾,得证。

「CF325E」The Red Button

\(n\) 个点,编号 \(0 \sim n-1\),点 \(i\) 可以到达点 \(2i,2i+1\)。找一条从 \(0\) 开始的哈密顿回路。

其中 \(2 \le n \le 10^5\)

首先,如果 \(n\) 为奇数则无解。不妨设 \(n=2k+1\),则点 \(n\)\(2k\) 都只有从 \(k\) 可以到达,这意味着 \(k\) 被经过 \(2\) 次,不合题意。

于是接下来只考虑 \(n\) 为偶数的情况。

于是有 \(k,k + \dfrac{n}{2} \rightarrow 2k,2k+1\)。所以为了只经过一次,\(k,k+\dfrac{n}{2}\) 分别连向不同的点。这样会形成若干个环,于是用并查集维护,每次合并连边时考虑合并不同的环,最后一定只剩下一个大环。

「CF360D」Levko and Sets

有两个整数数组 \(a_1,a_2 \dots a_n\)\(b_1,b_2 \dots b_m\),与一个质数 \(p\),现在要生成 \(n\) 个集合,第 \(i\) 个集合生成方式如下:

  1. 开始,集合只有元素 \(1\)
  2. 从集合中选一个元素 \(c\) ,对于所有的 \(j\),如果足 \(c\times a_i^{b_j}\%p\) 不在当前集合,就把它加入集合 。
  3. 重复以上步骤 。

\(n\) 个集合的并的大小。

其中 \(n \le 10^4,m \le 10^5,p \le 10^9\)

首先求出 \(d=\gcd\limits_{i=1}^m b_i\)。于是第 \(i\) 个集合即为 \(\{ a_i^{kd} \pmod{p} | k \in \mathbb{N} \}\)。然后另 \(k_i\) 表示最小的 \(k\) 满足 \(a_i^{k_id} \equiv 1 \pmod{p}\)。注意到 \(k_i\) 一定是 \(\varphi(p)=p-1\) 的因数。

考虑原根,不妨设原根为 \(g\),于是答案为 \(\{ g^{i \cdot \frac{\varphi}{k_i}} | 0 \le i < k_i \}\)

于是计数的时候考虑去重,每次筛掉因数倍数就可以了。

「CF429E」Points and Segments

给定 \(n\) 条线段 \([l_i,r_i]\),然后给这些线段红蓝染色,求最后直线上上任意一个点被蓝色及红色线段覆盖次数之差的绝对值不大于\(1\)

其中 \(n \le 10^5,l_i,r_i \le 10^9\)

想到了之前的一题。把一个线段当成一条边处理,于是对 \(l\)\(r+1\) 连一条边。对于 \(x\) 轴上的奇点,与相邻的连边即可。然后跑欧拉回路就可以了。

跑欧拉回路相当于给边定向,根据定向判颜色即可。

「CF449D」Jzzhu and Numbers

给出一个长度为 \(n\) 的序列 \(a_1,a_2...a_n\)。求构造出一个序列 \(i_1 < i_2 < ... < i_k(1\le{k}\le{n})\) 使得 \(a_{i_1}\&a_{i_2}\&...\&a_{i_k}=0\) 。求方案数模 \(10^9+7\)

对于所有数据,满足 \(n \le 10^6\)

首先有一个显然的 dp,设 \(f(i,j)\) 表示当前到底 \(i\) 个,当前的与和为 \(j\)。于是有

\[f(i,j) = f(i-1,j) + \sum\limits_{k \& a_i = j} f(i-1,k) \]

看到这个转移,和那自然的想到了 FWT。于是可以想到一个很暴力的方法,每次转移但是时候,开一个以 \(a_i\) 为下标的数组,然后 fwt 一下再卷。

然后注意这种暴力卷的时候,新开的数组只有下标为 \(a_i\)\(1\)。然后正向变换是求超集和,于是相当于这会让结果翻倍。

于是 \(a_i\) 都是让其翻倍的,所以直接对 \(a_i\) 的下标数组中做一个整体的 FWT 即可。

「CF516D」Drazil and Morning Exercise

给定一棵 \(n\) 个点的树,边有边权,定义 \(f_x = \max_{i=1}^n \text{dist}(x,i)\)

\(q\) 次询问最大的满足 \(\max_{x \in s} f_x - \min_{x \in s} f_x \le l\) 的连通块 \(s\) 包含的点数。

保证 \(n \le 10^5\)\(q \le 50\)

比较妙。注意到 \(\min f_x\) 一定在直径上,这里反证一下就好了。所以这个点就是直径的中点,我们以他为根,于是这个新的树一定满足 \(f_u \le f_v (v \in son_u)\)

于是对于每个点,二分出他满足条件的最小父亲,然后这相当于是他能贡献这一条链。差分一下,然后最后在做个子树和取 \(\max\) 即可。

「CF526G」Spiders Evil Plan

给定一棵 \(n\) 个节点的无根树,每条边有边权。

\(q\) 次询问,每次询问给出 \(x,y\),你需要选择 \(y\) 条树上的路径,使这些路径形成一个包含 \(x\) 的连通块,且连通块中包含的边权和最大。

\(n, q \le 10^5\),强制在线。

有一个关键性质,\(k\) 条路径可以覆盖一个 \(2k\) 叶子的树。所以反之,选 \(y\) 条路径也可以看成选 \(y\) 个叶子。

然后再注意到,直径的一端肯定会被选。反证一下,如果直径两个端点都没有被选,那么意味着我们删去一个叶子 \(u\),然后选上其中一个端点会更劣;那么这意味着 \(u\) 应该才是直径端点。所以假设不成立。

于是两个端点都算一下答案取更优就好了。

这下问题就是有根树,选 \(2y-1\) 个叶子。类比长链剖分。长剖一下然后选最长的前 \(2y-1\) 一定最优。

然后考虑经过 \(x\) 的条件,发现有两种情况。一种是删除最小链,然后连通 \(x\) 到连通块的路径;一种是打通 \(x\) 到连通块的路径,删除第一个碰到点的路径。

相当于是一个保证,前面决策最优。一个是保证 \(x\) 最优。证明应该还是可以反证。

「CF527E」Data Center Drama

给定一张 \(n\) 个点 \(m\) 条边的连通无向图。

你需要加尽可能少的边,然后给所有边定向,使得每一个点的出入度都是偶数。

边可以是自环,也可以有重边。

保证 \(n \le 10^5\)\(m \le 2 \times 10^5\)

自然想到欧拉回路。考虑奇数点连奇数点。如果最后有不符合条件的加个自环就可以了。

「CF536D」Tavas in Kansas

给定一张 \(n\) 个点 \(m\) 条边的可能有自环和重边的无向连通图,每条边都有一个非负边权。

小 X 和小 Y 在这张图上玩一个游戏,在游戏中,第 \(i\) 个城市有一个权值 \(p_i\)

一开始,小 X 在城市 \(s\) 中,小 Y 在城市 \(t\) 中,两人各有一个得分,初始为 \(0\),小 X 为先手,然后轮流进行操作。

当轮到某一个人时,他必须选择一个非负整数 \(x\),以选定所有与他所在的城市的最短距离不超过 \(x\) 的还未被选过的城市,他的得分将会加上这些城市的权值。

另外,每个人每次必须能够至少选定一个城市。

当没有人可以选择时,游戏结束,得分高者获胜。

现在请你计算出,在两人都使用最佳策略的情况下,谁会获胜(或者判断为平局)。

其中 \(n \le 2 \times 10^3\)\(m \le 10^5\)\(|p_i| \le 10^9\)
预处理 \(s,t\) 到每个点的距离,离散一下。然后图就没什么用了,抽象一下,把第 \(i\) 个点设为坐标 \((d_{s,i},d_{t,i})\),点权就是 \(p_i\)。于是变成每次按顺序选一列/行。接着考虑 DP。

\(f(0/1,i,j)\) 表示谁先手,剩下 \((i,j)\) 右下的一部分,两个人的分差。预处理一些前缀和就可以了。

「CF542E」Playing on Graph

给定 \(n\) 个点 \(m\) 条边的简单无向图,每次可以选择两个没有直接连边的点 \(x,y\),把他们缩起来。具体而言,删除点 \(x,y\),添加新点 \(z\),把与 \(x,y\) 相连的点都与 \(z\) 连边。

显然,最后无向图会缩成若干棵树,求所有情况的树的最长直径。

其中 \(n \le 10^3,m \le 10^5\)

注意到三角形是不合法的,于是把他归纳一下,就是奇环不合法。

于是注意到结果一定是若干个二分图。于是把二分图分层后,缩成一条链就是最长链。

「CF963B」Destruction of a Tree

给你一棵树,如果树上的节点有偶数条边与它相连,则这个节点是可删除的,删除这个节点后所有与之相连的边也将删除。判断一棵树是否可以依次删除所有节点。

其中 \(n \le 2 \times 10^5\)

考虑 dp,设 \(f(u)\) 表示删去点 \(u\) 是否不用提前删 \((fa_u,u)\)。转移即儿子们的异或和。

「CF1423J」 Bubble Cup hypothesis

给定正整数 \(m\),求有多少不同的多项式 \(P\) 使得:

  1. \(P(2)=m\)
  2. 对于多项式 \(P\) 任意一项的系数 \(i\) 有: \(i\) 为整数且\(0 \leq i \leq 7\)

输出答案对 \(10^9+7\) 取模后的值。

多组数据,满足 \(T \le 5 \times 10^5,m \le 10^{18}\)

首先注意到 \(i\) 的范围,想到了 \(8\) 进制。于是把式子分一下。

\[(x_0 8 ^0+x_38^1+\dots)+ 2(x_18^0+x_48^1+\dots)+4(x_28^0+x_58^1+\dots) \]

于是变成了 \(3\) 个八进制数相加问题。即 \(a+2b+4c=m\)

分类讨论一下解数即可。

「CF1436F」Sum Over Subsets

你有一个可重集 \(S\),要求他的两个子集 \(A,B\) 满足:

  1. \(B\)\(A\) 的子集。

  2. \(B\) 的元素个数等于 \(A\) 的元素个数减一。

  3. \(A\) 的所有元素 \(\gcd\)\(1\)

计算 \(\sum_{x∈A} \cdot \sum_{x∈B}\),对所有满足条件的 \(A,B\) 累加求和,对 \(998244353\) 取膜。

其中 \(m \le 10^5,a_i \le 10^5\)

这篇先鸽着。

「CF1515 I」Phoenix and Diamonds

\(n\) 种钻石,一颗第 \(i\) 种钻石重量为 \(w_i\),价值为 \(v_i\),一开始第 \(i\) 中钻石的库存为 \(a_i\)。接下来进行 \(m\) 次操作:

  • 1 k d:进货了 \(k\) 个种类为 \(d\) 的钻石;
  • 2 k d:卖出了 \(k\) 个种类为 \(d\) 的钻石;
  • 3 c:如果你有一个大小为 \(c\) 的袋子,且按照第一关键字为价值(从大到小),第二关键字为重量(从小到大)的顺序取钻石的话,你最终可以取到钻石的价值为多少(注意操作不会真正执行)。

其中 \(n \le 2 \times 10^5,k,d,a_i,m \le 10^5,c \le 10^{18}\)

对于 \(c\) 的最高位 \(w\)。设重量为 \(< 2^{w-1}\) 的为轻的,设 \([2^{w-1},2^w)\) 为重的,于是显然重最多取一个。于是用线段树维护第 \(k\) 位,轻的钻石价值重量和,轻的加上一个最小的重的重量和。

于是查询的时候,优先考虑取重+轻的,再考虑全轻的,最后再递归下去。

「HAOI2015」按位或

刚开始你有一个数字 \(0\),每一秒钟你会随机选择一个 \([0,2^n-1]\) 的数字,与你手上的数字进行或操作。选择数字 \(i\) 的概率是 \(p_i\)。问期望多少秒后,你手上的数字变成 \(2^n-1\)

对于 \(100\%\) 的数据,\(n\leq 20\)。保证 \(0\leq p_i \leq 1\)\(\sum p_i=1\)

考虑设 \(\max(s)\) 表示最后一位置变成 \(1\) 的时间。于是想到 \(\operatorname{min-max}\) 容斥,设 \(\min(s)\) 表示 \(s\) 的第一个位置变为 \(1\) 的时间,即 \(s\) 中所有数都变成 \(1\) 的时间。

于是令 \(m=2^n-1\), 答案即为 \(\operatorname{E}(\max(m))\)。由容斥:

\[\operatorname{E}(\max(s)) = \sum\limits_{t \subseteq s} (-1)^{|t|+1} \operatorname{E}(\min(t)) \]

\[\operatorname{E}(\max(m)) = \sum\limits_{t} (-1)^{|t|+1} \operatorname{E}(\min(t)) \]

于是考虑算 \(\min\)。首先有

\[\operatorname{E}(\min(s)) = \sum\limits_{i \ge 1} i \operatorname{P}(\min(S)=i) \]

然后

\[\operatorname{P}(\min(s)=i) = \left( \sum\limits_{t \cap s = \varnothing} \operatorname{P}(t) \right)^{i-1} \left( 1- \sum\limits_{t \cap s = \varnothing} \operatorname{P}(t) \right) \]

于是

\[\operatorname{E}(\min(s)) = \dfrac{1}{1 - \sum\limits_{t \cap s = \varnothing} \operatorname{P}(t)} \]

然后用 FWT 写个子集卷积求个和就好了。

「HNOI2009」图的同构计数

\(n\) 个顶点组成的简单无向图中,有多少种图互不同构。

其中 \(n \le 60\)

用这题很好的学习了 Burnside 引理。

\[|X / G| = \dfrac{1}{|G|} \sum\limits_{g \in G} |X^g| \]

转化一下题意,相当于一个完全图中的边可能存在或不存在。于是相当于给一个 \(n\) 个点的完全图染色,可以染成 \(2\) 颜色。问最后结果不同的方案数。

于是问题就是找不动点。每个等价类的颜色必须要染成一样,如果置换 \(g\) 中有 \(k\) 个等价类,那么就有 \(|X^g| = 2^k\)

对于一个点的置换 \(g\),设他有 \(K\) 循环。考虑怎么求边。设一个循环的长度为 \(b\)

如果这条边的两个端点都在一个循环内。可以理解为一个圆,于是 \(x\)\(b-x\) 本质是一样的,这意味着这个循环有 \(\left\lfloor \frac{n}{2} \right\rfloor\) 个等价类。

如果在不同循环内,设长度分别为 \(b_1,b_2\)。于是这条边会在 \(\operatorname{lcm}(b_1,b_2)\) 后回到自己,所有有 \(\dfrac{x \cdot y}{\operatorname{lcm}(b_1,b_2)} = \gcd(b_1,b_2)\) 个等价类。

于是枚举每个置换 \(g\) 计算即可。但置换总数是 \(n!\) 的,不能接受。

注意到我们并不关心每个循环内是什么,只关心大小,于是对 \(n\) 进行拆分即可。

「HNOI2016」最小公倍数

给定一张 \(N\) 个顶点 \(M\) 条边的无向图(顶点编号为 \(1,2,\ldots,n\)),每条边上带有权值。所有权值都可以分解成 \(2^a\times 3^b\) 的形式。

现在有 \(q\) 个询问,每次询问给定四个参数 \(u,v,a\)\(b\),请你求出是否存在一条顶点 \(u\)\(v\) 之间的路径,使得路径依次经过的边上的权值的最小公倍数为 \(2^a\times 3^b\)

所有数据满足 \(n,q \le 5\times 10^4,m \le 10^5,a,b \le 10^9\)

套了个跟没套一样的壳,问是否存在路径满足 \(\max\{ a_i \}=a, \max \{ b_i \} =b\)。如果删去 \(>a,>b\) 的边,只要判断是否连通即可。

于是边按照 \(a\) 排序,询问按照 \(b\) 排序。然后对边分块,找到满足的 \(a\) 后再按照 \(b\) 排序。用可回退并查集维护即可。

「NOI2018」你的名字

给定一个字符串 \(s\)。有 \(q\) 次询问,每次询问给定的一个区间 \([l,r]\) 表示 \(S\) 的子串和一个串 \(t\),询问 \(t\) 有多少个本质不同的子串没有在 \(s:[l,r]\) 中出现。

对于所有数据,满足 \(|s| \le 5 \times 10^5,q \le 10^5, \sum |t| \le 10^6\)

首先先考虑 \(l=1,r=|s|\) 的情况。

\(s\) 和每次询问的 \(t\) 建立 SAM。考虑匹配出公共串,于是设 \(len_i\) 表示 \(t\) 的前缀 \(i\)\(s\) 匹配的最大后缀。直接拿 \(s\)\(t\) 的 SAM 上跑就可以处理出了。

有了这个可以考虑用一个节点上字符串个数减去与出现在 \(s\) 中字串的个数。于是记 \(l_i\) 表示 \(i\) 节点的 \(\operatorname{endpos}\) 所代表的最长字符串的长度。然后用这个减去 \(len_i\) 就是当前节点的答案了。

接下来考虑 \(l,r\) 任意。因为我们实际上没用到 \(s\) 的 SAM,只用到了 parent 树的点权。考虑用线段树维护每个点的 \(\operatorname{endpos}\),然后注意到 SAM 的性质是一个点的 \(\operatorname{endpos}\) 是树上儿子的并。于是可以考虑线段树合并。

复杂度 \(\mathcal{O}(n \log n)\)

「P6326」Shopping

给定一棵树,每个节点有一种物品,价格为 \(c_i\),数量为 \(d_i\),价值为 \(w_i\)。请选一些物品,最大化价值和。所选物品所属的的节点必须构成一个连通块。

其中 \(1 \le n \le 500, m \le 4000,w_i \le 4000,d_i \le 100\)

注意到连通块,于是点分治。考虑过该根的答案。于是处理出 dfs 序,然后在 dfs 序上 dp。

多重背包可以用二进制拆分优化。

「PA2011」Kangaroos

给出长为 \(n\) 的序列 \(a\),第 \(i\) 个元素是一个区间 \([l_i,r_i]\)

\(m\) 次询问,给出 \(A,B\),求出 \(a\) 中最长的区间(即这个序列中的一段),使得这个区间内每个区间都与 \([A,B]\) 有交集。输出这个最长区间的长度。

数据满足 \(1\le n\le 5\times 10^4\)\(1\le m\le 2\times 10^5\)\(1\le l_i\le r_i\le 10^9\)\(1\le A\le B\le 10^9\)

这题似乎可以神奇莫队做法,但是细节比较多,于是考虑 K-D Tree 做法。

把区间看成坐标,于是答案就是该点的右上和左下两个矩形的值。考虑用 K-D Tree 维护矩形。

「POI2014」RAJ-Rally

给定一张 DAG,每条边的长度都是 \(1\),选择一个点并删除,使删除后的图中最长路最短。

其中 \(n \le 5 \times 10^5,m \le 10^6\)

首先 DAG,拓扑一下,预处理出从开头到 \(i\) 的最长路与从结尾反图到 \(i\) 的最长路 \(s_i,t_i\)。于是经过 \((u,v)\) 的最长路为 \(s_u+t_v+1\)

考虑一个点 \(i\),假设在拓扑序中在他前的为集合 \(S\),在他后面的为 \(T\)。于是 \(S\) 中的 \(s_i\)\(T\) 中的 \(t_i\) 一定不经过 \(i\)。开一个堆维护 \(S \rightarrow i, i \rightarrow T\) 的最大值。按拓扑序枚举 \(i\),每次相当于把一个 \(i\)\(T\) 中删除加入 \(S\),维护当前点的边即可。

复杂度 \(\mathcal{O}((n+m) \log (n+m))\)

「SDOI2015」序列统计

给定一个集合 \(S\)\(\forall a \in S,a \in [0,m)\)。求从这个集合中选取个得乘积在膜 \(m\) 下为 \(x\) 的方案数。

其中 \(n \le 10^9,3 \le m \le 8000\),且 \(m\) 为质数。

求出原根,然后用原根表示集合内的数。于是最后变成了求出若干个数,他们加起来在膜 \(\varphi(m)\) 的情况下为某个数的方案数。

于是,构造多项式,另 \([x^{s_i}]\) 系数为 \(1\),然后卷 \(n\) 次再取膜即可。可以快速幂。

「SDOI2017」切树游戏

给出一个 \(n\) 个点的树,\(m\) 次操作。询问有多少颗子树的异或和大小为 \(k\),或者修改点权。

对于所有数据 \(n,q \le 3 \times 10^4,m=4/8/64/128\)

先不考虑修改。于是考虑 DP。于是设 \(f(u,i)\) 表示以 \(u\) 为根,异或和为 \(i\) 的答案。初始的时候 \(f(u,a_u)=1\), 于是有

\[f(u,i) \leftarrow f(u,i) + \sum\limits_{j \oplus k = i} f(u,j) \cdot f(v,k) \]

进行一个 FWT 优化。不妨设将 \(f(u)\) FWT 一下。然后以异或值作为下标,不妨设 \(nf(u)\) 表示 \(A[a_u]\) 的 FWT。

\[f(u) = nf(u) \prod\limits_{v} (f(v)+1) \]

于是最后答案就是 IFWT 后的 \(\sum f(u,k)\)。所以不妨设 \(s(u) = f(u) + \sum s(v)\),这样答案就是 \(s(1)\)

接下来考虑带修。带修的 DP 自然想到了动态 DP。树剖一下,于是设 \(lf(u),ls(u)\) 来存一下这个点的所有轻儿子的信息,即

\[lf(u) = nf(u) \prod (f(v)+1) \]

\[ls(u) = \sum\limits s(v) \]

记一个点的的总儿子为 \(ws_u\)。于是改写一下转移:

\[f(u) = lf(u) \cdot (f(ws_u)+1) \]

\[s(u) = f(u) + ls(u) + s(ws_u) \]

于是写出矩阵形式

\[\begin{bmatrix} lf(u) & 0 & lf(u) \\ lf(u) & 1 & lf(u)+ls(u) \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} f(ws_u) \\ s(ws_u) \\ 1 \end{bmatrix} = \begin{bmatrix} f(u) \\ s(u) \\ 1 \end{bmatrix} \]

然后直接矩阵乘法会有 \(27\) 的常数,太慢了。于是观察这个矩阵:

\[\begin{bmatrix} a_1 & 0 & b_1 \\ c_1 & 1 & d_1 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} a_2 & 0 & b_2 \\ c_2 & 1 & d_2 \\ 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} a_1a_2 & 0 & a_1b_2+b_1 \\ a_2c_1+c_2 & 1 & c_1b_2+d_2+d_1 \\ 0 & 0 & 1 \end{bmatrix} \]

所以只要维护矩阵的 \(a,b,c,d\) 即可,这样复杂度就变成 \(4\) 了。树剖维护矩阵的积就好了。

于是修改的时候,直接跳重链,然后修改重链头上的轻边即可。注意修改的时候 \(lf(u)\) 要先除去之前的 \(f(v)+1\) 在乘上修改后的 \(f(v)+1\),为了防止除法出现奇奇怪怪的错误,所以单独开一个线段树维护所以轻儿子的 \(f(u)+1\) 的信息就行了。

最后你谷那个天才卡的树剖。

「SHOI2006」有色图

\(n\) 个点的完全图,点没有颜色,边有 \(m\) 种颜色,问本质不同的图的数量对质数 \(p\) 取模。

其中 \(n\le 53,m \le 1000\)

「HNOI2009」图的同构计数一样。

唯一的区别就是 \(k\) 个等价类的 \(|X^g| = m^k\)

「SNOI2022」军队

\(n\) 个点排成一行,每个点有权值 \(a_i\) 与颜色 \(c_i\),有 \(q\) 次操作,分为三种:

  1. 将某一区间中颜色为 \(x\) 的点染成 \(y\)
  2. 将某一区间中颜色为 \(x\) 的点的权值加上 \(y\)
  3. 求区间权值和。

其中 \(n,q,c_i \le 2.5 \times 10^5, 1 \le a_i,y \le 10^{18}\)

考虑分块。对于整块,可以想到用并查集维护颜色的合并。考虑对每个颜色打上贡献标记后,合并的时候如何防止贡献丢失。对于两个都出现在这块的里的颜色,新建一个节点,贡献为两个颜色的之和。节点数最多为 \(2n\)。复杂度没问题。

「SP1557」GSS2 - Can you answer these queries II

给出 \(n\) 个数,\(q\) 次询问,求最大子段和,相同的数只算一次。

其中 \(n,q \le 10^5\)

欺骗出题人离线一下。考虑按照右端点排序后枚举,算出每个右端点的答案最后取 \(\max\)。开一个线段树维护 \([j+1,i]\) 区间的值 \(s_j\)

然后对于询问区间 \([l,r]\),右端点为 \(r\) 答案就是 \(\max\limits_{l \le j \le r} \{ s_j \}\)。但是这样显然不是最后答案,这里想到了最朴素的最大字段和的做法,于是考虑记录历史最大值。

「THUSCH2017」巧克力

「人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道。」

给定 \(n \times m\) 的网格以及两个参数 \(a,c\)

要求选出一个连通块,不包含 \(c=-1\) 的网格,且 \(c\) 的种类数 \(\ge k\)

在此前提下最小化连通块大小,并在此前提下最小化 \(a\) 的中位数。

其中 \(n \times m \le 233,c_{i,j}=-1\)\(1 \le c_{i,j} \le n \times m,k \le 5\)

首先最小化中位数可以想到二分。

其次,颜色很多,但是 \(k\) 很小。不妨先想颜色上限为 \(k\) 的情况。于是设 \(f(i,j,s)\) 表示选择的颜色 \(s\),包括 \((i,j)\) 位置的最少格子数。枚举子集转移即可。这部分为 \(\mathcal{O}(nm3^k)\)

考虑乱搞。把所有颜色随机分成 \(k\) 组,然后跑上面那个 DP。最优解概率为 \(\dfrac{k!}{k^k}\) 大概随机 \(200\) 即可。

然后实际上 \(200\) 会 WA \(250\) 会 TLE(。

「UR #2」UR #2

不写了突然不想写概括了。

很妙。

一条边的边权为 \(w_i+x\),于是最终路径一定可以表示为 \(px+q\)。设 \(g(k,u,p)\) 表示经过 \(k\) 条边,到 \(u\),结果为 \(px+q\) 的最小的 \(q\)

然后根据 Bellman-ford 判负环的原理,可以列出方程

\[\min\{ kx+g_{n,u,k} \} \ge \min \{ jx+g_{n-1,u,j} \} \]

跑 bellman-ford 来列出这些式子,然后直接手动解开即可。

「USACO17OPEN」Switch Grass P

给定一个 \(n\) 个点 \(m\) 条边的无向图,每个点有一个颜色,每次修改一个点颜色,询问最近异色点对距离。

保证 \(n,m \le 2 \times 10^5\)

首先答案一定是一条边,证明显然。然后又可以发现答案一定在 MST 上。于是我们维护这棵树就行。

于是每个点维护不同颜色儿子的最短距离,于是每个点开一个线段树,存每个颜色的最短距离。

「UVA1057」Routing

给一个有向图,从 \(1\) 点出发走到 \(2\) 再回去,求最少经过多少个不同的点。

其中 \(n \le 100\)

注意到走回去就是在反图上从 \(1\) 走到 \(2\)。于是设 \(f(i,j)\) 表示从 \(1\) 走到 \(i\),在反图上从 \(1\) 走到 \(j\) 的不同点的个数。考虑转移。正图上走一步,或者反图走一步,这里类似最短路。

考虑重复问题,当 \(i\) 走到 \(j\) 的时候会多 \(1\),于是有 \(f(j,i) \leftarrow f(i,j)+d(i,j)-1\)

「2022-07-26 省队集训 - Day 2」

New Year and Original Order

考虑去计算每个数字的贡献。对于一个数字 \(x\),设 \(f(i,0/1)\) 表示在第 \(i\) 位,是否到达上界,的总贡献。

然后转移的时候就相当于在新的一位放上一个数字 \(y\),考虑枚举 \(y\),注意到转移还要考虑当前这个数放这个位置的贡献,再设一个 \(g(i,0/1)\) 表示当前状态放下当前数的贡献。于是有

\[f(i) \leftarrow \begin{cases} f(i-1) & y < x \\ g(i-1)+10 \cdot f(i-1) & y=x \\ 10 \cdot f(i-1) & y>x \end{cases} \]

\[g(i) \leftarrow \begin{cases} g(i-1) & y \le x \\ 10 \cdot g(i-1) & y>x \end{cases} \]

复杂度 \(\mathcal{O}(10^2n)\)

序列妙妙值

首先先前缀和一下,这样区间异或和就可以直接算了。注意到最开始已经有了 \(k\) 段,所以只要枚举最后一个合并到哪里即可。然后先列一个显然的 DP。 \(f(i) \leftarrow \min\{ f(j)+a_i\oplus a_{j} \}\)

考虑平衡复杂度。

如果 \(a_i\) 较小,那么记录一下前缀和为 \(a_i\) 的最优解,然后转移的时候枚举这个不同的前缀和。

如果 \(a_i\) 较大,把 \(a_i\) 拆开,拆成前 \(8\) 位和后 \(8\) 位。转移的时候设 \(b_{x,y}\) 表示 \(a_j\)\(8\) 位是 \(x\)\(a_i\)\(8\) 位是 \(y\),转移的最小值。转移都是时候枚举 \(x\) 即可。

Greedy Pie Eaters P

考虑区间 DP。于是设 \(f(i,j)\) 表示区间 \([i,j]\) 被吃完时的最大重量和。转移的时候考虑枚举一个 \(k\),即:

\[f(i,j) \leftarrow \max\{ f(i,k-1)+f(k+1,j)+g(k,i,j) \} \]

其中 \(g\) 表示 \(k\) 在区间 \([i,j]\) 最大贡献。预处理即可。

什么你问为什么 Day2 只有 \(3\) 题??我不造啊我不造啊我不造啊(逃)。

posted @ 2022-08-31 19:44  Rainy7  阅读(232)  评论(2编辑  收藏  举报