记录

P4340 [SHOI2016] 随机序列

\(s_i\) 为前 \(i\) 个的和。发现 \(+,-\) 抵消。有:\(s_i=3s_{i-1}+g_{i-1}(a_i-1)\)。其中 \(g_i\) 为连续 $\times $ 的值的和。且 \(g_i=g_{i-1}\times a_i\)

待修用矩阵维护转移,上线段树即可。时间复杂度 \(O(n\log n)\)

CF1149C Tree Generator™

发现这个括号序与欧拉序类似。

对于树上一条路径,可以看作是括号序的一个区间,去掉合法括号匹配。那么将 \()\) 看出 \(1\)\((\) 看出 \(-1\) 后,就相当于将区间变成两部分,前面一部分的和减去后面一部分的和的最大值了。因为 \(u \to lca\) 都是 \()\)\(lca \to v\) 都是 \((\),且 \((,)\) 抵消。

线段树维护即可。时间复杂度 \(O(n\log n)\)

P4425 [HNOI/AHOI2018] 转盘

我的 typora 没了。不想写了。为什么电脑死机啊。

大概就是说。我们可以倒着走,因为经过一个点多次,如果某次满足 \(\ge T_i\),那么最后一次一定也满足。简单化简相当于求 \(\min\limits_{i=n+1}^{2n}(\max\limits_{j=i-n+1}^{i}(T_j-j)+i)\)。同时增加 \(n-1\)。且有 \(T_i -i > T_{i+n}-(i+n)\)。那么就是后缀 \(\max\) 了。单侧递归线段树维护即可。时间复杂度 \(O(n\log^2 n)\)

AT_arc136_e [ARC136E] Non-coprime DAG

这么困难。

考虑 \(a,b\) 什么时候可以同时选。

  1. \(\gcd(a,b)=1\)

  2. \(x\)\(a\) 的最小质因子,\(y\)\(b\) 的最小质因子。那么 \(\lfloor\frac{b}{xy}\rfloor-\lfloor\frac{a}{xy}\rfloor =0\)

注意到偶数最多选一个,且 \(1\) 一定能选。那么尝试对 \(a,b\) 的奇偶性分类讨论:

  1. \(a\) 是偶数,\(b\) 是偶数。不行。
  2. \(a\) 是偶数,\(b\) 是奇数。当 \(b-y \ge a\) 时,因为 \((b-y)\bmod 2=0\),所以不行。否则由于 \(x=2\)\((2y)|(b-y)\),所以一定可以。
  3. \(a\) 是奇数,\(b\) 是偶数。同情况 \(2\)。在 \(a+x \le b\) 时不行,否则可以。
  4. \(a\) 是奇数,\(b\) 是奇数。如果 \(a+x \le b-y\),则不行。因为 \((a+x)\bmod 2=0,(b-y)\bmod 2=0\)。否则可以,因为 \((b-y,y]\) 中不存在 \(xy\) 的倍数,\([a,a+x)\) 中也不存在 \(xy\) 的倍数。

那么有决策:

  1. \(1\) 可以选。
  2. 选出来的奇数一定满足:\(\bigcap\limits_{i=1}^{m} [x_i-g(x_i)+1,x_i+g(x_i)-1] \ne \emptyset\)
  3. 如果选择偶数,则选出来的偶数 \(y\) 一定满足:$y \in \bigcap\limits_{i=1}^{m} [x_i-g(x_i)+1,x_i+g(x_i)-1] $。

枚举交集中的一个数 \(y\)。那么所有区间包含 \(y\) 的奇数都可以选,\(y\) 在其是偶数是也可以选,\(1\) 可以选。则需要维护区间加,全局 \(\max\)。差分做到 \(O(n)\)。如果带单点修改,线段树做到 \(O(n\log n)\)

CF1210F2 Marek and Matching (hard version)

困难。

根据 Hall 定理,若 \(S\) 存在完美匹配,则一定有与 \(S\) 中某个点相连的右部节点构成的集合 \(T\) 满足 \(|S| \le |T|\)

考虑定义状态函数 \(f_{s,t}\) 表示 \(s\) 为左部节点,\(t\) 为右部节点,且存在完美匹配的方案数。发现这个转移会算重。举个例子,合并两个集合 \(S1+S2=S,T1+T2=T\),在交换后仍然满足条件,所以算重了。

如何。考虑定唯一的代表元。这里找 \(|S|-|T|\) 最大的,有多个找 \(|S|\) 最小的做代表元。证明唯一性。

那么可以考虑记 \(F(s,t)\)\(t\)\(s\) 中某个点相连的右部节点构成的集合的方案数,\(G(s,t)\)\(t\)\(s\) 不存在任意一条边的方案数。那么有:

\(f_{s,t}=F(s,t)-\sum\limits_{s' \subset s}^{t' \subset t} f_{(s-s'),(t-t')}\times g_{s',t'} \times G(s',(t-t'))\)。这里 \(g_{s,t}\) 表示 \(s,t\) 不存在完美匹配的方案数。因为我们确定了唯一的代表元,所以在 \(s,t\) 不存在完美匹配时只会在将图分成存在和不存在完美匹配两部分时被计算一次,且 \(g_{s,t}\) 一定是代表元。

\(g_{s,t}=F(s,t)-\sum\limits_{s' \subset s}^{}\sum\limits_{t' \subset t}^{} f_{(s-s'),(t-t')}\times g_{s',t'} \times G(s',(t-t')) [|s'|-|t'|\ge |s|-|t|]\)。要求不算重。

时间复杂度 \(O(3^{2n})\)

CF1401E Divide Square

平面图。答案等于:内部交点(不算与大正方形交的点)+ 贯穿边数(端点都与大正方形交)+1。

后面两个好求。对于第一个情况,考虑扫描线。

\(x\) 轴。维护 \(y\) 轴哪些点被一条横线覆盖。那么枚举 \(x=x0\) 的竖线,求区间和就行了。是个单点覆盖,区间查询问题。线段树做到 \(O(n\log n)\)

CF283E Cow Tennis Tournament

给定竞赛图。其中 \(s_u > s_v\)\(u \to v\)\(k\) 次操作,每次将所有 \(s_u \in [l,r]\land s_v\in[l,r]\) 的边反转,求最后三元环的数量。

发现这个值域是假的。相当于是给定序列 \(1\dots n\),初始时 \(i \to j [i <j]\)。每次将 \([l,r]\) 内所有边翻转,求最后 \(i\) 的出度。

对于一个 \(i\),考虑 \(i \to j\) 时,操作区间应该满足什么条件。

  1. \(i<j\)\(l \le i , j \le r\) 的区间数量为偶数。
  2. \(i>j\)\(l \le j,i \le r\) 的区间数量为奇数。

分开求解。对于第一个,按 \(l\) 从小到大排序。然后是前缀异或,维护后缀 \(0\) 的数量。对于第二个,按 \(r\) 从大到小排序。然后是后缀异或,维护前缀 \(1\) 的数量。

线段树维护做到 \(O(n\log n)\)

CF407E k-d-sequence

求最长的区间 \([l,r]\)。使得可以给 \(\{A_l,\dots,A_r\}\) 插入不超过 \(k\) 个数,让它成为一个公差为 \(d\) 的序列。如果有多个,输出 \(l\) 最小的。

对于一个已经排序的序列 \(A\),有:\(A_i=x+(i-1)d\)。那么首先可以得到 \(A_i \equiv A_{i-1} \pmod d\)。则序列划分成了若干个段,使得任意一组答案不会与两个段相交。

这个时候首项 \(A_1 \bmod d\) 是多少不重要了。给所有 \(A_i\) 除以 \(d\)。问题变成:求最长的区间 \([l,r]\),使得 \(\max\limits_{i=l}^{r}A_i -\min\limits_{i=l}^{r}A_i+1 -(r-l+1) \le k\),且不存在 \(A_i=A_j\)。析合树可做,但是不会。

考虑扫描线,扫 \(r\)。那么需要对每个 \(l\) 维护:\(\max\limits_{i=l}^{r}A_i-\min\limits_{i=l}^{r}A_i+l\)。需要找到最小的 \(l\),满足前面的式子 \(\le k+r\)。两个单调栈可维护 \(\max,\min\)。同时维护 \(lmin\) 表示对于当前 \(r\),最小的 \(l\),使得 \([l,r]\) 中不存在 \(A_i=A_j\)。那么就是一个区间加,区间维护 \(\min\),区间求 \(x \le k\) 的最大下标的问题。线段树做到 \(O(n\log n)\)

GYM102979C Colorful square

正方形就很唐。

显然有单调性,小的可以大的一定行。那么二分,记现在的边长为 \(len\)

扫描线,扫 \(x\) 轴。对于每种颜色,维护其 \(y\) 坐标集合。那么 \(x \to x+1\) 时,每次最多删掉一列的点。对于这一列上的点 \((x',y,c)\)。维护第一个比 \(y\) 大的颜色相同的位置,第一个比 \(y\) 小的颜色相同的位置。那么所有 \(lst < y0 \le y \le y0+len < nxt\) 的矩形都会少一种颜色。加一列的点同理。时间复杂度 \(O(n\log^2 V)\)

HDU5770 Treasure

找到一条路径 \(P(u,v)\)。定义该路径的价值为从 \(u\) 走到 \(v\),每到一个点会得到该点上所有钥匙,然后看当前节点上的宝箱对应的钥匙是否得到了,如果是就得到该宝箱的价值后求和。求最大价值的路径。

考虑点分治。显然一个宝箱最多在 \(O(\log n)\) 次点分治中被使用。对于 \(x \to u\) 的路径(\(u\) 是分治重心),所有满足 \(dis_{x,U_i}+dis_{U_i,V_i}+dis_{V_i+u}=dis_{x,u}\)\(W_i\) 一定会产生贡献。则只需要考虑 \(U_i,V_i\) 属于不同链的情况。哦,这里题目的 \(U,V\) 和我是反的,我的 \(U\) 是题目里的 \(V\)

不想做。

Arithmetic

CF407E 改。

仍然划分成连续段。

扫描线,扫 \(r\)。线段树维护每个 \(l\)\(\max A_i -\min A_i -(r-l)\)。区间子区间问题,需要维护历史和。

\(r-1 \to r\) 时:整体 \(val_l \to val_l-1\)。对于 \(\max\)\(\min\) 变化的,也是区间加的形式。加完后维护当前和累加到历史和的 tag。

用矩阵描述:

\[\begin{equation} \left[ \begin{array}{ccc} sum & hsum & len \end{array} \right] \end{equation} \]

区间加 \(x\),有:

\[\left[ \begin{array}{ccc} sum' & hsum' & len \end{array} \right] \times \left[ \begin{array}{ccc} 1 & 0& 0 \\ 0 & 1&0\\ x & 0&1 \end{array} \right] = \left[ \begin{array}{ccc} sum & hsum &1 \end{array} \right] \]

更新历史和,有:

\[\left[ \begin{array}{ccc} sum' & hsum' &len \end{array} \right] \times \left[ \begin{array}{ccc} 1 & 1& 0 \\ 0 & 1&0\\ 0 & 0&1 \end{array} \right] = \left[ \begin{array}{ccc} sum & hsum &len \end{array} \right] \]

直接做的时间复杂度 \(O(a^3n\log n),a=3\)。给 \(1.5s\) 纯搞笑。

P3214 [HNOI2011] 卡农

记“小集合”为题目中的片段,“大集合”为题目中片段构成的集合。

如果在意大集合内小集合的顺序,那么答案显然会更方便,且一个大集合只会被算 \((|S|)!\) 次。有 \(|S|=m\)

思考可能的小集合构成排列(在意顺序)是怎么得到的。很明显,应该是不断加一个之前没出现过的小集合,且停止时所有数的出现次数为偶数。

因为直接计算答案看起来不太现实,考虑将问题划分成子问题求解。尝试维护 \(f_{i}\) 表示 \(m=i\) 的答案(在意顺序)。发现对于 \(m=i\),如果我们已知其中 \(i-1\) 个集合是什么,那么剩下那个集合也能够确定。但这样算会将剩下集合为空集,剩下集合已经被选两种情况都算到。

考虑去掉这两种情况。对于空集,相当于 \(i-1\) 个集合已经满足所有数出现奇数次,则方案数为 \(f_{i-1}\)。对于已经被选过的情况,一定是 \(i-1\) 个集合再选它们中的一个,此时被多选的集合去掉后所有数出现次数仍为偶数,那么方案数为 \(f_{i-2}\times (i-1)\times (2^n-1 -(i-2))\)

则:\(f_i=A_{2^n-1}^{i-1}-f_{i-1}-f_{i-2}\times (i-1)\times (2^n-1 -(i-2))\)。时间复杂度 \(O(n)\)

HDU6643 Ridiculous Netizens

直接上背包是不是就是对的。

不知道啊,暴力合并有用的直接在 vjudge 上面跑到最优解了。93ms,甚至比第二个快了一倍。

CF1659E AND-MEX Walk

显然 \(1,2,3\) 不可能同时出现,那么对答案分类讨论:

  1. 答案是 \(0\)。要求 \(w_1 \& w_2 \dots \& w_m >0\)。显然需要满足二进制下某一位在 \(w_1,w_2\dots w_m\) 中都出现过。拆位并查集,时间复杂度 \(O((n+q)\log V)\)
  2. 答案是 \(1\)。显然不用管 \(0\) 是否出现过,因为没出现过一定在情况 \(1\) 被算到,只需要在意是否存在一条不包含 \(1\) 的路径。要让答案是 \(1\),就要在第一个 $w_1 & w_2 \dots & w_k $ 第 \(1\) 位不是 \(1\) 的时候存在某一位是 \(1\)。因为是与,所以如果在之前所有除了第 \(1\) 位都变成了 \(0\),那么一定在 \(1 \to 0\) 后依然为 \(0\),反之一定不为 \(1\)。贪心地,只要能走到一个 \(z\),满足到 \(z\) 之前按位与都比 \(1\) 大,且到 \(z\) 后就变成 \(0\) 就行了。之后无论怎么走都是 \(0\)。那么就是是 \(u\) 能通过第 \(x\) 位为 \(1\) 的边(\(x>1\))走到某个存在出边的第 \(1\) 位为 \(0\) 的点的点。并查集维护即可。
  3. 答案是 \(2\)。同理。
  4. 答案是 \(3\)。显然不可能。

显然只需要判断 \(0,1\)。时间复杂度 \(O((n+q)\log V)\)

CF516D Drazil and Morning Exercise

可能今天有点烫吧。

首先 \(f_x\) 可以 \(O(n)\) 求,然后发现询问数量很少,猜测每次可以暴力做。

需要维护最大值和最小值,那么考虑枚举最小值 \(\min f_x =f_u\)。那么所有 \(f_u \le f_{v} \le f_{u}+d\) 的点都可以选。按照 \(f_x\) 排序后这显然是个区间。

如果将区间 \([f_u,f_u+d]\) 的点全标记为 \(1\),其它为 \(0\)。就是求一个 \(1\) 的极大联通块大小。

考虑维护变化量。当 \(f_u\) 减小时,\(f_{u}+d\) 不增,那么一个点也只会被标记成 \(1\) 一段时间,且一旦从 \(1\) 变成 \(0\) 就没用了。那么可以直接对当前时刻从 \(0\) 变成 \(1\) 的点暴力维护并查集,一个联通块内的点表示之前都变成 \(1\) 过,或者单独一个点。那么对于 \([f_u,f_u+d]\)\(1\) 的情况,将 \((f_u+d,10^{100})\) 中的点变成 \(0\) 就行了。具体地,直接将它所在联通块大小减 \(1\),因为后面不可能在与这个点产生关系了。

那么答案就是任意时刻,任意联通块大小的最大值。在每次某个联通块大小变化的时候维护即可。时间复杂度 \(O(nq)\)

posted @ 2025-11-03 18:49  harmis_yz  阅读(4)  评论(0)    收藏  举报