模拟赛10.11 解题报告
T1 染色
题意:给出 \(n\),造 \(n\) 个 \(\ge1\) 的数 \(a_{1...n}\),满足对于任意 \(1\le i<j\le n\),若 \(j-i\) 为质数,那么 \(a_i\not =a_j\),最小化 \(\max\limits_{1\le i\le n}\{a_i\}\)。
我们通过爆搜发现对于 \(\ge 7\) 的 \(n\),答案始终为 \(4\),方案为 \(1,2,3,4,1,2,3,4,1,...\),不难发现这种方案是正确的,因为没有质数是 \(4\) 的倍数。
由于样例直接给出 \(n=7\) 的情况,因此我们只需要大力分类 \(n=1,2,3,4,5,6\) 的情况,\(n\ge 7\) 直接输出即可。
T2 序列
题意:
\(1\le T\le 5,\space 1\le n\le10^9,\space 1\le k,m\le 2\times10^5,\space 1\le D\le10^{18},\space 1\le a_i\le 5000\)
考场写了一个错解。
枚举 \(\min b_i\),然后贪心分配剩下的。
但是会超时,感性认为这是一个单峰函数,考虑直接二分。
被卡 \(95pts\),听说三分可以过 \(100pts\),果然三分的容错率就是比二分高。
正解咕着。
T3 树上询问
题意:一棵树,\(q\) 次询问。每次给出 \(u,v\),求从 \(u\) 走到 \(v\),有多少个点满足 点的编号 \(=\) 走到这个点的步数。
一眼 \(\text{NOIP2016 TG}\) 天天爱跑步
考虑拆成 \(u\rightarrow lca,\space lca\rightarrow v\) 两部分。
对于第一部分,需满足 \(dep[u]-dep[x]=x\Rightarrow dep[x]+x=dep[u]\)。
对于第二部分,需满足 \(dep[u]+dep[x]-2\cdot dep[lca]=x \Rightarrow x-dep[x]=dep[u]-2\cdot dep[lca]\)
把询问标记放到 \(u,v,lca,fa(lca)\) 上,离线遍历一遍即可,时间复杂度为 \(O(n+q)\),可以选择性带 \(\log\)。
T4 莫队
题意:一个序列 \(a_{1...n}\),支持两种操作:
-
1 x y
修改 \(a_x\leftarrow y\)。 -
2 l r
查询 \([l,r]\) 有多少个子区间满足数字两两不同。
\(1\le n,q\le 2\times 10^5,\space 1\le a_i\le n\)
设 \(d_i\) 为上一个 \(=a_i\) 的数的位置。
设 \(p_i=\max\limits_{j\le i}\{d_j\}\),不难发现,当 \(i\) 作为右端点时,左端点可取 \([p_i+1,i]\),有 \(i-p_i\) 种方案。
对于每个询问 \([l,r]\),我们可以找出一个分界点 \(x\):
-
对于 \(1\le i\le x\),满足 \(p_i<l\)。
-
对于 \(x<i\le r\),满足 \(p_i\ge l\)。
第一部分的贡献为 \(\frac{(l+x)(x-l+1)}2\),只与 \(x\) 有关,容易处理。
第二部分的贡献为 \(\sum\limits_{i=x+1}^r (i-p_i)=\frac{(x+1+r)(r-x)}2-\sum\limits_{i=x+1}^r p_i\),我们还需要求出 \(x+1...r\) 的 \(p\) 的区间和。
现在有三个问题:
-
动态修改,动态维护 \(d_i\)。
-
快速找出分界点 \(x\)
-
快速查询 \(p\) 的区间和。
对于第一个问题,考虑在值域上搞,设 \(S_i\) 表示 \(a_j=i\) 的 \(j\) 的集合。
修改 \(a_x\leftarrow y\),我们需要在 \(S_{a_x}\) 中删除 \(x\),然后在 \(S_y\) 中插入 \(x\)。
删除 \(x\),我们找出 \(S_{a_x}\) 中 \(x\) 的后继 \(nxt\),那么修改 \(d_{nxt}\leftarrow d_x\)。
插入 \(x\) 后,找出 \(S_{y}\) 中 \(x\) 的前驱 \(pre\) 和后继 \(nxt\),那么修改 \(d_x\leftarrow pre\),\(d_{nxt}\leftarrow x\)。
可以用 \(\text{set}\),支持查找前驱后继。
对于第二个问题,我们考虑对 \(d_{1...n}\) 建立线段树,然后一段前缀 \(\max\) 对于一个 \(p_i\),可以在线段树上二分处理。
对于第三个问题,我们不禁想到经典题——Luogu4198 楼房重建,这里使用兔队线段树维护前缀最大值之和即可。
时间复杂度 \(O(n+q\log^2 n)\)。