2022.7.27 闲话
吐槽
为啥我那个 Crosspain 题总被神秘乱搞日过去 .
为啥要骂造数据的,你行你造一个啊,我感觉造一个答案非 0 的都挺难 .
(见 Chapter 5)
这篇闲话下面的内容可能有点水了 qwq
《五年败北三年模拟》
Chapter 1 —— 分治的败北
平面最近点对。
先对 \(x\) 坐标排序,然后一个一个添加点,我们设置一个阈值 \(d\) 表示目前找到的最优解 .
开一个以 \(y\) 为关键字的 std :: set
,每次加入的时候,可以把与当前点横坐标差值超过 \(d\) 的先扔掉,然后暴力查询纵坐标差不超过 \(d\) 的点更新 \(d\) .
暴力最多查询 \(6\) 次,所以复杂度在于 std :: set
,于是 \(O(n\log n)\),同分治法 .
而且还好写……
Chapter 2 —— Hash 的败北
考虑一个问题:
子串 Hash
给一个字符串 \(S\),多组询问两个子串是否相等 .
众所周知 Hash 不是确定性算法我们很生气!!!并且题目名字一定和做法没有关系所以我们不 Hash .
但是直接做貌似很困难??
我们引入高科技!使用 Border Theory 中的 IPM(\(2|u|\ge|v|\) 的条件不难解决)即可单次 \(O(\log |S|)\) 解决 .
Hash 能干的最有用的事被干了。
Chapter 3 —— exCRT 的败北
考虑合并两个同余方程组:
首先答案肯定是 \(\bmod \operatorname{lcm}(n_1,n_2)\) 意义下的,问题就是要找 \(x\bmod \operatorname{lcm}(n_1,n_2)\) 是多少 .
我们考虑直接暴力,枚举所有满足第一个同余方程的 \(x\),然后一个一个判断是否满足第二个,这样就找到答案了 .
关于论证这个为什么不会被卡的见这里:中国剩余定理小记
Chapter 4 —— 高精快速幂的败北
以一道普及组题引入(accoders):
数的幂次
给两个整数 \(N\) 和 \(P\),\(1 \le N \le 10^9\),\(1 \le P \le 20000\) .
Python 是过不去的 = =
据 xrlong & GOD_hj 所说高精快速幂也过不去 .
我想普及组题怎么这么 NB 呢?
首先把 \(N,P\) 按权展开就得到两个多项式 \(f(10),g(10)\) .
于是 \(N^P=f(10)^{g(10)}=(f^g)(10)=(\exp(g\cdot \ln f))(10)\),直接算 ln/exp 即可 .
如果不满意还可以压位(\(10\) 改成 \(10^B\)).
但是我们忽略了一个问题,只有 \(N\) 末位是 \(1\) 时才能取 ln!
这个不难解决,先去掉末位的 \(0\),然后除一下最后乘回去就好了 .
选一个可爱的 NTT 模数大概就行了 .
但是我觉得 \(O(n^2)\) 暴力也没啥事 .
Chapter 5 —— AC 自动机的败北 & Hash 的反击
让我们看一道题:
令 \(S_0=\varnothing\),要求支持以下操作:
1 hoc s
,令 \(S_i=S_{hoc}\cup\{s\}\),其中 \(s\) 是字符串(保证操作前 \(s\notin S_{hoc}\)) .2 hoc s
,令 \(S_i=S_{hoc}\),并查询 \(S_i\) 中的所有字符串在给出的字符串 \(s\) 中出现的次数之和 .
用 std :: set
记录一下每次询问后的字符串集,对于每个字符串只需记录其长度与 Hash 值 .
对于操作 1,直接计算字符串 \(s\) 的 Hash 值丢 set 里就好了 .
对于操作 2,则直接遍历容器中的元素,并枚举 \(s\) 的起始位置,用字符串 Hash 的前缀和快速算出这一个子串的 Hash 值 . 若相等,则答案加一 .
用 set 的同时记录一下这种串的个数即可冲过去,\(O(q^2)\) 啊!\(n^2\) 过 50w 什么操作???
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16526657.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ