简单题 2
联网
【HT-098-Rainbow】核桃彩虹周赛 T1。
思维:0。
代码:0。
题面
题目背景
为什么手机连不上网。
题目描述
小f 的手机里显示了 \(n\) 个网络,这些网络的名称都由小写字母 a 到 z 与 -5G 组成(保证 -5G 在出现的情况下只会是名称的结尾,且只会出现 \(1\) 次)。若一个网络以 -5G 结尾,则称它是 \(5G\) 网;否则不是。
已知小f 手机里这 \(n\) 个网络是按照字典序升序排序的,问:
- \(n\) 个网络中有多少个 \(5G\) 网。
- \(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]\) 有:
- \(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}\)。
- \(p_i <l\)。此时 \(l \to p_i\)。\(f_{i,l',r,x}\leftarrow f_{i-1,l,r,x}[l > l']\)。
- \(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\)。那么需要支持:
- 添加 \(x\)。求当前集合中元素 \(y\),满足 \(y \bmod x \le k1\) 与 \(x \bmod y \le k1\) 的数量。
- 删除 \(x\)。求当前集合中元素 \(y\),满足 \(y \bmod x \le k1\) 与 \(x \bmod y \le k1\) 的数量。
这两个本质等价。考虑根号分治。设闸值为 \(B\)。
- \(x\le B\)。那么在加入或删除元素是枚举 \(x\),提前计算对 \(x\) 的贡献。时间复杂度 \(O(nB)\)。
- \(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)\) 可能的最大值,分两种情况转移:
- \(i\in S\),则 \(i-1 \notin S\)。\(f_i \gets f_{i-2}+(D-p_x)\)。
- \(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\) 为最终答案。转移为:
- \(dp2_{i,\max(0,(D-p_i)-j)}\gets dp2_{i-1,j}\)。
- \(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)\)。转移为:
- \(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\) 也没有超过钦定值。
- \(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\) 是第一个超过钦定值的下标。
- \(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)\)。
有些部分可以前缀和优化。

浙公网安备 33010602011771号