Live2D

2022/10/19 考试

tmd,又开始写这种东西了。可是感觉不写之后又找不到。可一写的话绝对就是我考爆了,真丢人/kk

比赛链接

T2 金银变换

Description

给出两个长度为 \(n\) 的序列 A,B 以及整数 \(k\),每次可以交换 A 中相邻的两个长度为 \(k\) 的子串,问是否可以使 A,B 相等。多组询问。

\(n\le 10^5,\sum n\le 10^6\)

Solution

tmd的结论题,每次一考就猜不到,而且还跟nm逆序对有关,更做不出来了。/fn

先考虑互不相同的情况。可以看出一个位置 \(\mod k\) 的值是不会变的,那么我们可以先判断同余系是否元素相同,所以我们假设是需要把 \(A_{i+tk}\) 移到 \(A_i\)\(t>0\)),那么在不改变 \(A_{1,2,...,i-1}\) 的情况,如果 \(n-k+1\ge j\)\(j\) 是我们当前需要往前移的位置),我们可以操作 \(j-k\) 这个位置,否则我们可以操作 \(n-2k+1\) 这个位置。可以发现,如果有解的话这样一定是可以构造出来的。

那么我们就可以看出一个必要条件,就是我们先按 \(\mod k\) 的同余系分类,如果 \(A_i=B_j\),那么我们可以考虑把 \(A_i\) 赋值为 \(j\),那么我们最后是需要 \(A_i=i\)。可以发现的是,我们一次操作一定会使得逆序对 \(+/-1\),所以需要我们每个组的逆序对奇偶性相同。

然后你发现找不到别的性质了。所以我们就需要考虑这玩意是否充分。我们考虑用我们的贪心策略进行考虑,可以发现,我们总可以是 \(\forall i\in [1,n-2k+1]\cup \{n-k+1\}\)\(A_i=i\)。可以看出 \(n-k+1\) 所属同余类逆序对为 \(0\),所以其他组都需要是偶数,另一个可以发现的是,其他组的逆序对 \(\le 1\),所以如果满足该性质,则一定都是 \(0\),所以该条件充分。

然后我们还需要考虑一个同余类有重复元素的情况。其实可以发现,如果我们交换两个相同的值最后所在位置,那么我们可以交换它逆序对的奇偶性,所以这种情况可以不作考虑。

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

T3 枝江旧事

Description

给出 \(n\) 个操作,有一个 \(w,p\)\(w\) 初始值为 \(1\)\(p\) 为一个质数,每个形如:

  1. \(w\) 赋值为 \(x\)

  2. \(w\to w\times x\pmod p\)

可以任意排列这 \(n\) 个操作,询问最后有多少个值在 \([0,p-1]\) 中且不能被表示。

\(n,p\le 10^6\)

Solution

我们其实首先可以看出我们取原根,因为 \(p\) 是质数,所以可以保证一定存在。然后我们就把乘法变成了加法,问最后有哪些可以表示。

这样的话我们可以做 01背包,用 bitset 优化可以做到 \(\Theta(1/\omega np)\)。但是显然无法通过。

我们考虑这样一种做法,考虑当前是背包中加入 \(v\),我们在当前区间 \([l,r]\),如果它与 \([l+v\mod (p-1),r+v\mod (p-1)]\) 存在不同,那么我们就递归下去,否则就返回。到叶子节点修改即可。这个可以用hash判断。

考虑到如果不存在 \(i=0,(i+v\mod (p-1))=1\) 的情况,那么我们可以轻易分析出这是 \(\Theta(n\log^2 n)\)(hash值需要用树状数组 \(\log n\) 处理)的。但是对于上面一种情况,我们可以发现,如果我们在 \(i\)\((i+v\mod (p-1))\) 中连边,那么会形成若干个环。如果一次操作环上面都是 \(1\),显然不会处理到,否则就会存在 \(0,1\) 这种情况,不过你发现这个一定可以对应一个 \(1,0\)(即对于它的 \(1\) 找到后面的一个 \(0\)以及这个 \(0\) 的前缀),所以删除一个 \(1,0\) 顶多用 \(\Theta(2)\) ,所以总复杂度仍是 \(\Theta(n\log^2n)\) 的。

T4 膜皮圣经

Description

一个长度为 \(n\) 的序列 \(c_{1,2,...,n}\) 以及 长度为 \(n-1\)\(d_{1,2,..,n-1}\),有 \(q\) 次查询,每次给出 \([L,R]\),求出 \(\max w(l,r),L\le l\le r\le R\),我们定义 \(w(l,r)\) 为:

\[c_k\times (\sum_{i=l}^{r-1} d_i+\min(\sum_{i=l}^{k-1} d_i,\sum_{i=k}^{r-1} d_i) \]

其中 \(k\)\(c_{l,l+1,...,r}\) 的最小值位置。

\(n\le 5\times 10^5,q\le 10^5,d_i\le 10^5\)\(c_i\) 满足互不相同。

Solution

因为是纯口胡,所以并不能保证正确。

我们考虑见建出小根笛卡尔树,那么我们可以找到 \([l,r]\) 包含的最大的一个节点,如果取这个最小值,那么 \(l,r\) 分别取它能覆盖的位置即是最优(下面称这个节点为“该节点”)。

然后考虑到左右两边仍有残余,因为是对称的问题,所以我们可以仅考虑左边,右边同理。考虑左边一个节点,假设最小值位置在 \(k\),覆盖范围为 \([l,r]\),查询 \([L,R]\),当且仅当 \(k\ge L\) 的时候存在贡献。此时右端点取 \(r\) 一定最优。考虑如何取到最优的 \(l\)。观察我们答案的形式,我们不妨设 \(S_i\) 为前缀和,那么即为:

\[c_k\times (S_{r-1}-S_{l-1}+\min(S_{k-1}-S_{l-1},S_{r-1}-S_{k-1})) \]

可以发现的是存在一个临界点 \(d\) 使得 \(l\ge d\) 时后面贡献是 \(S_{k-1}-S_{l-1}\),否则是 \(S_{r-1}-S_{k-1}\),那么其实你发现就是两端分段一次函数,自变量就是 \(S_{l-1}\)。可以发现的是 \(l\) 是越小越好的,所以如果 \(L\ge d\),直接取 \(L\),否则还要跟 \(d\) 判断一下。

那么我们可以考虑把笛卡尔树上的节点从深往浅进行处理。每次一个节点即加入两条直线,注意这里的直线是存在自变量取值范围的。然后我们想查的其实就是被包含的节点的左节点子树内所有节点李超树上的 \(S_{L-1}\) 位最大值,(临界点 \(> L\) 的可以用线段树单独维护),其实注意到如果我们把查询放在深度上面,在该节点深度 \(+1\) 的位置放这个询问那么直接查就是子树内所有节点了。

复杂度是 \(\Theta(n\log^2 n)\) 的,瓶颈在于李超树一个区间加入直线。

posted @ 2022-10-19 22:53  Dark_Romance  阅读(35)  评论(0编辑  收藏  举报