8.24 我带着新生的诗,将旋律系上桑树的树枝

发布时间 2023-08-24 22:14:04作者: _maze

Goodbye Souvenir

我们定义数字 \(x\)\([l,r]\) 出现的最后一次位置减初始位置为该数字在 \([l,r]\) 内的权值。现在让你支持:

  1. 单点修改
  2. 询问 \([l,r]\) 中数字权值和。注意每个数字只贡献一次。

tag:CDQ 分治,贡献转化

注意到每个数字只贡献一次,可以想到将每个数字的权值进行分别处理。

我们设 \(las_i\) 为数字 \(a_i\) 上一次出现的位置,那么答案为 \(max\{i\} - min\{las_i\}\)

这不好统计。考虑拆开这个式子,令 \([l,r]_x\) 表示 \([l,r]\) 中数字为 \(x\) 的下标集合,那么可以得到答案为 \(\sum_{i\in[l,r]_x}i - las_i\)。要把最小的 \(las_i < l\) 的贡献 \(i-las_i\)去除。

发现整个区间需要去除的部分为 \(\sum_{i=l}^{i\le r} [las_i<l](i - las_i)\),实际上就是一个二维偏序的求和,排序之后求解即可。

如果这是个静态问题,我们已经做完了。于是考虑 CDQ 分治时间轴转静态。修改直接用 set 维护。

摩天大楼

给你一个序列 \(a\),重排这个序列,使得 \(|a_1-a_2|+...+|a_{n-1}-a_n| \le L\)。求方案数。
\(n\le 100,L\le 1000\)

tag:动态规划

发现无论是枚举大楼的顺序操作还是枚举加入大楼的位置都不好判断。

对于点对,有一个转化是将 \((i,a_i)\) 变成二维平面上的点。变完以后我们发现要求的就是相邻点之间的斜线长度。考虑从上向下扫,一个小技巧是[[8.16 模拟赛#^bce980]]分段记录每个点的贡献。那么我们发现每个连通块每次贡献 \(2\)。但是注意特殊情况,在最左端之左和最右端之右是不会有贡献的。所以我们设 \(f_{i,j,0/1,0/1}\) 表示有 \(i\) 个连通块,当前值为 \(j\),最左端和最右端有无点。转移分一下三种:

  1. 新建一个连通块
  2. 合并两个连通块
  3. 往连通块旁边连
    转移的关键在于,往旁边连时只有左右两种选择。

Maximums and Minimums

一个序列,求有多少个子区间,满足最大值是最小值的倍数?
\(n\le 5e5, a_i\le 1e6\)

tag:二分,组合

一开始想复杂了,后来发现最大因数个数乘区间长度的复杂度也能过?那就抽象了。

对于序列中的每个数 \(a_i\),考虑它作为最大值时的答案。它作为最大值时自身会有一个区间约束。现在考虑最小值。枚举这个数的因数,对于序列中出现过的因数,找出最接近 \(i\) 的左边和右边的数。这个由于数的范围只有 \(1e6\),枚举时顺便记录就好。如果这个因数成为最小值,还有一个区间约束,也可以通过单调栈预处理出来。把两个约束范围取交,用乘法原理即可。

Good Graph

一个初始无边,\(n\)\(n\le 3e5\))个点的图,现在有 \(q\)\(q\le 5e5\))个操作,操作如下:
给出 \(u,v,w\),将 \(u\)\(v\) 连边权为 \(w\) 的边(\(w \in [0,1]\))。
定义好图为图上所有简单环的异或和都为 \(1\) 的图,现在你需要对每个操作判断,如果执行它后图仍然是好图则执行,否则不执行。你需要输出每个操作会不会被执行。

tag:树链剖分,并查集

画画图,发现好图只可能是一棵点仙人掌。原因如下:

不为仙人掌的情况即为两个环共享一段路径。设这段路径异或和为 \(a\),一个环去除这段路径后路径异或和为 \(b\),另一个环去除这段路径后路径异或和为 \(c\)。这三段路径是可以两两连起来成环的。所以 \(a\oplus b=1,a\oplus c=1,b\oplus c=1\),这是无解的。因此我们反证了结论。

现在主体问题变成了:如何判断加入一条边后图是不是一棵点仙人掌。如果我们把仙人掌的每个环断开,就变成了一个树的结构。根据仙人掌的定义,将树上属于一个环的边染色后,没有一条边会被染色两次。点染色后,同一种颜色中不会有两个点同时染上另外一种颜色。如果这是静态的,我们就可以用树链剖分求解了。

考虑这样一件事情:我们从头开始挑边,只挑能组成一棵树上的边,像 Kruskal 那样组成一棵生成树,这些边必定是能执行的边。因为考虑这样一件事情:每个边会新加入一个点,一个点的第一条边必定是不会和已有边组成简单环的。那么树的结构就建好了。

之后我们判断每个组成环的点,如果只有一个被染色的点就可以连,然后将树上属于环的点变为 \(1\),可以用树链剖分解决。