【THUPC2021】鬼街

题意有点绕:一个是监控器监控房子的和是从头开始的和,不只是开始监控后增加的量。
首先一个显然的性质是每个数质因子个数\(\le 6\),预处理出每个数的质因子。
如果一个监控器只管一个数值的话,每个数值维护一个小根堆:里面存监控器。每次判断是否达到最小的监控器阈值。
如果监控的是\(cnt\)个数值,每个数值的总和大于\(sum\)则一定存在一个数值大于平均值\(\frac{sum}{cnt}\)
可以利用平均值的性质来优化复杂度,首先算法流程如下:
小根堆按平均值给监控器排序,每次判断如果达到则输出,否则将阈值减去所监控的所有数值,之后将数值清空,将每个数值结合新平均值加入堆中。
复杂度:\(O(6nlog_{\frac{6}{5}}nlog_2n)\)
写法:每个值对于不同的监控器清空的量是不同的,这里用\(del\)存储,再存一下每个值从开始到当前本身加了多少,取值的时候就差分一下即可。

[THUPC2021] 形式语言与自动机

考虑翻译题意(合法括号序只要满足任何前缀'('>=')'即可),对于\("uwv"\)

  • \(u\)任意前缀缩括号后不存在')'
  • \(v\)任意后缀缩括号后不存在'('
  • \(w\)中')'大于等于\(u\)中'('【剩下uw中的'('个数恰好等于v中的')'】

第一个条件即确定了\(l\)的范围,第二个条件对于每个\(r\)也限定了\(l\)的下界。
第三个条件即\(r+1\)后缀')'数量大于等于\(l\)前缀'('数量。
发现固定了\(r\),计数\(l\)本质上是二维数点问题,树状数组我们把它看为近似\(O(1)\)的。

[THUPC2021] 游戏

转化为二进制数位dp,要存达到上限的位,转移的时候只需要枚举这部分选的和剩下\(1\)的个数乘上组合数即可。
\(4^n\)被转化为枚举子集\(3^n\)

[THUPC2021] 混乱邪恶

一维上等概率往左/右随机走一步,走\(n\)步所在\([-k\sqrt{n},k\sqrt{n}]\)的概率极高。