简单题 2

联网

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

思维:0。

代码:0。

题面

题目背景

为什么手机连不上网。

题目描述

小f 的手机里显示了 \(n\) 个网络,这些网络的名称都由小写字母 a 到 z 与 -5G 组成(保证 -5G 在出现的情况下只会是名称的结尾,且只会出现 \(1\) 次)。若一个网络以 -5G 结尾,则称它是 \(5G\) 网;否则不是。

已知小f 手机里这 \(n\) 个网络是按照字典序升序排序的,问:

  1. \(n\) 个网络中有多少个 \(5G\) 网。
  2. \(n\) 个网络中有多少个非 \(5G\) 网 \(s\),使得 \(s\) 对应的 \(5G\) 网也在这 \(n\) 个网络中。这里 \(s\) 对应的 \(5G\) 网指在 \(s\) 后面加上字符串 -5G 后得到的网络 \(t\)。

输入格式

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

接下来 \(n\) 行,每行一个字符串 \(s_i\),表示网络名称的字典序第 \(i\) 大的网络。

输出格式

一行两个整数,依次表示两个问题的答案。

输入输出样例 #1

输入 #1

5
a
b
b-5G
c
d

输出 #1

1 1

输入输出样例 #2

输入 #2

4
adsd-5G
aee-5G
fiveg-5G
gd-5G

输出 #2

4 0

说明/提示

【数据范围】

本题采用捆绑测试。

  • Subtask 1(10 pts):\(n=1\)。
  • Subtask 2(10 pts):\(n=2\)。
  • Subtask 3(10 pts):\(|s_i|\le 2\)
  • Subtask 4(70 pts):无特殊限制。

对于所有数据,保证 \(1 \le n \le 10^5,1 \le |s_i|\le 10\) 且 \(n\) 个网络的名称互不相同。

特殊的,若一个网络是 \(5G\) 网,保证其名称长度大于 \(3\)。

题解

由于是按照字典序升序的,所以如果存在两个字符串 \(s\) 和 \(s-5G\),那么它们一定是相邻两个,且前者的排在后者前一位。

那么只需要顺次读入,判断是否以 -5G 结尾。如果是,再判断前一个字符串是否等于该字符串去掉后三个字符后得到的字符串。时间复杂度 \(O(\sum|s_i|)\)。

Jyu

【HT-098-Rainbow】核桃彩虹周赛 T4。

思维:3。

代码:2。

题面

题目描述

玖有一个 \(0 \sim n-1\) 的排列 \(p_1\dots p_n\)。也就是说,\(0\sim n-1\) 均在 \(p_1\dots p_n\) 中出现了恰好一次。

现在对于 \(i=1,2,\dots ,n\),妻求出了 \(f_{i}=\operatorname{MEX}(\{p_1,p_2,\dots,p_i\})\),瑶求出了 \(g_i=\operatorname{MEX}(\{p_i,p_{i+1},\dots,p_n\})\)。

珥根据 \(f_{1\dots n}\) 和 \(g_{1\dots n}\) 得到了 \(r(p)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}[f_i < g_j]\)。其中 \(r(p)\) 可以看做一个关于排列 \(p\) 的函数。

如果 \(r(p)=k\),harmis 就会开心。fzitb 想知道,有多少排列 \(p\) 可以让 harmis 开心。排列 \(p\) 的数量对 \(m\) 取模。

注:\(\operatorname{MEX}(\{S\})\) 为最小的不属于 \(S\) 的自然数。

输入格式

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

输出格式

一行一个整数,表示满足条件的排列数量。

输入输出样例 #1

输入 #1

4 7 100000007

输出 #1

3

输入输出样例 #2

输入 #2

14 54 100000007

输出 #2

68494589

输入输出样例 #3

输入 #3

70 80 123456789

输出 #3

13510548

说明/提示

【数据范围】

本题采用捆绑测试。

  • Subtask 1(10 pts):\(1 \le n \le 10\)。
  • Subtask 2(10 pts):\(1 \le n \le 16\)。
  • Subtask 3(10 pts):\(1 \le n \le 25\)。
  • Subtask 4(5 pts):\(0 \le k \le n+1\)。
  • Subtask 5(20 pts):\(1 \le n \le 50\)。
  • Subtask 6(10 pts):\(0 \le k \le 200\)。
  • Subtask 7(35 pts):无特殊限制。

对于所有数据,保证 \(1 \le n \le 100,0 \le k \le 500,10^8 \le m \le 10^9\)。

题解

注意常数。

记 \(pos_i\) 为 \(i\) 在排列 \(p\) 中的位置,即 \(p_{pos_i}=i\)。

当 \(i<j\) 时,显然 \(\min(f_i,g_j)=0\)。此时贡献为 \(\frac{pos_0\times (pos_0-1)}{2}\)。

当 \(i\ge j\) 时,发现 \(\min(f_i,g_j)=\operatorname{MEX}(\{p_i,p_{i+1},\dots,p_j\})\)。因为 \(\operatorname{MEX}(\{p_i,p_{i+1},\dots,p_j\})\) 不在 \([i,j]\) 左边就一定在 \([i,j]\) 右边。那么相当于维护区间 \([l,r]\) 的数量,满足 \(pos_{\operatorname{MEX}(\{p_l,p_{l+1},\dots,p_r\})} > r\)。

有贡献和为:\(\frac{pos_0\times (pos_0-1)}{2}+\frac{pos_0\times (pos_0-1)}{2}+\sum\limits_{i=1}^{n-1}(\min\limits_{j=0}^{i-1}pos_j)\times \max(0,pos_i-\max\limits_{j=0}^{i-1}pos_j)\)。显然 \(pos\) 和 \(p\) 是一一对应的,那么可以把 \(pos\) 看成一个 \(0\sim n-1\) 的排列。问题变成:求 \(1 \sim n\) 的排列 \(p\) 的数量,使得 \(p_1\times (p_1-1)+\sum\limits_{i=2}^{n}(\min\limits_{j=1}^{i-1}p_j)\times \max(0,p_i-\max\limits_{j=1}^{i-1}p_j)=k\)。

发现我们只关心 \([1,i-1]\) 中的最小值,最大值。考虑定义状态函数 \(f_{i,l,r,x}\) 表示 \([1,i]\) 的位置确定后,最小值为 \(l\),最大值为 \(r\),且上式的值为 \(x\) 的方案数。特殊转移 \(i=1\),对于 \(i \in [2,n]\) 有:

  1. \(l \le p_i \le r\)。此时对 \(l,r\) 无影响。\(f_{i,l,r,x}\leftarrow (r-l-i+2)\times f_{i-1,l,r,x}\)。
  2. \(p_i <l\)。此时 \(l \to p_i\)。\(f_{i,l',r,x}\leftarrow f_{i-1,l,r,x}[l > l']\)。
  3. \(p_i>r\)。此时 \(r\to p_i\)。\(f_{i,l,r',k+l\times (r'-r)}\leftarrow f_{i-1,l,r,x}[r<r']\)。

时间复杂度 \(O(n^4 k)\)。简单前缀和或后缀和优化做到 \(O(n^3k)\)。

发现 \(f_{i,l,r,*}\) 在 \(r-l+1 <i\) 时一定为 \(0\),此时只转移 \(r-l+1 \ge i\) 的状态复杂度降至原来的 \(\frac{1}{6}\)。足够了。

其实发现 \(x\) 这一维关于 \(l,r\) 也有限制。如果上面的过不了可以尝试从这一维优化。

Era

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

思维:3。

代码:4。

题面

题目背景

珥还是喜欢驱魔,因为 \((9+1) \bmod (7+1)=2\)。

题目描述

现在有一个长度为 \(n\) 的序列 \(a\) 和两个整数 \(k,x\)。

定义一个区间 \([l,r]\) 的驱魔难度为 \(\sum\limits_{i=l}^{r}\sum\limits_{y=l}^{r} [a_i \bmod a_j \le k]\)。如果一个区间 \([l,r]\) 的驱魔难度不大于珥的能力上限 \(x\),那么她就可能给这个区间驱魔。

现有 \(m\) 次询问,每次给定 \(L,R\)。问 \([L,R]\) 包含了多少个珥可能去驱魔的区间?

【形式化题面】:

定义 \(f(l,r)=\sum\limits_{i=l}^{r}\sum\limits_{j=l}^{r}[a_i \bmod a_j \le k]\)。

有 \(m\) 次询问,每次给定 \(L,R\)。求 \(\sum\limits_{l=L}^{R}\sum\limits_{r=l}^{R}[f(l,r)\le x]\)。

输入格式

第一行四个整数 \(n,m,k,x\)。

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

接下来 \(m\) 行,每行两个整数 \(L,R\),表示一个询问。

输出格式

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

输入输出样例 #1

输入 #1

6 3 2 3
10 8 6 3 8 9
2 4
2 3
3 5

输出 #1

5
3
5

说明/提示

【数据范围】

本题采用捆绑测试。

  • Subtask 1(1 pts):\(1 \le n \le 50,1 \le m \le 5\)。
  • Subtask 2(4 pts):\(1 \le n \le 100\)。
  • Subtask 3(5 pts):\(1 \le n \le 10^3\)。
  • Subtask 4(10 pts):\(k >\max\limits_{i=1}^{n}a_i\)。
  • Subtask 5(10 pts):\(1 \le a_i \le 20\)。
  • Subtask 6(10 pts):\(m=1\)。
  • Subtask 7(10 pts):对于 \(1 \le i < n\),满足 \(a_i < a_{i+1}\)。
  • Subtask 8(20 pts):\(1 \le n,m \le 3\times 10^4\)。
  • Subtask 9(30 pts):无特殊限制。

对于所有数据,保证 \(1 \le n,m,a_i,k,x \le 10^5,1 \le L \le R \le n\)。

题解

简单地想,如果 \(f(l,r) \le k2\),那么显然在 \(l<r\) 时有 \(f(l+1,r) \le k2\)。那么区间 \([l,r]\) 明显能够支配 \([l+1,r]\)。所以如果对每个 \(r\) 维护出最小的 \(l_r\),使得 \(f(l_r,r) \le k2\),那么询问就变成查询 \(\sum\limits_{r=L}^{R}r-\max(L,l_r)+1\)。

求 \(l_r\)。

根据 \(f(l,r)\) 的单调性,直接枚举 \(r\),指针维护 \(l\)。那么需要支持:

  1. 添加 \(x\)。求当前集合中元素 \(y\),满足 \(y \bmod x \le k1\) 与 \(x \bmod y \le k1\) 的数量。
  2. 删除 \(x\)。求当前集合中元素 \(y\),满足 \(y \bmod x \le k1\) 与 \(x \bmod y \le k1\) 的数量。

这两个本质等价。考虑根号分治。设闸值为 \(B\)。

  1. \(x\le B\)。那么在加入或删除元素是枚举 \(x\),提前计算对 \(x\) 的贡献。时间复杂度 \(O(nB)\)。
  2. \(x >B\)。\(y \bmod x=y-\lfloor\frac{y}{x}\rfloor\)。后者 \(\le \frac{V}{B}\)。是一个区间和问题,使用 \(O(\sqrt{V})-O(1)\) 分块维护做到 \(O(n\sqrt{V}+n\frac{V}{B})\)。

这里 \(n,V\) 同阶,所以平衡后时间复杂度 \(O(n\sqrt{n})\)。

求 \(\sum\limits_{r=L}^{R}r-\max(L,l_r)+1\)。

\(r+1\) 是常量,相当于维护 \(\sum\limits_{r=L}^{R}\max(L,l_r)\)。对 \(r\) 扫描线,维护当前 \(r=r0\) 时,所有 \(l\) 的答案。那么当 \(L \le l_r\) 时,贡献为 \(l_r\);当 \(L > l_r\) 时,贡献为 \(L\)。这是个区间加等差数列,前者可以看做公差为 \(0\)。单点查询。线段树维护做到 \(O(n\log n)\)。

那么时间复杂度就是 \(O(n\sqrt{n}+n\log n)\) 的。

oo_vv_oo

P17314

思维:0。

代码:0。

题解

注意到一次询问 \(i_{1\sim k}\) 后,返回的 \(j_{1\sim K}\) 满足 \(K \le \lfloor\frac{k}{2}\rfloor\)。因为如果 \(A_{i_x} > \max(A_{i_{x-1}},A_{i_{x+1}})\),一定有 \(i_{x-1}\) 和 \(i_{x+1}\) 都不在返回的 \(j\) 中。具体的,记 \(f(n)\) 为查询 \(n\) 个数时返回个数的最大值,那么:\(f(n) = \lceil\frac{n-2}{2}\rceil\)。

那么每次查询都是差不多减半的,且全局最大值一定在返回的 \(j\) 中。一直查询返回的集合即可,注意需要再将 第一个和最后一个位置加到查询里。

时间复杂度 \(O(n)\)。

作弊

P17317

思维:5。

代码:3。

题解

\(n > k\)。

考虑分成两部分做,分别是 \([1,k],[k+1,n]\)。

先思考不存在 \(p_i = -10^{9}\) 的情况。\(\text{maxp}\) 就是前缀和的最大值,\((\sum\limits_{i=1}^{n}p'_i)\) 的部分相当于是一个独立集。转一下贡献,有 \((\sum\limits_{i=1}^{n}p'_i) = (\sum\limits_{i=1}^{n}p_i)+\sum\limits_{x\in s}^{}(D-p_x)\),其中 \(s\) 为选择替代的下标集合。定义 \(f_{i}\) 为只考虑 \([1,i]\) 时 \(\sum\limits_{x\in s}^{}(D-p_x)\) 可能的最大值,分两种情况转移:

  1. \(i\in S\),则 \(i-1 \notin S\)。\(f_i \gets f_{i-2}+(D-p_x)\)。
  2. \(i \notin S\),则 \(i-1\) 无限制。\(f_i \gets f_{i-1}\)。

整体转移为:\(f_{i} = \max(f_{i-1},f_{i-2}+(D-p_x))\)。时间复杂度 \(O(n)\)。


再思考存在 \(p_i = -10^{9}\) 的情况。最终 \((\sum\limits_{i=1}^{n}p'_i)\) 的最大值等于 \(f_n\),所以不难想到通过转化 \(f_n = \sum\limits_{i=1}^{n}(f_i-f_{i-1})\) 来维护。这样就只需要在意每次的差分量而不在意具体值。记 \(\Delta_i = f_i - f_{i-1}\),则 \(\Delta_i = \max(f_{i-1},f_{i-2}+(D-p_x))-f_{i-1} = \max(0,(D-p_x)-\Delta_{i-1})\)。那么就完全不需要 \(f\) 这个状态函数了,直接维护 \(\Delta\)。


考虑对 \([k+1,n]\) 计算贡献。

设 \(g(x)\) 为转移到 \(k\) 时,所有 \(\Delta_k = x\) 的方案的 \(g_{\text{maxp}}\) 之和。

定义状态函数 \(dp2_{i,j}\) 为转移到 \(i\) 时,\(\Delta_i =j\) 的方案的 \(g_{\text{maxp}}\) 之和,则 \(dp2_{k,x}=g(x)\)。维护 \(Ans\) 为最终答案。转移为:

  1. \(dp2_{i,\max(0,(D-p_i)-j)}\gets dp2_{i-1,j}\)。
  2. \(Ans \gets dp2_{i-1,j} \times (\max(0,(D-p_i)-j) )\times (2V+1)^{cnt_{i+1}}\)。其中 \(cnt_x\) 为 \([x,n]\) 中 \(p_i=-10^9\) 的数量。

时间复杂度为 \(O(nV^2)\)。


考虑对 \([1,k]\) 计算贡献及计算 \(g(x)\)。

有 \(f_n\) 转化成 \(\sum\limits_{i=1}^{n}(f_i-f_{i-1})\) 做铺垫,不难想到把 \(G_{\text{maxp}}\) 也差分掉(这里的 \(G\) 指原题目中的 \(g\))。有 \(G_{\text{maxp}} = \sum\limits_{i=0}^{nV}(G_i - G_{i-1})[\text{maxp}\ge i]\)。

定义状态函数 \(dp1_{i,j,k}\) 为转移到 \(i\) 时,\(\Delta_i = j\) 且距离提前钦定的 \(\text{maxp}\) 还差 \(k\)(\(k=0\) 表示已经达到了)的方案的 \(G_{\text{maxp}}-G_{\text{maxp}-1}\) 之和,\(g_{i,j,k}\) 为这些 \(G_{\text{maxp}}-G_{\text{maxp}-1}\) 乘上 \(\sum\limits_{x\in s}^{}(D-p_x)\) 之和。

初始化 \(dp1_{0,0,k}= G_{k} - G_{k-1},g_{0,0,k}=0\)。

记 \(j' = \max(0,(D -p_i)-j)\)。转移为:

  1. \(dp1_{i,j',k - p_i}\gets dp1_{i-1,j,k},g_{i,j',k-p_i}\gets dp1_{i-1,j,k}\times j'+g_{i-1,j,k}\)。条件为 \(k - p_i > 0\land k>0\)。表示 \(i\) 之前没有超过钦定值,\(i\) 也没有超过钦定值。
  2. \(dp1_{i,j',0}\gets dp1_{i-1,j,k},g_{i,j',0}\gets dp1_{i-1,j,k}\times j'+g_{i-1,j,k}\)。条件为 \(k-p_i \le 0\land k >0\)。表示 \(i\) 之前没有超过钦定值,\(i\) 是第一个超过钦定值的下标。
  3. \(dp1_{i,j',0}\gets dp1_{i-1,j,0},g_{i,j',0}\gets dp1_{i-1,j,0}\times j'+g_{i-1,j,0}\)。表示 \(i\) 之前就已经超过钦定值了。

那么最后对答案的贡献就是 \(\sum\limits_{j}^{} g_{k,j,0}\),即 \(Ans \gets \sum\limits_{j}^{} g_{k,j,0}\times (2V+1)^{cnt_{k+1}}\)。而对于 \(g(x)\),有 \(g(x) = dp1_{k,x,0}\)。

时间复杂度 \(O(k^2V^3)\)。其中 \(dp1,g\) 的第三维值域为 \([0,kV]\) 而不是 \([0,nV]\)。


再来考虑 \((\sum\limits_{i=1}^{n} p_i)\) 的贡献。还是钦定 \(\text{maxp} \ge x\),只是不需要维护 \(\Delta_i\) 的值。时间复杂度 \(O(n+k^2V^2)\)。

则对于 \(n > k\) 的情况,整体时间复杂度 \(O(n+k^2V^2 + k^2 V^3 + nV^2)\)。


\(n \le k\)。

依旧钦定 \(\text{maxp}\ge x\)。复杂度 \(O(n^2V^2)\)。

有些部分可以前缀和优化。

覆盖

思维:0。

代码:0。

题面
## 题目描述

给定一个有 $m$ 个点,$m$ 条边的有向无环图,第 $i$ 条边从 $u_i$ 指向 $v_i$。

现在给定一个集合 $S$。问是否存在一条路径经过了所有编号在 $S$ 中的所有边(允许经过编号不在 $S$ 中的边)?

## 输入格式

第一行两个整数 $n,m$。

接下来 $m$ 行每行两个整数 $u_i,v_i$。

接下来一行一个整数 $k$,表示集合 $S$ 的大小。

接下来一行 $k$ 个整数,表示集合 $S$ 中的元素。

## 输出格式

若存在这样的路径,输出 `YES`;若不存在,输出 `NO`。

## 输入输出样例 #1

### 输入 #1

4 9
2 4
2 1
3 1
2 4
2 4
3 4
2 4
4 1
4 1
1
1


### 输出 #1

YES


## 说明/提示

**【说明提示】**

对于样例 $2$,满足测试点 $4\sim 5$ 的限制。

对于样例 $3$,满足测试点 $6\sim 7$ 的限制。

对于样例 $4$,满足测试点 $8\sim 9$ 的限制。

对于样例 $5$,满足测试点 $16\sim 20$ 的限制。

**【数据范围】**

对于测试点 $1\sim 3$,保证 $1\le n \le 4$。

对于测试点 $4\sim 5$,保证 $1 \le n \le 15,1 \le k \le 15$。

对于测试点 $6\sim 7$,保证 $m = n - 1,1 \le k \le 20$。

对于测试点 $8 \sim 9$,保证 $1 \le k \le 20,1 \le n,m \le 200$。

对于测试点 $10\sim 15$,保证 $1 \le n,m \le 500$。

对于测试点 $16\sim 20$,无特殊限制。

对于所有数据,保证 $1 \le n,m \le 5\times 10^3,1 \le k \le m$,**不保证无重边**,保证无自环。

题解

注意到一条路径 \(p_1\to p_2\to p_3\to \dots \to p_k\) 满足:

  • 对于任意两条边 \((p_i,p_{i+1}),(p_j,p_{j+1})\),路径 \(p_1\to p_2\to\dots \to p_k\) 同时经过了它们。

不难发现,这玩意是个充要条件。即只要集合 \(S\) 中任意两个编号的边 \((u_1,v_1),(u_2,v_2)\) 满足:存在一条路径同时经过它们,就一定存在一条路径同时经过 \(S\) 中所有边。考虑证明:

  • 必要性。题解开头已经给出,路径中任意两条边都被这条路径包含,由于 \(S\) 是这条路径边的编号构成集合的子集,所以也一定满足。
  • 充分性。考虑构造证明。按照一定顺序从集合中拿边出来加到路径上。记当前路径为 \((p_1\to c_1)\to (p_2\to c_2)\to (p_3\to c_3)\to \dots \to (p_k\to c_k)\),其中 \((p_x\to c_x)\) 为 \(S\) 中一个编号对应的边。那么由于 \(S\) 中任意一个编号对应的边都存在一条路径同时经过它和 \((u,v)\),则一定存在一个 \(i\),使得:\(j\in [1,i]\) 均存在先经过 \((p_j,c_j)\) 后经过 \((u,v)\) 的路径;\(j\in (i,k]\) 均存在先经过 \((u,v)\) 后经过 \((p_j,c_j)\) 的路径。用反证法:假设 \([1,i]\) 中有 \(j\),使得存在先经过 \((u,v)\) 后经过 \((p_j,c_j)\) 的路径,则一定有 \((u \to v)\to (p_j \to c_j)\to (p_{j+1}\to c_{j+1})\to\dots \to (p_{i+1}\to c_{i+1})\to (u\to v)\) 的路径,此时成环了,而原图是有向无环图,假设不成立。那么此时让新的路径变成 \((p_1\to c_1)\to (p_2\to c_2)\to \dots \to (p_i\to c_i)\to (u\to v)\to (p_{i+1}\to c_{i+1})\to\dots \to (p_k\to c_k)\) 就行了。

则只需要判断 \(S\) 中任意两个编号对应的边是否都存在一条路径同时经过它们了。对每个点跑一次 DFS 可以做到 \(O(n(n+m) + k^2)\),如果用 bitset 维护可达性可以做到 \(O(\frac{n(n+m)}{\omega}+k^2)\)。

显然存在更简单且复杂度更优的做法。

数数树数

思维:2。

代码:0。

题面

## 题目描述

对于一棵有根二叉树 $T$,定义它是好的当且仅当对于每个点 $u$,其左子树的点编号均小于 $u$(或不存在),右子树的点编号均大于 $u$(或不存在)。

定义 $cnt_i$ 为 $i$ 到根节点路径中编号比 $i$ 大的点的数量(路径包括 $i$ 和根节点)。

给定一个长度为 $n$ 的序列 $val_{1\dots n}$。对于一棵好的树 $T$,其价值为 $v(T)=\prod\limits_{i=1}^{n}{val_i}^{cnt_i}$。

求所有好的树 $T$ 的价值之和,答案对 $998244353$ 取模。

## 输入格式

第一行一个整数 $n$。

第二行 $n$ 个整数 $val_{1\dots n}$。

## 输出格式

一行一个整数表示答案。

## 输入输出样例 #1

### 输入 #1

5
1 4 5 1 4


### 输出 #1

10758


## 说明/提示

**【说明提示】**

对于样例 $2$,满足测试点 $3\sim 4$ 的限制。

对于样例 $3$,满足测试点 $5\sim 7$ 的限制。

对于样例 $4$,满足测试点 $11\sim 15$ 的限制。

对于样例 $5$,满足测试点 $16\sim 25$ 的限制。

**【数据范围】**

对于测试点 $1\sim 2$,保证 $1\le n \le 10$。

对于测试点 $3\sim 4$,保证 $1 \le n \le 20$。

对于测试点 $5\sim 7$,保证 $1 \le n \le 50,1 \le val_i \le 4$。

对于测试点 $8\sim 10$,保证 $1 \le n \le 500,1 \le val_i \le 4$。

对于测试点 $11\sim 15$,保证 $1 \le n \le 500$。

对于测试点 $16\sim 25$,保证 $1 \le n \le 5000$。

对于所有数据,保证 $1 \le n \le 5\times 10^3,1 \le val_i \le 10^9$。

题解

好的树 \(T\) 是一个二叉搜索树。

那么对于 \(u\) 来说,记 \(u\) 到根依次经过了点 \(p_1,p_2,\dots ,p_k\)。则 \(cnt_u = \sum\limits_{i=2}^{k}[p_{i-1} = leftson_{p_{i}}]\)。也就是往右跳的次数。

联想到笛卡尔树是一棵二叉搜索树,且拥有比较优秀的性质。考虑模拟笛卡尔树建树的过程,在模拟的时候建树。由于是对所有二叉搜索树计数,所以我们并不需要关心两个点的大小(直接钦定某个比另一个大或者小就行了)。

将序列反转,那么笛卡尔树建树时维护的右链就是实际上的左链。设当前栈底元素到栈顶元素分别为 \(c_1,c_2,\dots,c_k\),且加入 \(i\) 后将 \(c_{x},c_{x+1},\dots,c_k\) 弹出栈。那么在树上相当于断开 \((c_{x-1},c_x)\) 的边,让 \(i\) 成为 \(c_{x-1}\) 的左儿子(实际上的),让 \(c_x\) 成为 \(i\) 的右儿子。

注意到此时 \(cnt_{1,2,\dots,i-1}\) 都没有变,唯一变化的只有 \(cnt_i\)。而恰好 \(i\) 到根节点过程中往右跳的次数就是 \(x\),即弹出后栈中元素数量。那么就可以定义状态函数 \(f_{i,j}\) 为加入完前 \(i\) 个点,栈的大小为 \(j\) 的价值和。则转移方程为:\(f_{i,j+1}={val_{n-i+1}}^j(\sum\limits_{k\ge j}^{}f_{i-1,k})\)。后缀和优化做到 \(O(n^2)\)。

JPC

思维:4。

代码:2。

题面
## 题目描述

给定一棵大小为 $n$ 的外向树(边都是父节点指向子节点),点 $i$ 的价值为 $val_i$。根节点是 $1$。

现给每个点一个值 $p_i$,保证 $p$ 是 $1\sim n$ 的排列。现在保留所有满足 $p_u < p_v$ 的边 $(u,v)$。定义 $h_u$ 为 $u$ 可到达的点的 $val$ 和。

则这棵树在 $p$ 下的价值为 $\prod\limits_{i=1}^{n}{h_i}$。求所有 $p$ 的价值和。

答案对 $10^9 + 7$ 取模。

## 输入格式

第一行一个整数 $n$。

第二行 $n$ 个整数 $val_i$。

接下来 $n-1$ 行,每行两个整数 $u,v$ 表示一条边。

## 输出格式

一行一个整数表示答案。

## 输入输出样例 #1

### 输入 #1

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


### 输出 #1

47200


## 输入输出样例 #2

### 输入 #2

3
4 9 2
1 2
1 3


### 输出 #2

1026


## 输入输出样例 #3

### 输入 #3

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


### 输出 #3

972455813


## 说明/提示

**【说明提示】**

对于样例 $4$,满足测试点 $3\sim 4$ 的限制。

对于样例 $5$,满足测试点 $5\sim 6$ 的限制。

对于样例 $6$,满足测试点 $7\sim 9$ 的限制。

对于样例 $7$,满足测试点 $10\sim 13$ 的限制。

对于样例 $8$,满足测试点 $14\sim 20$ 的限制。


**【数据范围】**

对于测试点 $1\sim 2$,保证 $1 \le n \le 8$。

对于测试点 $3\sim 4$,保证 $1 \le n \le 15$。

对于测试点 $5\sim 6$,保证 $val_i = 1$。

对于测试点 $7\sim 9$,保证 $1 \le val_i \le 4$。

对于测试点 $10\sim 13$,保证 $1 \le val_i \le 20$。

对于测试点 $14 \sim 20$,无特殊限制。


对于所有数据,保证 $1 \le n \le 100,1 \le val_i \le 10^9$。

题解

如果所有边都被保留了。价值为 \(\prod\limits_{u=1}^{n}(\sum\limits_{v\in T(u)}^{}val_v)\)。这个等价于每个点 \(u\) 在其子树中选择一个点记为 \(t_u\),然后求 \(\sum\limits_{t}^{} \prod\limits_{u=1}^{n}val_{t_u}\)。也就是把括号打开了。

那么在每条边不一定被保留的时候,也可以考虑这么干。那么 \(t_u\) 应该满足 \(P(u,t_u)\) 上任意一条边 \(x \to y\) 都有 \(p_x < p_y\)。也就是 \(P(u,t_u)\) 上点的 \(p\) 值单增。

考虑提前计算贡献。定义 \(f_{u,x,y}\) 表示 \(u\) 子树内,\(p_u\) 在这 \(siz_u\) 个点中的相对大小为 \(x\),\(P(1,fa_u)\) 中有 \(y\) 个点选择了 \(u\) 子树中某些点的价值乘积和。

对于 \(u\) 和它的一个儿子 \(v\),分情况讨论:

  1. \(p_u < p_v\)。允许 \(y \ge 1\)。
  2. \(p_u > p_v\)。不允许 \(y \ge 1\)。

考虑转移,记 \(siz\) 为当前 \(u\) 子树的大小(\(v\) 之前兄弟节点 \(siz\) 和加 \(1\)):

  1. \(p_u > p_v\)。\(f_{u,x+x_0,y}\gets \sum\limits_{x'=1}^{x_0}f'_{u,x,y}f_{v,x',0}\binom{(x-1)+x_0}{x_0}\binom{(siz-x)+(siz_v-x_0)}{(siz-x)}\)。
  2. \(p_u < p_v\)。\(f_{u,x+x_0,y+y'}\gets \sum\limits_{x'=x_0+1}^{siz_v}\sum\limits_{y'}f'_{u,x,y}f_{v,x',y'}\binom{(x-1)+x_0}{x_0}\binom{(siz-x)+(siz_v-x_0)}{(siz-x)}\binom{y+y'}{y}\)。

然后枚举 \(P(1,u)\) 中有多少个点选择了 \(u\):\(f_{u,x,y + y'}\gets f'_{y,x,y}(val_u)^{y'}\binom{y+y'}{y}\)。

最后 \(u\) 自己占一个,\(f_{u,x,y-1}=f'_{u,x,y}\)。

答案为 \(\sum f_{1,x,0}\)。时间复杂度 \(O(n^4)\)。

重置

思维:4。

代码:4。

题面
## 题目描述

给定长度为 $n$ 的序列 $a_{1\dots n}$,$b_{1\dots n}$ 和一个长度为 $n+1$ 的 $0\sim n$ 的排列 $val_{0\dots n}$。

定义 $f(l,r)=\text{mex}(\{a_l,a_{l+1},\dots,a_r\})$。

定义 $g(l,r) = \min\limits_{i=l}^{r}b_i$。

定义 $h(l,r) = val_{\max(f(l,r),g(l,r))}$。

对于 $x = 1\dots n$,求最大的 $k$,使得存在 $l$ 满足:

- 对于 $y \in [l,l+k-1]$,均存在至少一个长度为 $x$ 的区间 $[L,R]$ 对应的 $h(L,R)=y$。

请输出这个 $k$ 和对应的最小的 $l$ 使得 $y\in [l,l+k-1]$ 均存在至少一个长度为 $x$ 的区间 $[L,R]$ 对应的 $h(L,R)=y$。

## 输入格式

第一行一个整数 $n$。

第三行 $n$ 个整数 $a_{1\dots n}$。

第四行 $n$ 个整数 $b_{1\dots n}$。

第五行 $n+1$ 个整数 $val_{0\dots n}$。

## 输出格式

共 $n$ 行,每行两个整数,表示 $x=i$ 时最大的 $k$ 与这个 $k$ 对应的最小的 $l$。

## 输入输出样例 #1

### 输入 #1

5
0 1 2 0 1
1 1 2 1 2
1 2 3 4 5 0


### 输出 #1

2 2
2 2
1 4
1 4
1 4


## 输入输出样例 #2

### 输入 #2

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


### 输出 #2

6 2
5 2
3 2
4 2
3 3
3 4
3 5
2 7
2 7
1 8


## 说明/提示

**【说明提示】**

对于样例 $3$,满足测试点 $1$ 的限制。

对于样例 $4$,满足测试点 $4$ 的限制。

对于样例 $5$,满足测试点 $5\sim 7$ 的限制。

对于样例 $6$,满足测试点 $8\sim 11$ 的限制。

对于样例 $7$,满足测试点 $12\sim 13$ 的限制。

对于样例 $8$,满足测试点 $14\sim 15$ 的限制。

对于样例 $9$,满足测试点 $16\sim 18$ 的限制。

对于样例 $10$,满足测试点 $19\sim 25$ 的限制。

**【数据范围】**

对于测试点 $1$,保证 $1 \le n \le 500$。

对于测试点 $2\sim 3$,保证 $1 \le n \le 5000$。

对于测试点 $4$,保证 $b_i = n$。

对于测试点 $5\sim 7$,保证 $b_i = 0$。

对于测试点 $8\sim 11$,保证 $val_i = i$。

对于测试点 $12\sim 13$,保证对于 $2 \le i \le n$,$a_{i-1} \le a_i$。

对于测试点 $14 \sim 15$,保证对于 $2\le i \le n$,$b_{i-1}\le b_i$。

对于测试点 $16\sim 18$,保证 $0 \le b_i \le 20$。

对于测试点 $19\sim 25$,无特殊限制。


对于所有数据,保证 $1 \le n \le 10^5,0 \le a_i < n,0 \le b_i \le n$ 且 $val_{0\dots n}$ 是一个 $0\sim n$ 的排列。

题解

为了尽可能少的枚举状态,考虑寻找等价类。

有一个比较简单的结论:

  • 定义一个区间 \([l,r]\) 是极短的,当且仅当 \(\text{mex}(l,r)\ne \text{mex}(l+1,r),\text{mex}(l,r)\ne \text{mex}(l,r-1)\)。这里默认当 \(l>r\) 时 \(\text{mex}(l,r)=-1\)。那么这样的极短区间数量上界是 \(2n\)。

考虑证明:

设 \([l,r]\) 是一个极短区间,那么 \(a_l \ne a_r\)(否则删去任意一个 \(\text{mex}\) 不变)。不妨设 \(a_l < a_r\)。则 \(\text{mex}(l,r-1)=a_r\) 且 \(\text{mex}(l+1,r-1)=a_l\)。由于 \(\text{mex}(l,r)\le \text{mex}(l-1,r)\),所以在 \(r-1\) 固定时只会存在至多一个 \(l\) 满足条件。那么极短区间 \([l,r]\) 数量不超过 \(2n\)(算上 \([l,l]\))。

对于所有极短区间 \([l,r]\),找到 \(l\) 左边第一个 \(l_0\),使得 \(\text{mex}(l,r)=a_{l_0-1}\);找到右边第一个 \(r_0\),使得 \(\text{mex}(l,r)=a_{r_0+1}\)。则对于所有 \(L\in [l_0,l],R\in [r,r_0]\) 都有 \(\text{mex}(L,R)=\text{mex}(l,r)\)。则我们得到了 \(O(n)\) 个形如 \((l_0,l,r,r_0)\) 的等价类,且任意区间都被至少一个等价类包含。

同理,对于区间 \(\min\) 可以通过单调栈也找到 \(O(n)\) 个等价类。那么现在只需要考虑将 \(\min\) 和 \(\text{mex}\) 通过取较大值的方式复合成新的等价类。

令 \(p(l,r) = \max(f(l,r),g(l,r))\),由于 \(f(l,r) \le f(l,r+1),g(l,r)\ge g(l,r+1)\),所以 \(p(l,r)\) 随 \(r\) 增大时应该先取 \(g(l,r)\),再取 \(f(l,r)\)。对于每个 \(l\),维护 \(pos_l\) 表示当 \(r\in [l,pos_l]\) 时 \(p(l,r)=g(l,r)\);当 \(r\in (pos_l,n]\) 时 \(p(l,r)=f(l,r)\)。

分别考虑复合后等价类为区间 \(\text{mex}\) 和区间 \(\min\) 的变化。以区间 \(\text{mex}\) 举例。

对于原来一个等价类 \((l_0,l,r,r_0)\),\(L \in [l_0,l]\) 会将满足 \(R\in [r,\min(r_0,pos_L)]\) 的区间从该等价类中删除(因为取的是区间 \(\min\) 的值)。注意到 \(pos_{L}\le pos_{L+1}\),因为区间 \([L,R]\) 的 \(f(L,R)\) 相同,而 \(g(L+1,R)\ge g(L,R)\),所以只要 \(g(L,R)\ge f(L,R)\) 就一定也满足 \(g(L+1,R)\ge f(L+1,R)\)。则对于 \(L\in [l_0,l]\),可以分成 \(3\) 个段:

  1. \(L\in [l_0,p_1]\) 时,\(pos_L < r\)。此时由于每个 \(L\) 都没有 \(R\) 从该等价类中删除,所以可以形成新的等价类 \((l_0,p_1,r,r_0)\)。
  2. \(L\in (p_1,p_2]\) 时,\(r \le pos_L < r_0\)。此时对每个 \(L\) 都形成一个新的等价类 \((L,L,r,pos_L)\)。
  3. \(L\in (p_2,l]\) 时,\(r_0 \le pos_L\)。此时由于每个 \(L\) 都完整地从该等价类中删除了,所以不需要再考虑形成新的等价类。

考虑这么划分后新的等价类数量。对于第 \(1\) 个段的情况,显然是 \(O(n)\) 的。对于第 \(2\) 个段的情况,看似每个 \(L\) 只会形成一个等价类,实则由于区间并不能保证被恰好一个等价类包含,所以并不是 \(O(n)\) 的。但注意到有交的等价类对应 \(f\) 值一定相同,所以可以对每个 \(L\) 直接维护 \(r\) 的最小值 \(r_{\min}\),让 \((L,L,r_{\min},pos_L)\) 成为一个新的等价类。这样数量就也是 \(O(n)\) 的了。总等价类数量 \(O(n)\)。

对于区间 \(\min\) 的等价类是同理的,那么最终等价类数量就是 \(O(n)\) 级别的。

至此得到 \(O(n)\) 个形如 \((l_0,l,r,r_0,v)\),其中 \(v\) 为该等价类表示的区间 \(\min\) 或 \(\text{mex}\) 值作为 \(val\) 下标时对应的值。那么一个等价类 \((l_0,l,r,r_0,v)\) 会对长度在 \([\max(1,r-l+1),r_0-l_0+1]\) 的询问都贡献一个 \(v\)。那么使用 set 简单维护最长连续段即可。

对于找所有极小区间,方式不唯一,这里不再介绍(std 给的做法是可持久化线段树,但可以不使用超纲算法,比如扫描线)。整体时间复杂度 \(O(n\log n)\)。

验题题解

你注意到 \(val\) 的限制是很强的,只能考虑暴力维护连续段。

考虑前面部分,你发现随区间长度增大 \(\min\) 递减 \(\operatorname{mex}\) 递增,所以可以考虑扫描线然后维护分界点,你注意到这个分界点也是单调右移的。 考虑深挖 \(\operatorname{mex}\) 性质,经典地,极小 \(\operatorname{mex}\) 区间只有 \(O(n)\) 个,找出它们后就可以得到 \(O(n)\) 个扫描线区间覆盖操作维护 \(\operatorname{mex}\)。类似地 \(\min\) 的维护可以单调栈变为 \(O(n)\) 个区间覆盖。

考虑得到上述所有操作后进行扫描线维护分界点,用两个 set 维护分界点前后的连续段,分界点移动就加入单点,区间覆盖只执行分界点一侧的部分即可。考虑区间覆盖作用,相当于给长度在一个范围内的统一增添一个值,同时一个区间若不被操作则 \(r\) 每增 \(1\) 其会给长度自增 \(1\) 并贡献其值,考虑维护每段的出现时间然后在其消失时统一处理这一部分贡献,也是一个区间加值。 那么现在就是若干个区间加点维护连续段,扫描线 set 即可。

posted @ 2026-02-11 21:56  harmis_yz  阅读(26)  评论(0)    收藏  举报