【省选模拟】口胡

4.5

虚数之树

点分树维护路径,每个点开线段树维护编号区间(其实平衡树更好)

因为是求最短路径,有重叠一定不优,因此不用考虑去除点分树子树贡献

叮叮车

本质上是求 \(\max_{x=l}^{r},x+x\)\(7\) 进制下进位次数

\(l,r\) LCP 下一位为第 \(i\) 位,暴力是枚举 \(j\ge i\),将 \(r[i]-1\),低位全填 \(6\),可以通过。考虑贪心,找到从 \(i\) 开始的最长能进位连续段,\(j\) 为段内最低位(若 \(j=0\) 则答案就是 \(r\)

没有找到类似贪心,不过应该是对的(假了的话请在评论区告知)

4.4

俩构造一交互有点东西

交互

交互次数 \(2n\) 很有提示性,考虑笛卡尔树建树。使用单调栈维护右链,加入点 \(i\) 时栈内必然存在相邻点 \(u,v\) 满足 \(ls(i)=v\)\(i\) 在栈中的上一个元素是 \(u\)

剩下的问题是找到这个 \(u\)。不难发现此时 \(u\) 的子树不满而 \(v\) 的满了,据此判断是否继续弹栈即可

构图

考虑枚举 \(deg=k\) 的点数 \(x\),那么剩下 \(n-x\) 个点的度数和为 \(\max(kx,(k+1)(n-x)))\)(需要把 剩下 \(n-x\) 个点的度数和 \(-kx\) 补成偶数)

得到 \(x\) 后肯定是把这 \(kx\) 度数均分给 \(n-x\) 个点最优,随便模拟一下即可。瓶颈在于输出方案。

4.1

tree

\(s\)\(t\) 的链拎出来,记做 \(v_{1}\cdots v_{k}\),预处理 \(a[i]\) 表示从 \(v_i\) 出发不经过 \(v_{i-1},v_{i+1}\) 的最长路

一个错误想法是枚举 \(s\) 走到哪,然后 \(t\) 的最优决策即为后缀 \(\max\),取得分差的 \(\max\) 为答案。问题在于 \(s,t\) 是轮流走的,若 \(s\) 走过了中点到 \(v_{i}\)\(t\) 一定会选择走到 \(v_i\) 来迫使 \(s\) 提前拐弯

\(s,t\) 都在链上,只可能是 \((v_{i},v_{k-i+1})\)\((v_{i+1},v_{k-i+1})\),否则可以 \(O(1)\) 计算答案,因此状态数是 \(O(n)\) 的。考虑搜索,以轮到 \(s\) 走为例,\(dfs(i,j)\) 计算 \((v_{i},v_{j})\) 的答案,\(s\) 要么拐弯 \(a[i]-\max\{a[k]+j-k\}\) 要么向中间走 \(1+dfs(i+1,j)\),递归下去即可。需要维护 \(mx[j]=a[k]+j-k\),在 \((i+1,j)\) 的基础上对 \(a_{i+1}+j-(i+1)\)\(\max\) 即可

treecnt \(\star\)

3.26

答案 \(=\) 开灯数 \(-\) 相邻两个都开着的灯对数

根号分治。预处理任两大颜色之间的相邻灯对数,维护每个大颜色与多少个开着的小颜色邻,\(O(n\sqrt{n})\)

可以加强到树上

密室逃脱 \(\star\)

发现人的移动是可逆的,因此最终局面一定形成若干连通块,每个连通块中分成若干小段,每小段中至少有若干人,其余人可以随意移动,所以能到达每个房间的人数是固定的

\(f[i,j]\) 为第 \(i\) 个房间恰好有 \(j\) 人时前 \(i\) 个房间最多有多少人,同时要求 \(i\) 所在连通块中可以移动的人全在 \(i\),因此不存在从 \(i+1\) 移动到 \(i\) 的情况。转移:

  • \(j<a_{i}\)\(f[i,j]+k\rightarrow f[i+1,k](k<b_{i})\)\(i\)\(i+1\) 不连通);\(f[i,j]+b_{i}\rightarrow f[i,j+b_{i}]\)\(i+1\) 增加 \(b_i\) 个人开门)
  • \(a_{i}\le j<a_{i}+b_{i}\)\(f[i,j]\rightarrow f[i+1,j-a_{i}]\)(留下 \(a_i\) 个人开门)
  • \(j\ge a_{i}+b_{i}\)\(f[i,j]\rightarrow f[i+1,j]\)(全过去了)

数组第二维需要开到 \(2\times10^{4}\),因为这么多人一定能走到 \(0\)。时间复杂度 \(O(nm)\)

3.22

启程的日子

不妨令 \(n<m\),实现上若 \(n>m\)swap(n,m) 并标记,使用 write 函数输出一个矩阵,在该函数中判断是否有标记

可以粗略地构造出 \(=3\) 的方案:

  • \(+\):第一列为 \(1\),后面奇数行为 \(1\),偶数行为原矩阵
  • \(+\):第 \(m\) 列为 \(1\),前面偶数行为 \(1\),奇数行为原矩阵
  • \(-\):第一列、第 \(m\) 列为原矩阵取反,其余为 \(1\)

然后考虑需要特判的情况:

  • \(ans=0\):原矩阵中不存在 \(1\),但题目没有明确说明
  • \(ans=1\):原矩阵只有一个含 \(1\) 连通块
  • \(ans=2\):一定可以由相减得到。枚举原矩阵的极大 \(0\) 连通块作为减掉的矩阵,看该连通块是否与所有 \(1\) 连通块连通即可
  • \(n=1\):构造失效,答案显然是 \(\min(\) \(1\) 连通块数 \(,\) \(0\) 连通块数 \(+1)\)
  • \(n=m=2\):构造失效,但 \(ans\le2\),所以不需要特判

3.21

Board Game

\(O(nm2^{nm})\) 暴力:高维前缀和求出终止状态,然后博弈 DP

两部分转移类似,只考虑第一部分。设 \(g[s]\) 为 状态 \(s\) 是否是终止状态,其取值只有 \(0,1\),可以把前 \(nm-6\) 位相同的压到一个 ull 里:g[s] = f[s>>6] & 1<<(s&63)

\(f[s]\) 内部转移:枚举第 \(i\) 位,取出该位为 \(0\) 的位置集合 \(p[i]\),该位为 \(1\) 的位置集合即为 p[i]<<if[s] |= (f[s]&p[i]) << i\(O(6\times(2^{6}+2^{nm-6}))\)
\(f[s]\) 之间转移:\(O((nm-6)2^{nm-6})\) 暴力高维前缀和

Function Query

不妨令 \(x<y\)。首先 \(f\) 在递归过程中 \(x+y,\gcd(x,y)\) 为定值,所以 \(f(x,y)=f(\frac{x}{\gcd(x,y)},\frac{y}{\gcd(x,y)})\)。之后 \(x\bot y\),且 \(\gcd(2x,y-x)=2\)(若 \(\gcd\) 存在 \(>2\) 的质因子 \(d\),那么 \(d|x,d|(y-x)\Rightarrow d|y\),与 \(x\bot y\) 矛盾),再次除以 \(\gcd\) 得到 \(f(x,y)=f(x,\frac{y-x}{2})\),每次和除以 \(2\),直到 \(x=y=1\) 或死循环(初始 \(x+y\) 不为 \(2\) 的次幂)

总结一下,若 \(\frac{x+y}{\gcd(x,y)}=2^{k}\),则 \(f(x,y)=k\);否则 \(f(x,y)=0\)\(a\) 为排列,可以枚举 \(x\)\(x\) 的奇约数 \(d\),取 \(y=2^{k}d-x\)。当且仅当 \(d=\frac{\gcd(x,y)}{2^{i}}(2^{i}|\gcd(x,y),2^{i+1}\nmid\gcd(x,y))\) 时会枚举一次 \(y\) 且从 \(y\) 也可以枚举到 \(x\)

上述枚举过程时 \(O(n\log^{2}n)\) 的,不过只有不满 \(O(n\log n)\) 对合法的 \((x,y)\),直接做二维偏序即可

3.20

fwx,gjy,pyt

数据结构 \(\star\)

要求最浅的带权重心,该点子树的权值和一定 \(\ge\frac{1}{2}\) 总权值。用 DFS 序把数拍到序列上,序列的带权中心一定在树的带权重心子树内,向上倍增寻找即可

posted @ 2022-03-24 22:05  401rk8  阅读(54)  评论(0编辑  收藏  举报