LOADING

加载过慢请开启缓存 浏览器默认开启

ds简单题选讲

题单见这里
非本校学生可以见这里

前言

折叠块点击可以展开,再点可以收缩。
有些代码比较宽,可以在代码框内按一下鼠标中键,然后将鼠标往右挪来看右边的内容,再按一下鼠标中键即可恢复原状。
如果折叠块打不开,刷新一下即可。
我知道 ds 难调,所以给了你们参考代码,但还是建议不要看参考代码。如果确实调不出来,可以用参考代码来对拍,但是绝对不要直接抄或者照着改。
有的题目可能比较难,我大部分题目都给了 hint,大家还是尽量努力思考一下,其实这些题基本都没什么思维难度的。

T1

P5673 「SWTR-2」Picking Gifts

题意简述

\(n\) 个物品,每种物品 \(i\) 的种类为 \(v_{i}\),价值为 \(w_{i}\)。定义一段区间的价值为:对于再该区间内的每种类型的物品,仅有 从右往左 的前 \(k-1\) 个会产生该物品的价值。\(q\) 次询问,每次给出一段区间 \([l,r]\),问其价值。给定 \(n,k,q\)

\(n\le 10^6,q\le 5\times10^5,1\le v_{i}\le n,1\le w_{i}\le 2000\)

思路

参考代码

T2

P10463 Interval GCD

写到一半才发现这道题先前讲过了,见每周好题分享 Week2 T1。

T3

Luogu:AT_abc371_f [ABC371F] Takahashi in Narrow Road
AtCoder:F - Takahashi in Narrow Road

题意简述

在数轴上有 \(N\) 个人,每个人的坐标为 \(X_i\)

你可以执行以下操作任意次:

选择一个人。如果目的地没有其他人,将这个人向左或向右移动 \(1\) 米。 有 \(Q\) 个任务,每个任务内容如下:

  • 将第 \(T_i\) 个人移动到位置 \(G_i\)

你需要按顺序完成所有任务,求最少进行多少次操作。

  • \(1\leq N\leq2\times10 ^ 5\)
  • \(0\leq X _ 1\lt X _ 2\lt\dotsb\lt X _ N\leq10 ^ 8\)
  • \(1\leq Q\leq2\times10 ^ 5\)
  • \(1\leq T _ i\leq N (1\leq i\leq Q)\)
  • \(0\leq G _ i\leq10 ^ 8 (1\leq i\leq Q)\)

碎碎念

这场 ABC 当时我打了,这道题当时就只会 \(O(n^2)\) 的,后面没有改题,然后省选 D2T1 几乎是原题,然后我在场上还是只会 \(O(n^2)\) 的……所以大家一定要及时改题啊。

思路

参考代码

注意,代码均为 2025 联合省选 D2T1 的代码,对于此题修改一点就好了,如果你听懂了,改起来是容易的。

\(O(n^2)\)

\(O(n\log^2n)\)

\(O(n\log n)\)

T4

Luogu:CF1969E Unique Array
CF:E. Unique Array

题意简述

给定一个为 \(n\) 的序列 \(a\),定义一个子段为独特子段,当且仅当其中存在某个数,恰好只出现一次。
一次操作为选择 \(a\) 中的某个数,将其修改为任意一个数,问至少多少次操作可以使 \(a\) 的所有子段均为独特子段

\(1\le n\le 3\times 10^5\)

思路

参考代码

T5

本来题单里面是没有这道题的,fl 说你们都不会线段树合并,于是先讲下板子。

P4556 [Vani有约会] 雨天的尾巴 /【模板】线段树合并

题意简述

给定一棵 \(n\) 个点的树,\(m\) 次操作,每次会选择一条路径,将这条路径上的所有点都发放一个权值 \(v\),问最后每个点上哪个权值的数量最多。

\(1\le n,m,v \le 10^5\)

思路

参考代码

T6

SP2916 GSS5 - Can you answer these queries V
GSS 系列之一,有 GSS1~GSS8,除了 GSS2,其他七道,你们以你们现在学了的东西,理论上都可以做。
这个系列已经统一降过一次难度了。也就是说现在这个系列中的蓝以前是紫,紫是黑,不禁令人感叹时代在进步。(跑题了)

题意简述

给定一个长为 \(n\) 的序列 \(a\)。每次询问,给定 \(l_1,r_1,l_2,r_2\),问左端点在 \([l_1,r_1]\),右端点在 \([l_2,r_2]\) 的子段的和的最大值。

\(\left|a_{i}\right|\le 10^4,1\le n\le 10^4,l_1\le l_2,r_1\le r_2\)

思路

参考代码

T7

P2042 [NOI2005] 维护数列

题意简述

请写一个程序,要求维护一个数列,支持以下 \(6\) 种操作:

编号 名称 格式 说明
1 插入 \(\operatorname{INSERT}\ posi \ tot \ c_1 \ c_2 \cdots c_{tot}\) 在当前数列的第 \(posi\) 个数字后插入 \(tot\) 个数字:\(c_1, c_2 \cdots c_{tot}\);若在数列首插入,则 \(posi\)\(0\)
2 删除 \(\operatorname{DELETE} \ posi \ tot\) 从当前数列的第 \(posi\) 个数字开始连续删除 \(tot\) 个数字
3 修改 \(\operatorname{MAKE-SAME} \ posi \ tot \ c\) 从当前数列的第 \(posi\) 个数字开始的连续 \(tot\) 个数字统一修改为 \(c\)
4 翻转 \(\operatorname{REVERSE} \ posi \ tot\) 取出从当前数列的第 \(posi\) 个数字开始的 \(tot\) 个数字,翻转后放入原来的位置
5 求和 \(\operatorname{GET-SUM} \ posi \ tot\) 计算从当前数列的第 \(posi\) 个数字开始的 \(tot\) 个数字的和并输出
6 求最大子列和 \(\operatorname{MAX-SUM}\) 求出当前数列中和最大的一段子列,并输出最大和

任何时刻数列中最多含有 \(5 \times 10^5\) 个数,任何时刻数列中任何一个数字均在 \([-10^3, 10^3]\) 内,\(1 \le M \le 2 \times 10^4\),插入的数字总数不超过 \(4 \times 10^6\)

思路

参考代码

T8

Luogu:CF551E GukiZ and GukiZiana
CF:E. GukiZ and GukiZiana

题意简述

给定一个长度为 \(n\) 的序列 \(a\)\(q\) 次操作,操作有两种类型:区间加;给定 \(y\),求最大的 \(j-i\) 使得 \(a_{i}=a_{j}=y\),无解输出 \(-1\)

\(1\le n\le 5\times 10^5,1\le q \le 5\times 10^4\)
时限为 \(10\)

思路

参考代码

T9

P3203 [HNOI2010] 弹飞绵羊

题意简述

给定长度为 \(n\) 的序列 \(a\),一次查询求从某个数字 \(i\) 开始,从 \(i\) 跳到 \(i+a_{i}\) 再往后跳,直到 \(i>n\) 所需的次数。有若干次修改操作。

\(1\le n \le 2\times 10^5,1\le q \le 10^5。\)
保证 \(a\) 中全为正整数。

思路

参考代码

T10

P5355 [Ynoi Easy Round 2017] 由乃的玉米田

题意简述

给定一个长度为 \(n\) 的序列 \(a\),有 \(m\) 次询问,为以下这 \(4\) 种:

  1. 询问一个区间是否可以选出两个数它们的差为 \(x\)
  2. 询问一个区间是否可以选出两个数它们的和为 \(x\)
  3. 询问一个区间是否可以选出两个数它们的乘积为 \(x\)
  4. 询问一个区间是否可以选出两个数它们的商为 \(x\)(没有余数)。

\(1\le n,m\,a_{i}\le 10^5\)

思路

参考代码

T11

Luogu:CF1967C Fenwick Tree
CF:C. Fenwick Tree

题意简述

对于数组 \(a\),有函数 \(f(a)\),设数组 \(s=f(a)\),则对于每一个 \(s_ k\)​,都有:

\[ s_k=\left(\sum\limits_{i=k-\operatorname{lowbit}(k)+1}^{k}a_i\right)\bmod 998\,244\,353 \]

对于一个正整数 \(k\),函数 \(f^k (a)\) 定义如下:

\[ f^k(a)= \begin{cases} f(a)&\textrm{if }k=1\\ f(f^{k-1}(a))&\textrm{otherwise.}\\ \end{cases} \]

给你正整数 \(n,k\) 和一个长度为 \(n\) 的数组 \(b\) 表示 \(f ^k (a)\),求一个符合题意的数组 \(a\),可以证明答案总是存在的。

\(1\le n\le 2\times 10^5,1\le k\le 10^9,0\le b_i< 998\,244\,353\)

思路

参考代码

T12

P4175 [CTSC2008] 网络管理

题意简述

给定一棵 \(n\) 个点的树,有点权。有两种操作,修改某个点的点权,查询一段路径上的点权第 \(k\) 大。

思路

参考代码

T13

Luogu:CF896C Willem, Chtholly and Seniorious
CF:C. Willem, Chtholly and Seniorious

题意简述

给定一个长度为 \(n\) 的序列,请你维护以下四种操作:

  • \([l,r]\) 区间所有数加上 \(x\)
  • \([l,r]\) 区间所有数改成 \(x\)
  • 输出 \([l,r]\) 区间的第 \(k\) 小。
  • 输出 \([l,r]\) 区间每个数字的 \(x\) 次方的和模 \(y\) 的值。

\(m\) 次操作。

\(1\le n,m\le10^5\),保证数据随机。

思路

参考代码

T14

P10626 [JOI Open 2024] 考试 2

题意简述

(这个真不好简述。)

JOI 君在 IOI 高中上学,期末考试即将来临。考试的内容是计算 IOI 函数。IOI 函数是将 \([1,10^9]\) 之间的整数映射到布尔值(即 \(\texttt{True}/\texttt{False}\))的函数。IOI 函数可以从以下六条 IOI 高中规定的规则中构造:

  1. \(a\)\([1,10^9]\) 之间的整数,则 \(\texttt{[a]}\) 是一个 IOI 函数。它将不小于 \(a\) 的整数映射成 \(\texttt{True}\),将小于 \(a\) 的整数映射成 \(\texttt{False}\)

  2. \(\texttt{f}\) 为 IOI 函数,则 \(\texttt{(f)}\) 是一个 IOI 函数,它的映射规则与 \(\texttt{f}\) 的映射规则相同。

  3. \(\texttt{f}\) 为 IOI 函数,则 \(\texttt{!f}\) 是一个 IOI 函数。设 \(x\) 为整数,若 \(\texttt{f}\)\(x\) 映射为 \(\texttt{True}\),则 \(\texttt{!f}\)\(x\) 映射为 \(\texttt{False}\);否则 \(\texttt{!f}\)\(x\) 映射为 \(\texttt{True}\)

  4. \(\texttt{f},\texttt{g}\) 为 IOI 函数,则 \(\texttt{f\&g}\) 也是一个 IOI 函数。设 \(x\) 为整数,则 \(\texttt{f\&g}\)\(x\) 映射为 \(\texttt{True}\),当且仅当 \(\texttt{f},\texttt{g}\) 都将 \(x\) 映射为 \(\texttt{True}\)

  5. \(\texttt{f},\texttt{g}\) 为 IOI 函数,则 \(\texttt{f\^ g}\) 也是一个 IOI 函数。设 \(x\) 为整数,则 \(\texttt{f\^ g}\)\(x\) 映射为 \(\texttt{True}\),当且仅当 \(\texttt{f},\texttt{g}\) 中恰好有一个将 \(x\) 映射为 \(\texttt{True}\)

  6. \(\texttt{f},\texttt{g}\) 为 IOI 函数,则 \(\texttt{f|g}\) 也是一个 IOI 函数。设 \(x\) 为整数,则 \(\texttt{f|g}\)\(x\) 映射为 \(\texttt{True}\),当且仅当 \(\texttt{f},\texttt{g}\) 中至少有一个将 \(x\) 映射为 \(\texttt{True}\)

越前面的规则优先级越高。

为备战期末考试,JOI 君准备好了一个长度为 \(N\) 的 IOI 函数 \(S\)。他打算用 \(Q\) 个整数 \(X_1,X_2,\cdots,X_Q\) 来练习他的计算技能。于是他找来了你——能够熟练处理 IOI 函数的人,来解决这个问题。

你需要写一个程序。给定 \(N,Q,S\) 以及 \(X_1,X_2,\cdots,X_Q\),对于 \(i=1,2=\cdots,Q\),回答 IOI 函数 \(S\) 会将 \(X_i\) 映射成 \(\texttt{True}\) 还是 \(\texttt{False}\)

  • \(1 \le N \le 1\,000\,000\)
  • \(1 \le Q \le 200\,000\)
  • \(S\) 为长度为 \(N\) 的 IOI 函数;
  • \(1 \le X_i \le 10^9\)\(1 \le i \le Q\));
  • \(N, Q, X_i\)\(1 \le i \le Q\))均为整数。

思路

参考代码

T15

P5693 EI 的第六分块

题意简述

给定一个长度为 \(n\) 的整数序列 \(a\)\(q\) 次操作,有以下两种:

  • 给区间 \([l,r]\) 中每个数加上 \(x\)
  • 查询区间 \([l,r]\) 的最大子段和(可以为空)

\(1\le n,q \le 4\times 10^5\)\(|a_i| \le 10^9\)\(1 \le x \le 10^6\)

思路

参考代码

总结

总共选了 \(15\) 道题,后 \(5\) 道我认为能听懂是最好的,能写出来就更好了,不做强行要求,因为确实是有难度的。
前面的题大家还是尽量写一写。
希望你能从这 \(15\) 道题中学到很多有用的内容。
比如知道一些新的套路啊,trick 啊之类的。
总之感谢大家的倾听。