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 的败北

考虑合并两个同余方程组:

\[\begin{cases}x\equiv a_1\pmod{n_1}\\x\equiv a_2\pmod{n_2}\end{cases} \]

首先答案肯定是 \(\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 的反击

让我们看一道题:

Crosspain

\(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 什么操作???

posted @ 2022-07-27 21:49  Jijidawang  阅读(125)  评论(5编辑  收藏  举报
😅​