我的一些简单题

我终将成为你的倒影

思维:3。

代码:2。

题面

题目背景

『 现实并不像回忆那般,充满变化的余地。』

题目描述

岛村是不喜欢上课的。但是今天的数学课上,一个函数 \(f(x)=\lfloor \frac{x+a}{b}\rfloor\) 吸引住了她。

她现在有一个长度为 \(n\) 的序列 \(A\)\(m\) 个询问。她想知道对于每组 \(l,r,a,b\),记 \(B_i=f(A_i)\)\(\displaystyle\sum^r_{i=l+1}[B_i=B_{i-1}]\) 的值为多少(其中若 \([]\) 里面的表达式为真,值为 \(1\),否则为 \(0\))。

但是她着急于去找安达打乒乓球,所以把问题交给你了。

本题强制在线,每次的 \(l,r,a,b\) 均要异或上一次的答案,若这是第一次询问,则不做操作。

输入格式

第一行两个整数 \(n,m\)

第二行 \(n\) 个整数 \(A_i\)

接下来 \(m\) 行,每行四个整数 \(l,r,a,b\)

输出格式

对于每次询问,输出一个整数表示答案。

输入输出样例 #1

输入 #1

10 10
1 3 4 3 4 7 2 9 7 10 
1 10 3 7
3 13 3 2
4 6 2 7
0 6 7 2
2 7 10 1
1 4 0 10
4 5 2 8
2 9 2 0
1 5 0 7
0 2 6 3

输出 #1

4
1
1
3
2
2
1
0
4
1

说明/提示

对于所有测试数据,保证:\(1 \le n,m,A_i \le 10^5\)\(1\le b\le 500\)\(0 \le a\le2\times10^9\)\(l<r\)

Subtask 限制 分值
\(0\) \(n,m\le100\) \(10\)
\(1\) \(n\le100\) \(20\)
\(2\) \(b\le10\) \(20\)
\(3\) - \(50\)

题解

百合题。

没啥意思,分块模板说是。

注意到 \(b \le 500\),考虑暴力。我们去枚举所有的 \(b\),由于 \(f(x)=\lfloor \frac{x+a}{b}\rfloor=\lfloor \frac{a}{b}\rfloor+\lfloor \frac{x+a-\lfloor \frac{a}{b}\rfloor \times b}{b}\rfloor=\lfloor \frac{a}{b}\rfloor+\lfloor \frac{x + a\bmod b}{b}\rfloor\),其中 \(\lfloor \frac{a}{b}\rfloor\) 对任意的 \(x\) 都是一样的。所以这玩意没用。那么对于一个 \(b\),可能得到不同答案的 \(a\) 就只有 \(O(b)\) 个了。

考虑 \(A_i\)\(A_{i-1}\)\(b\) 一定的时候,\(a\) 的取值范围,使得 \(f(A_i)=f(A_{i-1})\)。注意到 \(\lfloor \frac{x+a}{b}\rfloor - \lfloor \frac{x}{b}\rfloor \le 1\),所以 \(|f(A_i)-f(A_{i-1})|\)\(a=y\) 时的值相比 \(a=0\) 时的值变化量不超过 \(1\)。也就是说,当 \(a=0\)\(|f(A_i)-f(A_{i-1})| \ge 2\)\((i,i-1)\) 是不可能产生贡献的。

\(A_i \ge A_{i-1}\)。对 \(a=0\)\(f(A_i)\)\(f(A_{i-1})\) 的大小分类讨论:

  1. \(f(A_{i})=f(A_{i-1})\)。记 \(r_i=A_i \bmod b\)。当 \(a+r_i \ge b\)\(f(A_i)\) 的值会增加 \(1\)\(f(A_{i-1})\) 同理。那么 \(i\)\(i-1\) 要么都不增加,要么都增加。则 \(a\) 的取值范围为 \([0,b-\max(r_i,r_{i-1})) \cup [b-\min(r_i,r_{i-1}),b)\)
  2. \(f(A_i) =f(A_{i-1})+1\)。那么当 \(f(A_{i-1})\) 增加且 \(f(A_i)\) 不增加时会产生贡献。则 \(a\) 的取值范围为 \([b-r_{i-1},b-r_{i})\)

那么这样就能维护出 \(l=1 \land r=n\) 时的所有答案了。现在考虑区间询问。很容易想到,记 \(f_{a,b,i}\) 表示在 \(a,b\) 已知时,\(f(A_i)\) 是否等于 \(f(A_{i-1})\)。但是这样空间是 \(O(b^2 n)\) 的。注意到我们的预处理是 \(O(nb)\) 的复杂度,这样维护前缀和查询的复杂度是 \(O(m)\) 的。考虑平衡,我们拿时间换空间,最简单的情况不难想到可以分块。我们将每 \(B\) 个数在 \(a,b\) 已知时的答案维护在一起,那么查询的时候就只需要暴力维护散块的答案了。这样的时间复杂度是 \(O(nb+m(\frac{n}{B}+B))\) 的,空间复杂度是 \(O(b^2\frac{n}{B})\) 的。当 \(b=\sqrt{n}\) 时可以做到时间复杂度 \(O(nb+m\sqrt{n})\),空间复杂度 \(O(b^2 \sqrt{n})\)

抱月

思维:3。

代码:4。

题面

题目描述

\(P(u,v)\) 表示树上从节点 \(u\) 到节点 \(v\) 依次经过的点组成的序列,包括 \(u\)\(v\)

\(dep_u\) 表示在以 \(1\) 为树根时,节点 \(u\) 的深度(根节点深度为 \(0\))。

\(\operatorname{LCA}(u,v)\) 为树上节点 \(u\)\(v\) 在以 \(1\) 为树根时的最近公共祖先。

抱月有一棵树,树根为 \(1\),一共有 \(n\) 个节点。其中第 \(i\) 个节点的颜色是 \(c_i\)。她发现,对于一个节点 \(x\) 和整数 \(k\),如果将 \(P(x,1)\) 中所有满足:\(dep_y\equiv dep_x \pmod{k}\)\(y\) 都拿出来,这些 \(y\) 是有意义的。

所以,你需要解决这样一个问题。给定 \(m\) 次询问,每次两个整数 \(x,k\),求删掉 \(P(x,1)\) 中所有满足 \(dep_y\equiv dep_x \pmod{k}\)\(y\) 后,满足 \(dep_z \le dep_x\)\(z\) 中不同 \(c_z\) 的数量。每次询问独立,也就是说这次删的点在下一次询问会恢复。

如果不理解,请看样例解释。

输入格式

第一行两个整数 \(n,m\)

第二行 \(n\) 个整数 \(c_i\)

接下来 \(n-1\) 行,每行两个整数 \(u~v\),表示 \(u~v\) 之间有连边。

接下来 \(m\) 行,每行两个整数 \(x_i~k_i\),表示询问。

输出格式

\(m\) 行,每行一个整数,表示答案。

输入输出样例 #1

输入 #1

11 9
3 1 4 8 8 2 6 4 7 5 1
1 2
1 3
1 4
4 9
9 10
9 11
3 5
3 6
5 8
5 7
3 1
4 1
5 2
11 4
10 3
8 2
6 1
7 1
7 2

输出 #1

2
2
5
8
6
7
3
6
7

说明/提示

对于所有测试数据,保证 \(1 \le n,m,k_i \le 10^5\)\(1 \le u,v,x_i \le n\)\(0 \le c_i \le 10^5\)

Subtask 限制 分值
\(0\) \(n,m \le 10^3\) \(10\)
\(1\) \(c_i\) 相同 \(4\)
\(2\) \(k_i > \max\limits_{j=1}^{n} dep_j\) \(16\)
\(3\) \(n,m \le 5\times 10^4\) \(30\)
\(4\) \(40\)

样例解释

对于第 \(1\) 个询问,满足条件的 \(y\) 为:\(1,3\)。删掉之后,满足条件的 \(z\) 为:\(2,4\)。其中 \(c_1=2,c_4=8\),所以答案为 \(2\)

对于第 \(3\) 个询问,满足条件的 \(y\) 为:\(1,5\)。删掉之后,满足条件的 \(z\) 为:\(2,3,4,6,9\)。其中 \(c_2=1,c_3=4,c_4=8,c_6=2,c_9=7\),所以答案为 \(5\)

题解

百合题。

根号分治模板说是。

题面是让求所有深度不大于 \(x\) 且不为 \(x\)\(k\) 倍祖先的点的颜色构成集合的大小。

很显然的,如果一个颜色 \(col\) 在最后的集合中没有出现过,那么 \(c_i=col\)\(i\) 要么是 \(x\)\(k\) 倍祖先,要么深度大于 \(x\) 的深度。因为没被删的点看起来很不好维护,所以考虑维护有多少种颜色完全被删了。

考虑将深度大于 \(x\) 的深度的点和 \(x\)\(k\) 倍祖先分开维护。对于深度大于 \(x\) 的深度的点,我们可以再反一次,转化为深度不大于 \(x\) 的深度的点的颜色构成集合的大小。求这个有若干种方式,能过在 \(O(n)\) 的复杂度维护出所有 \(dep_x=y\) 时的答案。那么现在问题转化为:求有多少种颜色 \(col\),满足 \(c_i =col \land dep_i \le dep_x\) 的点均为 \(x\)\(k\) 倍祖先。这个很典吧,考虑根号分治。

由于 \(x\)\(k\) 倍祖先数量为 \(\lfloor\frac{dep_x}{k}\rfloor\),如果我们每次暴力跳 \(k\) 级祖先,那么复杂度是 \(O(\frac{dep_x}{k})\) 的。维护一个颜色是否出现完可以按照 BFS 序记录每个点。那么记 \(lst_i\) 为颜色 \(i\) 上一次出现的位置,则 \(dep \in [dep_u,dep_{lst_i}]\) 颜色 \(i\) 不能出现 \(>2\) 次,即将每种颜色按照 BFS 序排序后它们相邻。所以单次时间复杂度是 \(O(\frac{dep_x}{k} \log n)\sim O(\frac{dep_x}{k})\)

如果这个 \(k\) 极小,上面的做法显然很裂。考虑枚举 \(k\),将所有 \(k\) 相同的询问统一处理。假设现在 \(k\) 一定。对于一个颜色 \(col\),我们将 \(c_i=col\) 的点剖出来,建成一棵虚树,观察虚树的形态。我们将虚树按照深度分层,那么对于前 \(i\) 层,如果我们有一个询问 \(Dep_{i+1} >dep_x\ge Dep_i\),则当 \(col\) 会对 \(x\) 产生贡献的必要条件一定是前 \(i\) 层的虚树形态是一条链。这个显然吧,如果不是链,那么一定有一个点 \(u\),有 \(deg_u \ge 3\)\(dep_u \le dep_x\)。那么一定存在一个点颜色为 \(col\) 且不为 \(x\)\(k\) 倍祖先。

我们接着去枚举层数 \(i\)。当前 \(i\) 层构成虚树的形态为一条链时,考虑会对哪些 \(x\) 产生贡献。如果 \(col\)\(x\) 产生了贡献,那么另一个充分必要条件是这条链上所有点均为 \(x\)\(k\) 倍祖先。根据虚树的性质,既然是一条链,那么这虚树上所有点的颜色都为 \(col\),所以是必须的。我们有:\(Dep_i \le dep_x < Dep_{i+1}\)。哦我是不是忘说了,\(Dep_i\) 表示第 \(i\) 层节点在原树上的深度。

我们可以找到第 \(i\) 层的虚树上节点在原树上的位置。那么现在就相当于对于一个子树的一个深度区间加问题了。哦这里还有个条件,就是 \(dep_x\) 应该与 \(Dep_1\) 对于 \(k\) 同余,且 \(Dep_j (j \le i)\) 也应该与 \(Dep_1\) 对于 \(k\) 同余。维护这个可以将所有颜色合在一起处理,在节点上打 \(tag\) 即可。对于一个 \(k\) 的时间复杂度 \(O(n)\)

那么现在我们有两种做法,一种做法的时间复杂度为 \(O(\sum \frac{dep_x}{k}+n\log n)\),一种为 \(O(nK)\)。最坏情况下,有时间复杂度为 \(O(\sum\frac{n}{k}+nK+n\log n)\)。看情况平衡即可,时间复杂度 \(O(n\log n+n\sqrt{n})\)

思维:1。

代码:1。

题面

题目背景

只属于我们两人的樱花不畏寒冬,大肆绽放。

题目描述

樱有一个长度为 \(n\) 的序列 \(A\)。她现在有 \(m\) 个问题,第 \(i\) 个问题是:\(\operatorname{mex}(A_{l_i},A_{l_{i+1}},\dots,A_{r_i})\) 的值为多少。

抱月想要给樱改改题。具体地,她将构造一个长度为 \(k\) 的序列 \(B\)。那么樱的第 \(i\) 个问题将变成:求 \(\operatorname{mex}(A_{l_i},A_{l_{i+1}},\dots,A_{r_i},B_1,B_2,\dots,B_k)\)

如果对于所有 \(m\) 个问题,在樱通过一切方式求出来后都是相同的,那么樱会有成就感。

抱月想知道,当 \(k=0,1,\dots,n\) 时,是否能构造出来一个长度为 \(k\) 的序列 \(B\),使得樱开心。如果可以,那么这 \(m\) 个问题的答案的最大值是多少。如果不可以,请输出 \(-1\)

【形式化题面】

给定一个长度为 \(n\) 的序列 \(A\)\(m\)\(l_i,r_i\)

要构造一个长度为 \(k\) 的序列 \(B\),记 \(f_i=\operatorname{mex}(A_{l_i},A_{l_i+1},\dots,A_{r_i},B_1,B_2,\dots,B_k)\)。那么有:\(f_i(1 \le i \le m)\) 相等。

对于 \(k=0,1,\dots ,n\),求在所有满足条件的 \(B\) 中,\(f_i\) 值最大是多少。若不存在任何一个 \(B\),则最大值为 \(-1\)

\(\operatorname{mex}(A_{1},A_{2},A_{3},\dots,A_m)\) 为可重集 \(\{A_1,A_2,A_3,\dots,A_m\}\) 中最小的不存在的自然数

输入格式

第一行两个整数 \(n,m\)

第二行 \(n\) 个整数 \(A_i\)

接下来 \(m\) 行,每行两个整数 \(l_i,r_i\)

输出格式

对于每个 \(k\),输出一个整数表示答案。

输入输出样例 #1

输入 #1

7 3
0 1 4 1 5 1 4
1 3
1 6
5 7

输出 #1

-1
2
3
3
6
7
8
9

说明/提示

对所有数据,满足 \(1 \le n,m \le 10^6,0 \le A_i <n, 1 \le l_i \le r_i \le n\)

::cute-table{tuack}

子任务编号 \(n,m\le\) 特殊性质 分值
#1 \(2000\) \(\text{15pts}\)
#2 \(10^6\) A \(\text{10pts}\)
#3 ^ B \(\text{15pts}\)
#4 ^ \(\text{60pts}\)

特殊性质 A:\(A_i=n-1\)

特殊性质 B:\(\sum(r_i-l_i+1)\le 100\)

题解

白合题。

注意到这个 \(\operatorname{mex}\) 是个假的,启示我们去枚举一个值 \(x\),维护 \(f_i = x\)\(k\) 的最小值。

\(g(x)\) 为上述最小值,那么一定有 \(g(x) \ge g(x-1)\)。如果一个区间 \([l_i,r_i]\) 不存在 \(x\),则说明任意相邻两个 \(x\) 的位置 \(p1,p2(p1 < p2)\) 要么满足 \(p2 < l_i\),要么满足 \(p1>r_i\),要么满足 \(p1 < l_i \le r_i < p_2\)

去枚举相邻两个 \(x\) 的位置 \(p1,p2\)。这个的总枚举次数 \(O(n)\)。则 \(l_i \in (p1,p2) \land r_i \in (p1,p2)\) 的区间一定满足 \(\operatorname{mex} \le x\)。维护 \(cnt_x\) 表示不包含 \(x\) 的区间数量,时间复杂度 \(O(n\log n)\)

现在考虑使用 \(cnt\) 计算 \(g\)。对于 \(g_x\),因为要使得所有区间都满足 \([0,x-1]\) 中的数在拼接上 \(B\) 后出现过至少一次,且 \(x\) 没有出过。所以若存在 \(i \in [0,x-1]\)\(cnt_i \ne 0\),则 \(B\) 中需要有一个 \(i\) 来使这 \(cnt_i\) 个区间包含 \(i\)。同时还需要满足 \(cnt_x=m\),因为如果存在至少一个区间包含了 \(x\),无论 \(B\) 长什么样都不可能让 \(f_i\) 全为 \(x\)。总结一下,\(g_i=\sum\limits_{j=0}^{i-1}[cnt_j \ne 0]\),且在 \(cnt_i\ne m\)\(g_i=10^{100}\)

那么最后取前缀 \(\max\) 就可以知道答案了。时间复杂度 \(O(n\log n)\)

朝向过去的远方

思维:2。

代码:1。

题面

题目背景

天空很蓝。

我抬头看向它。

云朵飘过。

题目描述

在通往世界的尽头,有一条路。路上有 \(n\) 个点,其中从前往后第 \(i\) 个点的记忆度为 \(A_i\)

抱月朝前走着。因为不想忘记太多,到点 \(i\) 时,她会询问对于从 \(i\)\(n\) 的每个点 \(x\),最小的 \(j\) 的值,满足 \(A_j,A_{j+1},\dots,A_x\) 按位与的结果和 \(A_{i},A_{i+1},\dots,A_{x}\) 按位与的结果相同。

也许是记忆力不太好,对于每个 \(i\),记 \(s(i)\)\(x=i,i+1,\dots,n\) 时对应的 \(j\)\(i\) 的距离(\(|i-j+1|\))的按位异或和。请你在她走到尽头时,告诉她 \(\sum\limits_{i=1}^{n}s(i) \bmod m\) 的值。

【形式化题面】:

给定一个长度为 \(n\) 的序列 \(A\)

\(g(l,r)=(A_l\&A_{l+1}\&\dots\& A_r)\)\(f(r,x)=\min\limits_{1 \le l \le r \land g(l,r)=x }^{}l\)

输出 \(\sum\limits_{i=1}^{n} (\bigoplus\limits_{r=i}^{n}(i-f(r,g(i,r))+1)) \bmod m\) 的值。

输入格式

第一行两个整数 \(n,m\)

第二行 \(n\) 个整数 \(A_i\)

输出格式

一行 \(1\) 个整数表示答案。

输入输出样例 #1

输入 #1

5 4
5 4 3 2 1

输出 #1

3

输入输出样例 #2

输入 #2

3 10
3 15 31

输出 #2

2

输入输出样例 #3

输入 #3

10 16
18 7 9 6 6 2 4 8 5 10

输出 #3

8

说明/提示

今天它飘得很快,目标指向远方。

追逐着云朵的目光望向前方,樱花花瓣飞进我的视线。

对所有数据,满足 \(1 \le n \le 10^6,1 \le A_i,m < 2^{30}\)

::cute-table{tuack}

子任务编号 \(n\le\) 特殊性质 分值
#1 \(10^6\) A \(\text{10pts}\)
#2 \(10^3\) \(\text{10pts}\)
#3 \(10^5\) B \(\text{30pts}\)
#4 \(10^6\) \(\text{50pts}\)

特殊性质 A:\(A_i\) 相同。

特殊性质 B:\(1 \le A_i,m < 2^{20}\)

题解

百合题。

首先对于 \(r=r0\) 时,不同的 \(g(l,r)\) 值只有 \(O(\log V)\) 个。证明略。记 \(B_{r0}=\{(l_1,r_1,x_1),(l_2,r_2,x_2),\dots,(l_k,r_k,x_k)\}\) 为相同 \(g\) 值时 \(l\) 的区间。如 \((l_1,r_1,x_1)\) 表示 \(l\in [l_1,r_1],r=r0\) 时,\(g(l,r)=x_1\)。这个可以在 \(O(n\log V)\) 时间找到。

那么对 \(x_i\) 相同的所有区间单独计算贡献。也就是说,每次我们可以找到 \(O(n)\)\((l,r,x)\),使得 \(x=x0\)。而这个总数是 \(O(n\log V)\) 的,因为 \(\sum |B_i|\)\(O(n\log V)\) 的。则现在问题变成,对于每个区间 \(i \in [l,r]\),将 \(res_i\) 异或上 \(i-l+1\)。暴力做显然是 \(O(n^2)\) 的。

对于每个 \(x=x0\) 的区间,观察一下会发现对于任意两个 \([l1,r1],[l2,r2]\),要么 \(l1=l2,r1 \le r2\),要么不相交。

证明:

如果 \(B_{i}\) 包含 \((l,r,x)\)\(B_{i+1}\) 包含 \((l',r',x)\)。那么有 \(x \subset a_{i+1}\),则 \(l=l’\)。因为 \(g(l,r)\ge g(l-1,r)\),如果 \(l > l'\)\(\gcd(A_{l'},\dots,A_{i+1})=x\le g(l',i)=x\),不符合条件。如果 \(l < l'\)\(g(l,i)=x\ge g(l,i+1)\),而 \(x\subset A_{i+1}\) 所以 \(g(l,i+1)=x\),不符合条件。\(r \le r'\) 显然。

如果 \(B_i\) 包含 \((l,r,x)\)\(B_{j}\) 包含 \((l',r',x)\)\(j > i+1\)。那么在 \(B_{i+1}\sim B_{j-1}\) 都不包含 \(([],[],x)\) 时,说明至少存在一个 \(k\),有 \(g(r,k) \ne x (i+1 \le k <j)\)。则 \(l' > k > r\)

对于所有左端点相同的区间,\((i-l+1)\)\(l\) 就是定值了,只需要统计异或的次数。而我们枚举区间的左端点 \(l0\),暴力往右拓展,直到拓展的右端点不存在于某个左端点为 \(l0\) 的区间位置(也就是乘的次数变成 \(0\))时间复杂度就是对的。

这个的证明可以这么考虑:

原本暴力枚举区间中的所有点时间复杂度为 \(O(\sum (r-l+1)) =O(n^2)\),上面的做法优化的点在于:将 \(g(i,r)=x0\) 原本需要 \(O(\sum [x=x0, l \le i \le r])\) 的代价修改变成了 \(O(1)\) 的代价修改。则对于 \(i\) 减少的修改次数等价于以 \(i\) 为区间左端点,右端点 \(r \in [L,R]\)\(g(i,r)=x\)\(R-L\) 的值。那么 \(i\) 的总修改代价就应该是以 \(i\) 为区间左端点,不同的 \(g(i,r)\) 的数量。这个的总和和开头一样是 \(O(n\log V)\) 的。

时间复杂度 \(O(n\log V)\)'

这次要永远 做朋友

思维:4。

代码:2。

题面

题目背景

实际上,我们的友情早已生锈、崩坏。

或许今天只是残骸上的碎片,恰巧散发出了微弱光芒而已。

即使如此......

题目描述

定义 \(f(l,r)\)\(\{a_l,a_{l+1},\dots,a_r\}\) 的绝对众数的值。若不存在,则 \(f(l,r)=10^{100}\)。也就是出现次数 \(c > \lfloor\frac{r-l+1}{2}\rfloor\) 的值。

定义 \(\operatorname{mex}(l,r)\)\(\{a_l,a_{l+1},\dots,a_r\}\)\(\operatorname{mex}\) 值。也就是最小的不存在的自然数。

给定长度为 \(n\) 的序列 \(a_{1\dots n}\),求 \(\sum\limits_{l=1}^{n}\sum\limits_{r=l}^{n}[\operatorname{mex}(l,r)\ge f(l,r)]\)

输入格式

第一行一个整数 \(n\)

第二行 \(n\) 个整数 \(a_i\)

输出格式

一行一个整数,表示答案。

输入输出样例 #1

输入 #1

4
0 0 1 2

输出 #1

4

输入输出样例 #2

输入 #2

7
3 1 0 1 2 2 0

输出 #2

3

输入输出样例 #3

输入 #3

10
1 1 0 0 2 2 3 3 0 0

输出 #3

10

说明/提示

我仍然真的认为——那笑容非常灿烂,甚至令我指尖发麻。

对所有数据,满足 \(1 \le n \le 3\times 10^6,0 \le a_i \le n\)

::cute-table{tuack}

子任务编号 \(n\le\) 特殊性质 分值 时间限制
#1 \(100\) \(\text{5pts}\) \(\text{1s}\)
#2 \(5000\) ^ \(\text{5pts}\) ^
#3 \(3 \times 10^4\) ^ \(\text{15pts}\) ^
#4 \(10^5\) ^ \(\text{15pts}\) ^
#5 ^ B \(\text{10pts}\) ^
#6 \(3\times 10^6\) A \(\text{2pts}\) ^
#7 ^ \(\text{24pts}\) ^
#8 ^ \(\text{24pts}\) \(\text{450ms}\)

特殊性质 A:\(a_i=0\)

特殊性质 B:\(0 \le a_i \le 10\)

题解

百合题。

有关绝对众数的启示我们枚举众数。记当前众数为 \(x\),则在将 \(a_i=x\) 看作 \(1\)\(a_i \ne x\) 看作 \(-1\) 后,\(f(l,r)=x\) 当且仅当 \(\sum\limits_{i=l}^{r} a_i >0\)。(这里的 \(a_i\) 是变成 \(1,-1\) 后的)

有关数区间数量的题启示我们对序列进行分治。但是如果对每个 \(x\) 进行整个序列的分治单次时间复杂度不低于 \(O(n\log n)\),则总时间复杂度至少是 \(O(n^2\log n)\) 的。

既然不能对整个序列分治,那就对 \(a_i=x\) 的位置分治。记当前分治区间 \([l,r]\) 表示从 \(1\) 开始第 \(l-1\) 个满足 \(a_i=x\) 的位置 \(+1\) 到第 \(r+1\) 个满足 \(a_i=x\) 的位置 \(-1\) 的区间。记为 \([L,R]\)

根据定义,\(c > \lfloor \frac{r-l+1}{2}\rfloor\),而当前分治区间一共只有 \(r-l+1\)\(x\)。所以该区间 \([L,R]\) 中一个 \(f(l_0,r_0)=x\) 的区间一定满足 \(r_0 -l_0+1 \le 2(r-l+1)\)

这说明将第 \(\frac{r-l+1}{2}\)\(x\) 的位置看作 \(mid\),满足 \(l_0 \le mid < r_0\)\(f(l_0,r_0)=x\) 一定有 \(mid-l_0+1 \le 2(r-l+1) \land r_0-mid \le 2(r-l+1)\)。换句话说,只需要从 \(mid\) 往左往右拓展 \(O(r-l+1)\) 个位置就行了,其它的位置一定不会产生跨 \(mid\) 的贡献。记最左边的位置为 \(l_{min}\),最右边的位置为 \(r_{max}\)

\([l_{min},mid]\) 的所有位置求后缀和(\(a_i\) 变成 \(1,-1\) 时的),对 \([mid+1,r_{max}]\) 的所有位置求前缀和。那么问题变成,求 \(s_{l_0}+s_{r_0}>0 \land \operatorname{mex}(l_0,r_0)\ge x\) 的数量。

枚举 \(r_0=r_{max} \to (mid+1)\),记 \(lst_i\) 为原序列上 \(i\) 前面第一个满足 \(a_j=i\)\(j\) 的值,不存在则为 \(0\)。根据 \(\operatorname{mex}(l,r-1) \le \operatorname{mex}(l,r)\)\(r_0+1 \to r_0\) 时,若 \(lst_{r_0+1} > mid \lor a_{r_0+1}\ge x\),显然没有任何作用。反之 \(l_0 \in (lst_{r0+1},mid]\) 都有 \(\operatorname{mex}(l_0,r_0) < x\)。那么这个就相当于每次撤销一段区间,维护剩下前缀中满足 \(s_{l_0}+s_{r_0} >0\) 的数量。

这个怎么 \(O(1)\) 维护呢?不难发现,\(|s_{r_0}-s_{r_0+1}| =1\)。那 \(s_{r_0}-s_{r_0+1}=1\) 举例。对于在 \(r_0\) 之前就被撤销的区间中,如果满足 \(s_{l_0}+s_{r_0+1}>0\),那一定满足 \(s_{l_0}+s_{r_0}>0\),唯一的区别在于 \(s_{l_0}+s_{r_0+1}=0\) 时仍然满足 \(s_{l_0}+s_{r_0}>0\)。这个开个同维护某个值的数量即可。而对于在 \(r_0\) 时被撤销的区间,枚举这个区间的所有数,再次维护桶即可。因为每个 \([l_{min},mid]\) 中的数最多被撤销一次,所以时间复杂度是 \(O(len)\) 的。

那么每一次分治区间 \([l,r]\) 的时间复杂度就是 \(O(len)\) 的。记 \(cnt_x\) 为原序列中 \(a_i=x\) 的数量,则对于一个 \(x\) 分治的时间复杂度就是 \(O(cnt_x \log cnt_x)\)。总时间复杂度 \(O(n\log n)\)

能不能更快呢?对于上述方法,我们拥有了一个 \(O(len)\) 求解序列中 \(f(l,r)=x\) 且满足条件的 \((l,r)\) 的数量的做法。再次观察绝对众数,上面说最多拓展 \(O(cnt_x)\) 个数,再多就不可能存在绝对众数。那么对单个 \(x\),发现只会对区间贡献 \(O(1)\) 个位置。考虑 \(-1,1,-1\) 的构造即可。那么可以找到更准确的有用的若干个区间,满足相邻两个区间中间不会有对 \(f(l,r)=x\) 的产生贡献的。这个区间的长度和是 \(O(cnt_x)\) 的。时间复杂度做到 \(O(n)\)

空空的

思维:2。

代码:1。

题面

小岛最近很无聊呢。

有一个序列 \(A\),小岛会对它进行至少 \(1\) 次下面的操作,直到对于任意的 \(A_i\) 都满足 \(A_i=0\)

  1. 记序列 \(B_i=\operatorname{MEX}([A_1,A_2,\dots,A_i])(1 \le i \le |A|)\)。其中 \(\operatorname{MEX}(A)\) 为序列 \(A\) 中最小的没出现过的自然数。
  2. \(B\) 整体替换 \(A\),即 \(A_i=B_i(1 \le i \le |A|)\)

\(f(A)\) 为小岛对序列 \(A\) 进行的操作次数。小岛想选一段区间出来数数,但是不知道选哪个好。于是对于一个序列 \(S\),小岛就想知道总的可能的操作次数之和,即 \(\sum\limits_{l=1}^{|S|}\sum\limits_{r=l}^{|S|}f([S_l,S_{l+1},\dots,S_r])\)

小岛睡着了,梦到好多。她想知道,对于所有长度为 \(n\) 且满足 \(0 \le S_i \le X_i(1 \le i\le n)\) 的整数序列 \(S\),它们的 \(\sum\limits_{l=1}^{n}\sum\limits_{r=l}^{n}f([S_l,S_{l+1},\dots,S_r])\) 值之和是多少。但是这个值可能会很大,所以需要对 \(917831\) 取模。

形式化题面:

\(f(A)\) 为最小的正整数 \(k\),使得 \(A\) 序列按照上述操作恰好 \(k\) 次后均为 \(0\)。那么有序列 \(S\) 的价值为:\(\sum\limits_{l=1}^{|S|}\sum\limits_{r=l}^{|S|}f([S_l,S_{l+1},\dots,S_r])\)

给定 \(n\) 和长度为 \(n\) 的序列 \(X\) ,求所有满足下列条件的序列 \(S\) 的价值之和对 \(917831\) 取模的结果:

  1. \(|S|=n\)
  2. \(0 \le S_i \le X_i (1 \le i \le n)\)
  3. \(S_i(1\le i \le n)\) 为整数。

数据范围:

10% \(1 \le n \le 5,1 \le X_i \le 2\)

10% \(X_i =1\)

20% \(1 \le n \le 3000,1 \le X_i \le 4\)

20% \(1 \le n\le 5000\)

20% \(1 \le n \le 2\times 10^5\)

100% \(1 \le n \le 10^7,1\le X_i \le 10^9\)

题解

某不知名模拟赛题,原本的题解和题面被我搞丢了。下面是原始题解,其中无利值为序列的价值。

首先看 \(f(A)\) 怎么求。简单模拟对发现 \(f(A)\in [1,3]\),情况如下:

  1. \(A_1 =0\)\(f(A)=2\)。因为 \(\operatorname{MEX}\) 不减,那么一次操作后 \(A_i \ge 1\),再次操作 \(A_i=0\)
  2. \(A_i \ge 1\) 且不存在 \(A_i=0\),那么一次操作后 \(A_i=0\)\(f(A)=1\)
  3. \(A_i \ge 1\) 且存在 \(A_i=0\)\(f(A)=3\)。一次操作后 \(A\) 变成情况 \(2\)

所以 \(S\) 的无利值相当于是若干个 \(1,2,3\) 相加。如何快速求 \(S\) 的无利值?很简单,我们枚举每一个位置,如果 \(S_i=0\),那么找到上一个 \(S_j=0\) 的位置,则 \(l =i,r \ge i\) 都会贡献 \(2\)\(l \in (j,i),r \ge i\) 都会贡献 \(3\)。如果 \(S_i=1\),找到上一个 \(S_j=0\) 的位置,则 \(r=i,l \in (j,i]\) 都会贡献 \(1\)。时间复杂度 \(O(n)\)

现在考虑求所有 \(S\) 的无利值之和。很容易想到 DP。注意到我们 \(S_i\) 的实际取值只有 \(2\) 种,因为可以将 \(S_i \ge 1\) 看作一个值。那么定义状态函数 \(f_{i,j}\) 表示前 \(i\) 个数,上一个 \(0\) 的位置为 \(j\) 的无利值之和。有转移方程:

\[f_{i,j}=x_i f_{i-1,j}+x_ig_{i-1,j}(i-j)\\ f_{i,i}=\sum\limits_{j=0}^{i-1}f_{i-1,j}+g_{i-1,j}2(n-i+1)+g_{i-1,j}3(n-i+1)(i-j-1)\\ g_{i,j}=x_ig_{i-1,j}\\ g_{i,i}=\sum\limits_{j=0}^{i-1}g_{i-1,j} \]

注意到 \(g_{i,j}\) 的意义为前 \(i\) 个数,上一个 \(S_k=0\) 的位置为 \(j\) 的方案数。那么 \(k\in [1,j-1]\) 都可以随便选,方案数为 \(\prod \limits_{k=1}^{j-1} (X_k+1)\)\(k\in[j+1,i]\) 不能选 \(0\),方案数为 \(\prod \limits_{k=j+1}^{i}X_k\)。所以 \(g_{i,j}=\prod \limits_{k=1}^{j-1} (X_k+1)\times \prod \limits_{k=j+1}^{i}X_k\)。记 \(s_i=\prod \limits_{j=1}^{i} (X_j+1),s'_i=\prod\limits_{j=1}^{i}X_j\)。那么 \(g_{i,j}=s_{j-1}\times \frac{s'_i}{s'_j}\)。再记 \(w_i=\frac{s_{i-1}}{s'_i}\),则 \(g_{i,j}=w_j s'_i\)

所以有转移方程:

\[f_{i,j}=x_i f_{i-1,j}+x_iw_js'_{i-1}(i-j)\\ f_{i,i}=\sum\limits_{j=0}^{i-1}f_{i-1,j}+2w_js'_{i-1}(n-i+1)+3w_js'_{i-1}(n-i+1)(i-j-1) \]

现在考虑怎么优化这个 DP。这是个简单的整体 DP 的形式,但是注意到 \(w_i\)\(w_{i-1}\) 并没有什么明显的关系,所以不能使用数据结构,无理。所以果断跳过数据结构优化,直接维护答案。

我们的答案为 \(\sum\limits_{i=0}^{n}f_{n,i}\),记为 \(sum\)。那么对于 \(i-1 \to i\) 的时侯,有:

  1. \[\sum\limits_{j=0}^{i-1} f_{i,j}=\sum\limits_{j=0}^{i-1}x_i f_{i-1,j}+x_iw_js'_{i-1}(i-j)\\ =x_i sum +x_is'_{i-1}i\sum\limits_{j=0}^{i-1}w_j-x_is'_{i-1}\sum\limits_{j=0}^{i-1}w_jj \]

  2. \[f_{i,i}=\sum\limits_{j=0}^{i-1}f_{i-1,j}+2w_js'_{i-1}(n-i+1)+3w_js'_{i-1}(n-i+1)(i-j-1)\\ =sum+2(n-i+1)s'_{i-1}\sum\limits_{j=0}^{i-1}w_j+3(n-i+1)(i-1)s'_{i-1}\sum\limits_{j=0}^{i-1}w_j-3(n-i+1)s'_{i-1}\sum\limits_{j=0}^{i-1}w_jj \]

然后这俩加起来就是 \(i-1 \to i\) 之后的 \(sum\) 值了,因为其它的 \(f\) 值是 \(0\)。使用前缀和优化即可。

看起来很没有问题,但是很容易发现,当我们 \(s'_i=0\) 的时候,\(g_{i,j}\) 就会出错。什么时候 \(s'_i\) 会等于 \(0\) 呢,没有时候,因为 \(1 \le x_i \le 10^9\),首先 \(s'_i\) 不取模是不对为 \(0\) 的,而 \(mod\) 也是一个比 \(10^9\) 大的质数,所以怎么成都不会为 \(0\)。其实 \(0 \le x \le 10^9\) 也是可以做的,只需要按 \(x_i=0\) 的位置将序列拆成若干段,然后再搞。时间复杂度 \(O(n)\),瓶颈在于求逆元。

晚自习

【HT-095-Rainbow】核桃彩虹周赛 T1。

思维:0。

代码:0。

题面

题目描述

晚自习有 \(n\) 分钟,一共有 \(m\) 个学科可能布置作业。第 \(i\) 个学科的作业量为 \(a_i\),初始时 \(a_{1\dots m}=0\)。每分钟有如下情况:

  1. 1 x。做第 \(x\) 个学科的作业,保证此时 \(a_x >0\)。第 \(x\) 个学科作业量减少 \(1\)。也就是 \(a_x \to a_x-1\)
  2. 2。发呆,不进行任何操作。
  3. 3 x y。第 \(x\) 个学科布置作业,保证此时 \(a_x=0\)。第 \(x\) 个学科作业量变为 \(y\)。也就是 \(a_x \to y\)
  4. 4 x。第 \(x\) 个学科的老师收作业,如果之前第 \(x\) 个学科的老师已经收过作业了,则之前那次收作业操作作废(也就是延后了收作业时间)。如果此时是第 \(x\) 个学科最后一次收作业(也就是之后的时间内不存在 4 y,满足 \(x=y\)),且 \(a_x>0\),那么你就会被惩罚。

\(n\) 分钟后,你是否会被惩罚。若会,输出 Yes;若不会,输出 No

注:即使某个学科没布置作业,也可能收作业。

输入格式

第一行两个整数 \(n,m\)

接下来 \(n\) 行,每行 \(1\)\(3\) 个整数,表示每分钟的情况。具体格式见题目描述。

输出格式

一行一个字符串,表示答案。

输入输出样例 #1

输入 #1

6 2
3 1 10
1 1
1 1
3 2 2
2
1 1

输出 #1

No

输入输出样例 #2

输入 #2

6 2
3 1 4
1 1
3 2 5
4 2
2
2

输出 #2

Yes

说明/提示

【数据范围】

本题采用捆绑测试

  • Subtask 1(20 pts):\(n=1\)
  • Subtask 2(20 pts):\(m=1\)
  • Subtask 3(60 pts):无特殊限制。

对于所有数据,保证 \(1 \le n,m \le 100\)

题解

考虑维护 \(cnt\) 表示当前有几个学科可能要惩罚,\(vis_x\) 表示第 \(x\) 个学科是否可能要惩罚。

对于第一个操作,执行 \(a_x \to a_{x}-1\)

对于第二个操作,跳过。

对于第三个操作,执行 \(a_x \to y\)

对于第四个操作,若 \(vis_x=1\) 则说明之前一次提交作业会被惩罚,但是这个学科延长了提交时间,所以之前那次不作数。有:\(vis_x \to 0,cnt\to cnt-1\)。那么再判断当前是否满足 \(a_x=0\) 即可。若不满足,有:\(vis_x \to 1,cnt\to cnt+1\)

最后只需要看 \(cnt\)\(0\) 的关系。时间复杂度 \(O(n)\)

Chi

【HT-095-Rainbow】核桃彩虹周赛 T3。

思维:0。

代码:0。

题面

题目描述

给定一个 \(1\sim n\) 的排列 \(p_{1\dots n}\)

再给定无向图 \(G_1,G_2\),其中 \(G_1\) 包含了 \(m_1\) 条边,\(G_2\) 包含了 \(m_2\) 条边,且两张图中点编号均在 \(1\sim n\)

有序点对 \((u,v)\) 的数量,满足:

  • \(p_u <p_v\)
  • \(u\) 在图 \(G_1\) 中可以在经过若干条边的情况下到达 \(v\)
  • \(u\) 在图 \(G_2\) 中可以在经过若干条边的情况下到达 \(v\)

这里有序点对表示 \((u,v)\)\((v,u)\) 不是相同点对。

注:可能存在重边,自环

输入格式

第一行一个整数 \(n\)

第二行 \(n\) 个整数 \(p_i\)

接下来一个整数 \(m_1\)

接下来 \(m_1\) 行,每行两个整数 \(u,v\)。表示 \(u,v\)\(G_1\) 中通过一条边连接。

接下来一个整数 \(m_2\)

接下来 \(m_2\) 行,每行两个整数 \(u,v\)。表示 \(u,v\)\(G_2\) 中通过一条边连接。

输出格式

一行一个整数,表示满足条件的点对数量。

输入输出样例 #1

输入 #1

3
1 3 2
1
2 3
2
1 3
2 3

输出 #1

1

输入输出样例 #2

输入 #2

10
1 4 7 2 5 8 3 6 9 10
11
1 4
2 5
3 4
6 9
8 9
1 2
3 5
1 4
5 1
7 10
3 1
7
1 2
5 6
9 10
3 4
2 4
6 7
7 5

输出 #2

6

说明/提示

【数据范围】

本题采用捆绑测试

  • Subtask 1(20 pts):\(1 \le n \le 10^3\)
  • Subtask 2(10 pts):\(m_1=0\)
  • Subtask 3(10 pts):图 \(G_1,G_2\) 均为联通图。
  • Subtask 5(60 pts):无特殊限制。

对于所有数据,保证 \(1 \le n,m_1,m_2 \le 10^5,1 \le p_i \le n,1 \le u,v \le n\)

题解

如果 \(u,v\)\(G_1\)\(G_2\) 中都联通。当 \(p_u < p_v\),只有 \((u,v)\) 对答案产生贡献;当 \(p_u>p_v\),只有 \((v,u)\) 对答案产生贡献。

那么 \(p\) 就没用了。只需要维护无序点对 \((u,v)\) 的数量,满足 \(u,v\)\(G_1\)\(G_2\) 中都联通。并查集维护。

Yao

【HT-095-Rainbow】核桃彩虹周赛 T6。

思维:3。

代码:3。

题面

题目描述

给定长度为 \(n\) 的序列 \(a,b\) 和整数 \(m\)

现有一张完全图 \(G\),图中边 \((u,v)\) 的边权为 \(\max(m\bmod (a_u \times a_v),(b_u \times b_v)\bmod m)\)

求该完全图的一个子图,使得该子图中 \(1\sim n\) 任意两点均联通且边权和最小。输出最小边权和。

输入格式

第一行三个整数 \(n,m\)

第二行 \(n\) 个整数 \(a_i\)

第三行 \(n\) 个整数 \(b_i\)

输出格式

一行一个整数表示最小的边权和。

输入输出样例 #1

输入 #1

7 3
4 10 5 10 10 8 8
3 9 3 3 1 3 3

输出 #1

18

说明/提示

【数据范围】

本题采用捆绑测试

  • Subtask 1(5 pts):\(1 \le n \le 10\)
  • Subtask 2(5 pts):\(1 \le n \le 20\)
  • Subtask 3(10 pts):\(1 \le n \le 10^3\)
  • Subtask 4(10 pts):\(a_i\) 均为 \(1\)\(b_i \le 5\)
  • Subtask 5(10 pts):\(1 \le a_i,b_i,m \le 10\)
  • Subtask 6(10 pts):\(m=10^9\)
  • Subtask 7(10 pts):\(a_i=b_i\)
  • Subtask 8(40 pts):无特殊限制。

对于所有数据,保证 \(1 \le n \le 10^5\)\(1 \le a_i,b_i \le 300,1 \le m \le 10^9\)

题解

考虑 Boruvka。

那么现在问题变成:

给定序列 \(a,b\),点 \(i\) 的颜色为 \(c_i\)。对于每个 \(i\),求 \(c_j \ne c_i\)\(j\)\(\max(m\bmod (a_i \times a_j),(b_i \times b_j)\bmod m)\) 的最小值。

  1. 如果 \(m\bmod (a_i\times a_j)\) 为最大值。枚举 \(a_j =x\)。那么问题变成:求满足 \(a_j =x,c_j \ne c_i,(b_i \times b_j)\bmod m \le m\bmod (a_i\times a_j)\) 的一个 \(j\)。维护前者最小值,若该最小值在 \(m\bmod (a_i\times a_j)=m\bmod (a_i\times x)\) 时满足条件,那么一定存在一条边权为这么多的边;否则一定不存在。 记 \(f_{x,y}\)\(a_j=x\) 时,\((b_i\times b_j)\bmod m\) 的最小值。时间复杂度 \(O(V)\)

  2. 如果 \((b_i\times b_j)\bmod m\) 为最大值。同理, 记 \(g_{x,y}\)\(b_j=x\) 时,\(m\bmod (a_i \times a_j)\) 的最小值。时间复杂度 \(O(V)\)

维护 \(f_{x,y}\)。加入一个点后 \(x\) 是定值,枚举 \(y\) 即可。时间复杂度 \(O(V)\)

维护 \(g_{x,y}\)。加入一个点后 \(x\) 是定值,枚举 \(y\) 即可。时间复杂度 \(O(V)\)

对于 \(c_i \ne c_j\) 的限制,维护颜色不同的最小值和次小值即可。

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

posted @ 2026-01-17 00:42  harmis_yz  阅读(95)  评论(2)    收藏  举报