num 3

num3 C

\(3 \leq n \leq 10^5,1 \leq L \leq 10^{18}\)

有启发性质。

首先考虑限制,发现形如亦或。

所以一次操作 \(a_i = a_{i-1} \oplus a_{i+1}\)

考虑记 \(S_{i}\) 为操作 \(i\) 次后,关心的 \(\oplus\) 的数二进制集合。

\(S_{i} = (S_{i-1}<<1) \oplus (S_{i-1}>>1)\)

注意到 \(S_2 = (((S_1<<1) \oplus (S>>1))<<1) \oplus ((S_1<<1)\oplus((S_1>>1)>>1)) = ((S_1<<2) \oplus S)\oplus(S_1 \oplus (S_1>>2)) = (S_1<<2) \oplus (S_1>>2)\)

猜想操作应当具有结合律(不会证)。

通过数学归纳法可得 \(S_{2^k} = (S_1<<(2^k)) \oplus (S_1>>(2^k))\)

然后\(L\) 二进制分解,每次对每个位置暴力模拟即可。

时间复杂度 \(O(n \log L)\)

num3 I

数据随机,\(1 \leq n \leq 10^7\)

结论题。

自然的想法是类似 这题 设计标记维护区间历史乘积。

但是常数过大。

经典结论:随机数据任意时刻单调栈中期望元素个数为 \(\ln n\)

所以可以维护两个单调栈直接做。

num3 J

原题

构造题引入。

首先明确这是构造题,其次应当关注到总操作次数比较小;

性质:每次对 \([1,i]\) 乱搞一次,在长度是偶数的情况下可以把 \(i\) 归为到 \(\dfrac{i}{2}\)

所以考虑从小到大归位。

可以做到 \(O(n \log n)\)

考虑进行逆操作,然后一个位置 \(i\) 可以归位到 \(2i\)。进行复杂度分析求和是线性的(分析是困难的,我还不会)。

trick:进行某些操作使原序列到达目标序列的构造,可以考虑一位一位的归位;构造题考虑:发掘性质(手完/观察数据范围),考虑子问题,构造单位操作

num3 H. 黑板

原题

构造/乱搞启发题。

特判 \(n=1\) 的情况。

注意到 \(1\) 必然是由亦或的形式得到的,这两个数的形式应当是 \(2k\)\(2k+1\)

又注意到加法操作通过龟速乘可以得到乘法操作,所以假设已有 \(x,y\) 两个数,如果其能满足 \(ax-by=1\) 的话,就做完了。

注意到上式合法的充要条件是 \(\gcd(x,y)=1\)

所以相当于要用 \(n\) 构造出一个与其互质的数。

注意到亦或操作可以理解成加法和减去进位。

所以直接将 \(n\) 左移到最低位与原本 \(n\) 最高位重合,就可以得到 \(kn-2^t\) 次方。

注意到 \(\gcd(2^t,n) = 1\),所以 \(\gcd(kn-2^t,n) = 1\)

最后用 exgcd 求一个合法解就做完了。

还有比较有无脑但套路的做法:

num3 E

给定 \(n\) 个格子,每个格子有颜色。

每个时刻可以进行两个操作:

改变任意格子颜色。

走到与当前格子相邻并且同色的格子上。

给定 \(m\) 个询问,每次询问从 \(u_i\) 走到 \(v_i\) 的最少时刻数。

\(1 \leq n,m \leq 10^6\)

有启发性质。

弱化问题,先考虑从 \(1\) 走到 \(n\) 的最小代价。

注意到直接做似乎不好做,这时可以考虑逆向思维,走路的时刻不能省,要最小化改变颜色的个数,可以认为在每个格子上都改变了颜色,然后 dp 最多可以有多少格子不需要改变颜色。

定义 \(f_i\) 为走到第 \(i\) 格,第 \(i\) 格不变色,最多有多少格子不需要改变颜色,则有转移 \(f_i = \max_{j \lt i}\{f_j+[c_j=c_i]\}\),其意义是如果 \(j,i\) 颜色相同,可以认为 \([j+1,i-1]\) 格子都变成 \(c_i\) 颜色,然后 \(c_i\) 的颜色就不用改变了。

根据转移方程发现每个位置的贪心策略是固定的,可以倍增,具体地,定义 \(f_{i,k}\) 表示从 \(i\) 往右跳,有 \(2^k\) 个格子的颜色不用改变,最少要跳到哪里,则有 \(f_{i,0} = \min(s_i,f_{i+1,0})\)\(s_i\)\(i\) 右边第一个同色的位置。

num3 K

原题

给定长度为 \(n\) 的字符串,从中选出一些连续子串,满足其为回文串,并且其与任意选出的其它子串不存在包含关系(两个字串相等也不合法)。

最大化选出子串个数。

\(1 \leq n \leq 300\)

套路题,但是我不会套路()

一个串本质不同的回文串只有 \(O(n)\)

考虑 \(O(n^2)\) 将所有不同回文串找出(当然会 PAM 的 dalao 也可以 \(O(n)\),但没必要),然后要选出最多串,满足两两不具有包含关系

两两不具有包含关系类似反链中的两两不具有可比性

先按包含关系建图(每个串向最大的被其包含的串连有向边,边数是 \(O(n)\) 的),题目即要求最长反链长度。

根据 Dilworth定理,最长反链等于最小链覆盖。

最小链覆盖可以用网络流求解。

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

num3 L

给定 \(n\) 个区间 \([l_i,r_i]\),进行 \(m\) 次操作,每次操作给定 \((L,R,x)\),表示对编号在 \([L,R]\) 内的区间操作,将其分裂成 \([l_i,x]\)\([x,r_i]\) 两个区间,然后保留其中长度较长的区间,长度相等选择 \([l_i,x]\)(如果 \(x\)\([l_i,r_i]\) 无交忽略操作)。

\(1 \leq n \leq 10^5,1 \leq l_i,r_i,x \leq m,1 \leq m \leq 10^6\)

有启发性质。

有我不会的套路。

考虑保留较长的一段的限制。

如果每次保留较短的一段,每次切割后长度都至少减少一半,总切割次数是 \(O(n \log m)\) 的。

顺着减小有效切割次数的思路考虑,发现如果切的位置太左边或者太右边的话,必然是两边被切掉

不妨取线段的三等分点,发现落在左边和右边的切割必然是把两边切掉,只用考虑落在中间的切割。而每次切割中间线段长度至少减少 \(\dfrac{1}{3}\),所以总切割次数是 \(O(n \log_{\frac{3}{2}}{m})\) 的。

弱化问题,考虑对一个线段操作。首先要找到线段中间出现最早的操作及其时刻 \(t\),然后要在左/右边寻找时间小于等于时刻 \(t\) 的最右边/最左边操作位置。

在线段树上以位置为轴,时刻为值,第一个操作变成区间最值,第二个操作是区间线段树二分。

考虑对编号在 \([l,r]\) 的线段操作的限制,区间操作的限制可以通过离线+扫描线表达出每个位置的操作序列

总时间复杂度 \(O(n \log n \log_{\frac{2}{3}} m)\)
num3 F

平面直角坐标系中有 \(n\) 个物品。

你走过的位置,同行和同列的物品都会被你拾取。

你只能上下左右走,可以任意选定起点和终点。

求拾取所有物品的最小步数。

\(1 \leq n \leq 5 \times 10^5,1 \leq x,y \leq 10^9\)

犹豫了一会儿还是放上来了,感觉有些典,但是反正我也不会()

听说正解是最小割(?

考虑将一行和一列的物品都拾取的限制,发现被唤醒行/列必然连续。

所以可以用 \([x_1,x_2]\) / \([y_1,y_2]\) 分别刻画被唤醒的行/列,走的最小步数就是 \((x2-x1)+(y2-y1)\)

先对坐标离散化,记录 \(mnp_i,mxp_i,mns_i,mxs_i\) 分别表示前缀/后缀的/最小/最大 \(y\) 值,枚举左端点,答案即为 \(\min_{r \gt l}\{x_r-x_l+\max(mxp_{l-1},mxs_{r+1})-\min(mnp_{l-1},mns_{r+1})\}\)

\(\min\) 写成 \(\max\) 好看一点,那就是 \(\min_{r \gt l}\{x_r-x_l+\max(mxp_{l-1},mxs_{r+1})+\max(-mnp_{l-1},-mns_{r+1})\}\)

注意到 \(mxs_{r+1}\)\(-mns_{r+1}\) 都是不升的,具有单调性。

所以直接把 \(\max\) 拆开,在线段树二分+线段树上维护四类最小值即可(当然没有修改,可以直接二分+st表,但我认为常数不一定比线段树小)。

posted @ 2025-11-25 11:08  rabbit_mygo  阅读(13)  评论(0)    收藏  举报