多校A层冲刺NOIP2024模拟赛17

多校A层冲刺NOIP2024模拟赛17

T1、 网格

首先看上去很麻烦,但是最终所有的式子都可以写成 几个数的积相加的形式,那么我们只要处理 数(拼接起来)、 数的积 以及 积的和。

那么我们维护三个变量,第一个是 $ x $ ,表示最后一个积前面所有的数和 ,第二个是 $ y $ ,表示目前的积,第三个是 z ,表示前面的数的积乘上当前的数的积。

那么 $ f_{i,j,x/y/z} $ 表示 走到 $ (i,j) $ 这个位置所有情况的 x/y/z 的和。

那么对于每一种情况:

当他遇到一个 $ + $ 时: $ x = x + y , y = 1 , z = 0 $ 。

当他遇到一个 $ * $ 时: $ y = z , z = 0 $ 。

当他遇到一个 数字 $ k $ 时: $ z = z*10 + y * k $ 。

那么实际转移时,我们只要把 $ f_{i-1,j} 和 f_{i,j-1} $ 的情况转移到 $ (i,j) $ 上加起来就行了。

但是有一个细节,当遇到 $ + $ 时,会把 $ y $ 赋值为 1 ,但是实际转移时 $ f_{i,j} $ 考虑了走到 $ (i,j) $ 的所有情况,所以 $ y $ 应该赋值为 走到 $ (i,j) $ 的情况数。

T2、 矩形

赛时水过去了,后来把自己卡了。

说正解。

首先之前打过一个一样的题,但是那个数据范围很小,直接 $ O(x^2) $ 就能做,x是一共有多少列,但是这个的 $ n $ 是 2e5。

怎么优化呢,在 $ n^2 $ 暴力里,我们是对于每一列去和别的列求交,对于所有的列求交的时间复杂度 是 $ O(n) $ 的,那么想要卡满 $ n^2 $ 就得出一些 每列的点都很少,但是列比较多,比如一条直线,然后就死了。

我们想一下暴力的本质是什么,其实对于每两列求交就是再找他们有多少个共同的二元组 $ (x,y) $ ,每一个二元组都可以有 1 的 贡献。所以对于上面点很少的列,我们可以暴力求出他们的二元组,然后记下来,直接扫过去就行。

那就是把每列分为点多的和点少的。多少算多呢,自然想到根号分治,然后就做完了。

一些细节就是在匹配二元组的时候数组存不下,所以得开 map ,unordered_map很慢,用pbds的哈希表就行。还有一种方法,我们匹配二元组时可以枚举一维,然后直接开数组记另外一维,这样就快了。

T3、 集合

不会,run了

T4、 倒水

我要推博客了: G-数据结构-G

写这道题真的会豁然开朗好几次,我昨天豁然开朗了一晚上。

posted @ 2024-11-02 17:10  lzrG23  阅读(28)  评论(0编辑  收藏  举报