互测题选做 II

source: hzoi


2.17 gjy

CF464E

dij 中需要对距离进行 \(m\)+\(m\log m\) 次比较。暴力高精复杂度 \(O(xm\log(n+m))\)

正解需要利用边权均为 \(2\) 的次幂,使用二进制表示 dis,那么每次 + 只会将一段连续的 \(1\) 改为 \(0\),一个 \(0\) 改为 \(1\),考虑主席树维护 dis

  • +:线段树二分找到连续的 \(1\) 改为 \(0\)(可以预先建一棵表示 \(0\) 的主席树,修改某个区间时只需要将它改为 \(0\) 树上对应区间的结点)
  • 比较:线段树二分找到最高的不同二进制位比较(配合哈希)

时间复杂度 \(O(m\log m\log x)\)

看题解才想起来高一联赛前见过这个套路(并且有学长考场上写出了),然而我现在还不会。。。做法很基础, 但需要对算法本质的理解

CF1622F

写个暴力猜想答案 \(\ge n-3\),证明考虑 \(n\) 为偶数(若为奇数则去掉 \(n!\) 变为偶数):

\[\prod_{i=1}^{n}i!=\prod_{i=1}^{\frac{n}{2}}(2i-1)!(2i)! \\ =2^{\frac{n}{2}}\frac{n}{2}!(\prod_{i=1}^{\frac{n}{2}}(2i-1)!)^{2} \]

去掉 \(\frac{n}{2}!\),根据 \(\frac{n}{2}\) 的奇偶决定是否去掉 \(2!\)

然后只需要考虑是否存在大小为 \(n,n-1,n-2\) 的答案。从平方因子角度考虑,不难想到开 bitset 维护 \(i!\) 中某个质数是否出现奇数次,去掉 \(i!\) 相当于异或上它的 bitset,可以在时空 \(O(\frac{n^{2}}{\omega\ln n})\) 下完成。正解考虑哈希,对每个质数赋随机权值,把 bitset 改为出现奇数次质数的权值异或即可。

正确率,注意随机权值应在 ull 范围内。精细实现一下可以做到 \(O(n)\),不过意义不大

若干 bitset 异或判 \(0\) 可以对元素赋随机权值再异或

CF1119H

2.19 cbx

bzoj3691

这种多个限制的题一般要通过找性质统一一下:

  1. 一条路径的费用为边权和(\(s\ne t\) 时不需要再花费 \(c\)
  2. 路径不覆盖起点
  3. 没有被覆盖的城市花费 \(c\)

不难发现环和链的情况是等价的,而如果走出了 \(s\rightarrow\cdots\rightarrow x\rightarrow s\rightarrow t\) 的路径(先走环再走出去),可以改走 \(s\rightarrow x,s\rightarrow t\),覆盖情况相同但少走了一条边

如果只有一次询问,那么对任意两点连边权为 \(c\) 的边就转化为了最小费用路径覆盖(可重复覆盖点)。多组询问考虑把 \(n\) 次增广的费用存下来,每次增广的费用即多覆盖一个点的最小花费,把 \(>c\) 的改为花费 \(c\) 不覆盖即可

实现细节不赘述了

LG4240

式子很容易推到

\[s(n/t,m/t,n)=\sum_{t=1}^{n}f(t)g(t,n/t)g(t,m/t) \\ f(x)=\sum_{d|x}\frac{d}{\varphi(d)}\mu(\frac{x}{d}) \\ g(y,x)=\sum_{i=1}^{x}\varphi(iy) \]

\(f,g\) 可以预处理,但 \(s\) 不行,也很难按套路整除分块。考虑根号分治,预处理 \(s(B,B,n)\),对于 \(n/t\le B\)\(t\) 整除分块, \(n/t>B\) 的暴力。\(B\)\(40\) 左右最快。注意实现的时候 \(g,s\) 的最后一维应动态开

以往做数学题只关注了式子,这题很好的提醒我们同样要思考实现

LG5046

大常数选手实锤,所有卡常题都能精准卡掉我。。。

考场上不会计算散块间的贡献,只能做到 \(O(n\sqrt{n\log n})\)。正解是对每个块预排序,这样可以 \(O(B)\) 得到排好序的散块,归并排序即可

2.2 yzf

CC ANDOFMAXES

显然从高到低按位贪心,考虑 check 当前答案 \(x\) 是否合法

问题变为能否把序列划分成 \(m\) 段,每段最大值均满足 (a[i]&x)==x。只考虑这些位置,记每个数前后第一个比他大的数为 \(pre[i],suf[i]\),则 \(i\) 能作为最大值的区间为 \((pre[i],suf[i])\)

考虑 dp,设 \(f[i]\) 为前 \(i\) 个数最多能分多少段,那么以 \(i\) 作为最大值,可以将 \(\max_{j=pre[i]}^{i-1}\{f[j]\}+1\) 转移到 \([i,suf[i]-1]\),容易用线段树优化。最后判断 \(f[n]\) 是否 \(>m\) 即可

& 有关的问题可以通过判断是否是答案子集来贪心
与区间最值有关的 dp 可以枚举当前区间最值的位置,转移为从前面一段区间到后面一个区间

ARC104E

\(n\) 很小,可以枚举每个数离散化后的结果(最多 \(4683\) 种),不影响计算 LIS

剩下的问题为给定每个数的取值范围、大小关系,求合法取值的方案数。考虑从小到大 dp。将取值范围离散化后会形成若干个区间,设 \(f[i,j]\) 为前 \(i\) 个数取值为前 \(j\) 个区间的方案数,枚举当前区间填几个数即可乘组合数转移,时间复杂度 \(O(n^{3})\),不过 \(O(n^{4})\) 也足以通过本题

CF1598G

显然不能暴力高精加,不难想到判断模大质数后是否相等来判断给定区间是否合法(相当于 \(base=10\) 的哈希)

由于 \(s,t\) 中不可能有 \(0\),因此两数相加最多进 \(1\) 位,两数的长度要么都为 \(|t|-1\),要么有一个为 \(|t|\)

第二种情况可以枚举 \(l_{1}\),那么 \(lcp(s[l1:],t)\) 在相加后不会改变,因此 \(r_{2}-l_{2}+1=|t|-lcp(s[l1:],t)\)\(|t|-lcp(s[l1:],t)\),这样只需要判断 \(O(n)\) 个区间,使用 Z-function 即可做到时间复杂度 \(O(n)\)

注意不能有空串,以及 CF 上卡了很多常见模数

题。是否存在 \(0\) 可能会带来很大影响

2.24 zwmy

题很难但数据很水,于是变成了乱搞场

CF718E

下称「走」为经过 \(|i-j|=1\) 的边,「跳」为经过 \(s_{i}=s_{j}\) 的边

赛时保证数据随机,根据大样例猜测直径是 \(3\)。考虑用所有点对减去最小距离为 \(1,2\) 的,后者可以分两条边的种类计算,时刻注意不要算重

原题考虑直径 \(\le15\)(每中颜色最多出现两次),对于 \(|i-j|\le15\) 的暴力,那么剩下的点对间最短路上至少要跳一次

颜色很少,可以预处理 \(f[i,j]\) 表示点 \(i\) 到颜色 \(j\) 任意一点的最短路,那么两点间最短路可以写作 \(\min(f[i,k]+f[j,k]+1)\)(在颜色 \(k\) 上跳一下)

目前有两个想法:枚举 \(j\) 得到 \(f[j]\),没有优化空间;枚举 \(f[j]\) 得到 \(j\)(状态 \((i,a)\) 表示颜色为 \(i\)\(f[j]\) 状压为 \(8\)\(16\) 进制数 \(a\),枚举状态用桶统计有多少个 \(j\)),需要枚举 \(8\times16^{8}\) 才能确定 \(j\),不过可以优化

\(g[i,j]\) 表示颜色 \(i\) 到颜色 \(j\) 的最短路,那么 \(f[i,j]-g[s_{i},j]\in\{0,1\}\),改为状压 \(f[i,j]-g[s_{i},j]\) 即可把枚举量降到了 \(8\times2^{8}\)

实现上可以 bfs 预处理 \(f,g\),预处理 \(dp[i,a,j,b]\) 表示状态 \((i,a)\) 转移到 \((j,b)\) 的最短路。时间复杂度 \(O(2^{11}n)\)

CF303D

循环排列与无限循环小数有一定关系:循环节长度为 \(l\) 的无限循环小数,乘 \(10^{0}\cdots10^{l-1}\) 得到的数,其小数部分的前 \(l\) 位为循环节,从这个角度考虑

设这个数各数位为 \(a_{1}\sim a_{n}\)\(\overline{0.a_{1}a_{2}\cdots a_{n}a_{1}a_{2}\cdots}=\frac{q}{p},\gcd(q,p)=1\),记 \(f(x)\) 为数 \(x\) 的小数部分

根据题目定义,有 \(\{f(\frac{iq}{p})\mid 1\le i\le n\}=\{f(\frac{b^{i}q}{p})\mid 0\le i<n\}\),由于 \(f(\frac{a}{p})=f(\frac{b}{p})\iff \frac{a}{p}-\frac{b}{p}\in\mathbb{Z}\iff a\equiv b\pmod p\),再同乘 \(q^{-1}\) 可得 \(\{1,2,\cdots,n\}\equiv\{1,b,\cdots,b^{n-1}\}\equiv\{b^{i},b^{i+1},\cdots,b^{i+n-1}\}\pmod p\)

因此 \(\exist i,b^{i}\equiv2\pmod p\)\(\{1,2,\cdots,n\}\equiv\{2,2b,\cdots,2b^{n-1}\}\equiv\{2,4,\cdots,2n\}\)

\(\frac{iq}{p}\) 为无限循环小数,所以有 \(p>n\)。去掉相同项后分类讨论:

  • \(n\text{ is odd}\)\(\{1,3,\cdots,n\}\equiv\{n+1,n+3,\cdots,2n\}\Rightarrow p<n+1\),与 \(p>n\) 矛盾
  • \(n\text{ is even}\)\(\{1,3,\cdots,n-1\}\equiv\{n+2,\cdots,2n\}\Rightarrow p<n+2\),因此 \(p=n+1\)

因为 \(\{1,2,\cdots,n\}\equiv\{b^{1},b^{2},\cdots,b^{p-1}\}\)\(b\)\(p\) 的原根,所以 \(\varphi(p)=p-1,p\in\mathbb{P}\)

然后就可以得出做法了:若 \(p\not\in\mathbb{P}\) 则无解;否则从大到小枚举 \(b\)(只需要枚举 \(p\) 次),判断 \(b\) 是否是 \(p\) 的原根,注意 \(b=1\) 是不合法的

posted @ 2022-02-17 17:55  401rk8  阅读(31)  评论(0编辑  收藏  举报