互测题选做 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!\) 变为偶数):
去掉 \(\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
这种多个限制的题一般要通过找性质统一一下:
- 一条路径的费用为边权和(\(s\ne t\) 时不需要再花费 \(c\))
- 路径不覆盖起点
- 没有被覆盖的城市花费 \(c\)
不难发现环和链的情况是等价的,而如果走出了 \(s\rightarrow\cdots\rightarrow x\rightarrow s\rightarrow t\) 的路径(先走环再走出去),可以改走 \(s\rightarrow x,s\rightarrow t\),覆盖情况相同但少走了一条边
如果只有一次询问,那么对任意两点连边权为 \(c\) 的边就转化为了最小费用路径覆盖(可重复覆盖点)。多组询问考虑把 \(n\) 次增广的费用存下来,每次增广的费用即多覆盖一个点的最小花费,把 \(>c\) 的改为花费 \(c\) 不覆盖即可
实现细节不赘述了
LG4240
式子很容易推到
\(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\) 是不合法的