zoukankan      html  css  js  c++  java
  • 2022 LOJ 随机做题随笔

    怎么这个坑王第一个坑还没开始填就挖第二个

    某个人立下了今年 LOJ AC 数超过 vjudge 的目标,然后他随便记一下在 LOJ 写的题

    Tag & Difficulty
    Sol

    01.02

    3571

    Tag & Difficulty Tag: dp, observation | Difficulty: 2300
    Sol 一个朴素的 dp 是 $f_{i,j,k}$ 表示选择按照 ddl 排序在 i 个及其之后选物品,在第 i 个物品的 ddl 及之前还有 j 个空位能买东西,所有这样的方案中第 k 大答案。

    显然这是 \(O(n^2k)\) 的,但是这个过程中真正贡献到 \(f_{1,x,x}\) 的有效转移显然不会超过 \(O(nk)\)。可以用一些技巧只算出这 \(O(nk)\) 个状态。

    具体地,考虑一个个求出 \(f_{1,x,1 \sim k}\)。假设现在在求 \(f_{1,x,r}\),而 \(f_{1,x}\)\(f_{2,y}\)\(f_{2,z}\) 转移过来(一个是不选这个物品,一个是选这个物品)。那么 \(f_{1,x,1 \sim r-1}\) 会从 \(f_{2,y}\) 的一个前缀和 \(f_{2,z}\) 的一个前缀转移过来,不妨假设从 \(f_{2,y,pre_y}\)\(f_{2,z,pre_z}\)。那么 \(f_{1,x,r}\) 可以从 \(f_{2,y,pre_y+1}\)\(f_{2,z,pre_z+1}\) 中选优的那个转移。如果这两个中有一个没算就递归进去算。在算完 \(f_{1,x,r}\) 之后,如果其选择从 \(y\) 转移则 \(pre_y \leftarrow pre_y+1\),否则 \(pre_z \leftarrow pre_z+1\)。先把 \(f_{i,j,1}\) 算好,对于每个 \(f_{i,j}\) 都弄个这样的 \(pre_y,pre_z\),然后可以发现在 \(f_{1,x,1\sim r-1}\) 都算完的时候算 \(f_{1,x,r}\) 只会需要额外算 \(O(n)\) 个值,这样复杂度优化到了 O(n^2+nk)。

    3570

    Tag & Difficulty Tag: ds, greedy | Difficulty: 2000
    Sol 对每个左端点 $l$ 用各种各样的数据结构算出能够到达的最远的右端点 $p_l$,然后连边 $l \to p_l+1$,每次询问就是问 $l$ 到 $r+1$ 要跳多少步,离弦之后并查集搞搞。

    01.03

    527

    Tag & Difficulty Tag: ds | Difficulty: 2200
    Sol 左转 JOI 2015 Final T5

    枚举左上角和右下角,它们要在同一个左上-右下对角线上。于是直接枚举这个对角线,对于对角线上的每个点设 \(down_i\) 表示其向右和向下伸展的长度的最小值,\(up_i\) 表示其向左和向上伸展的长度的最小值,那么对于第 \(x\) 行和第 \(y(x<y)\) 行的两个点,能框出一个正方形当且仅当 \(\min(down_x,up_y) \geq y-x\),扫描线树状数组搞搞即可

    524

    Tag & Difficulty Tag: game, observation | Difficulty: 1500
    Sol 如果有 X 而且长度不为 1,最后一个填数的人一定可以控制逆序对的奇偶。所以只需要算算没有 X 的情况下逆序对个数即可

    569

    Tag & Difficulty Tag: graph matching, observation | Difficulty: 1800
    Sol 考虑一下最优解的矩形结构是什么样的。如果矩形里面有 2 那么把这个矩形缩小成一个 2 显然更优,否则一定是等量的 1 和 3,此时一定会有一个 1 和一个 3 相邻,把矩形缩小到这两个更优。所以最后一个矩形要么套一个 2,要么套一对 13。前者直接算,后者二分图匹配。

    01.04

    502

    Tag & Difficulty Tag: hashing, randomization | Difficulty: 2600(因为不会随机化所以可能评分虚高)
    Sol 显然主席树是不行的。为了保证时空效率,每个点从父亲得到的信息必定是压缩过的,同时值域还不太大,所以可以考虑整点哈希和随机化乱搞。

    具体地,设 \(p_i\) 表示二进制第 \(i\) 位为 1 的所有颜色出现次数和,再记一下每个点深度。这样所有颜色都是三的倍数的必要条件是每个 \(p_i\) 都是三的倍数,而恰有一个不是三的倍数的必要条件是深度不是三的倍数且每个 \(p_i\) 要么是三的倍数,要么与深度模三同余。同时我们还可以通过这样的信息还原出唯一的那个出现次数可能不是三的倍数的颜色。

    这显然是可以卡的所以再整点随机:给每种颜色随机 \(k\) 个 01 权值,然后设 \(q_i\) 表示第 \(i\) 个权值是 1 的所有颜色出现次数和,然后利用额外的 \(k\) 个值对上面得到的结果进行验证。感觉错解找不出的概率是 \(\frac{1}{3^k}\)。因为只需要记录每个值模三的结果所以可以压在一个 long long 里面,我比较偷懒就压在了个 64 位 bitset 里面,可能会慢点。

    01.05

    2730

    Tag & Difficulty Tag: constructive, observation | Difficulty: 2100
    Sol 最近想的一个做法。很久以前想的那个做法我觉得比较神秘。

    假如说你已经知道第一张卡牌是最难记的那张,拿那张去比其他就可以直接知道答案了。所以一个想法是去找到这个 max。

    考虑一张一张扫并维护每次扫到的 max。具体地,维护一个集合 \(S\),其大小可能为 2 或 3(3 是一种特殊情况),还有一个值 \(v\) 表示 \(S\) 中最好记的值是多少。保证 \(S\) 中有至多一张卡牌值不是 \(v\)。初始 \(S\) 就是前两张,\(v\) 一次询问即可。

    每次扫到新的卡牌 \(x\),将其和 \(S\) 中的两个元素 \(y,z\) 进行询问,得到两个值 \(u,w\)。分情况讨论:

    • 如果 \(u,w\) 相同,如果 \(u \neq v\) 那么一定是 \(x\) 最好记,而且它的答案已经出来了。把 \(x\) 丢掉考虑下一张卡牌
    • 如果 \(u,w,v\) 相同且 \(S\) 中恰好有两个元素,那么现在的情况就是 \(x,y,z\) 中恰好有两个 \(u\) 但是目前信息不能判定谁是,所以把 \(x\) 丢进 \(S\)。这里体现了为什么一定要维护大小为三的集合,且满足了上面的性质。
    • 如果 \(u,w,v\) 相同且 \(S\) 中恰好有三个元素,那么一定是 \(y,z\) 最好记且都是 \(v\),把它们删了然后把 \(x\) 丢进去更新 \(v\) 的值
    • 如果 \(u,w\) 不相同,那么其中一个一定是 \(v\),其对应的那个元素一定是 \(v\)。同时如果 \(S\) 的大小为三,没有询问的那个数也一定是 \(v\)。把它们删掉把 \(x\) 丢进去,更新 \(v\) 的值。

    最后 \(S\) 中剩下的两个元素就是最难记的。

    询问只会在加入每个元素时问两次、更新 \(v\) 时问一次,而且更新之后一定更难记,所以总次数 250。

    563

    Tag & Difficulty Tag: number theory | Difficulty: 2400
    Sol 因为每个元素在模意义下至多有一个逆元,所以设模 $m$ 下有逆元的个数为 $c(m)$,则 $f(G(m)) = 2^{\frac{c(m)}{2}}$。计算出 $c(m)$ 之后前缀和就可以了。

    首先有逆元的元素个数是 \(\varphi(m)\),还需要减去逆元是它本身的元素,不妨假设有一个这样的元素 \(x\)。将 \(m\) 分解质因数 \(m = \prod p_i^{c_i}\),那么在每一个模 \(p_i^{c_i}\) 的意义下有 \(x^2 \equiv 1(\bmod p_i^{c_i})\),即 \((x-1)(x+1) \equiv 0(\bmod p_i^{c_i})\)。当 \(p_i \neq 2\) 时,\(x-1\)\(x+1\) 至多有一个是 \(p_i\) 的倍数,所以 \(x = \pm 1\);当 \(p_i = 2\) 时,\(c_i = 1,2\) 特判,\(c_i \geq 3\) 时注意到 \(p_i+1\)\(p_i-1\) 要么都不是二的倍数,要么一个是二的倍数不是四的倍数,另一个没有限制。所以 \(x = \pm 1\) 以及 \(x = 2^{c_i-1} \pm 1\) 都是合法的。最后 CRT 求出逆元是本身的元素数量,将 2 单独考虑后也就是 \(2^{w(m)}\)。将 \(\varphi(m),w(m)\) 筛出即可。

    01.06

    566

    Tag & Difficulty Tag: binary search, greedy, convex optimization, graph | Difficulty: 3200
    Sol 开始一直在想枚举中位数然后一直想不出做法……

    对于 \(n\) 是奇数的情况,把绝对值拆掉,就相当于权值大的 \(\frac{n-1}{2}\) 条边正,权值小的 \(\frac{n-1}{2}\) 条边负,要求和最大。可以发现这个条件可以宽松为恰好 \(\frac{n-1}{2}\) 条边取负,因为取负的那些元素一定是权值最小的。所以每条边都创造一个边权相反数的副本,就是要求这 \(2m\) 条边有恰好 \(\frac{n-1}{2}\) 个副本的最大生成树。这里有一个结论是最大生成树关于副本数量是凸的,但我也不会证 ,直接用上可以得到一个 \(O(m \log w)\) 做法。

    对于 \(n\) 是偶数的情况,中间有一条边权值是 0,但你可以直接把这条边丢了,也就是找一个 \(n-2\) 个点的生成森林,因为本身树是联通的所以找到一个森林之后总是能找到一条边把它们联通。同时在这个情况下最优解也一定是选 \(\frac{n-2}{2}\) 大和 \(\frac{n-2}{2}\) 小,不会存在中间连出的一条边不是中位数的情况。

    551

    Tag & Difficulty Tag: constructive, brute force, observation, game | Difficulty: 2000(guess), 2600(prove)
    Sol 对于第一问,可以先尝试将问题规模缩小。考虑以下策略:无论 Ball 放在哪里,Alex 都放在它旁边,然后将放置的位置所在的行列删掉,变为一个 $n-1$ 的子问题,这个子问题里没有标记。如果这个子问题有必胜策略,那么 Alex 去玩这个子问题得到一个必胜局面,加上最开始放的这个标记合并起来就是原问题的必胜局面。然后写个暴力发现 $n \leq 3$ 的时候必败,$n=4$ 的时候必胜,这样 $n \geq 4$ 的时候就都胜利。

    对于第二问,Alex 的放置策略只取决于 Ball 的最后一次放置,这样策略可以被表示为一个 \(n \times n\) 个点的有向图,有边 \((x,y)\) 表示 Ball 选 \(x\) 之后 Alex 选 \(y\),那么 Alex 能做的就是选这个图,Ball 做的是根据这个图选每次的放置。首先图上显然不能有自环,同时如果图上存在长度等于二的简单路 \(x\to y \to z\),Ball 可以先选 \(y\) 再选 \(x\) 然后 Alex 就会放在已经有标记的 \(y\) 上。这意味着 Alex 选择的方案必须要是一个匹配。因而所有奇数 \(n\) 都是不合法的。

    此时可以更深入地想想方案需要满足的条件。为了保证每行每列都存在一个标记,Alex 的匹配方案必须要满足每行存在两个元素是匹配在一起的,每列同样。对于 \(n=4\) 来说,不能出现一行或者一列将元素全匹配完的情况,所以最终可以发现只有一种本质不同的匹配方法:第一行匹配 12,第二行匹配 23,第三行匹配 34,第四行匹配 41,剩下的空位给四列匹配。再写个暴力发现它是对的。这样的构造又为我们提供了缩小问题规模的方便:对于 \(n\) 来说,将前四行和前四列的子棋盘中匹配变成这个 \(n=4\) 的方案,下面的 \(n-4 \times n-4\) 的棋盘如果存在一个合法匹配,跟这个 \(4 \times 4\) 的棋盘拼起来可以得到合法方案。所以最后只需要 check 模 4 余 2 的最小解即可。对于 \(n=6\) 可以照猫画虎构造一个方案:第 \(i\) 行还是匹配 \(i\)\((i\bmod n)+1\),然后第 \(i\) 列剩下的 \(n-2\) 个进行一个相邻元素的匹配。跑个暴力发现还是对的,然后就做完了。

  • 相关阅读:
    Longest Consecutive Sequence 分类: Leetcode(线性表) 2015-02-04 09:54 55人阅读 评论(0) 收藏
    Median of Two Sorted Arrays 分类: Leetcode(线性表) 2015-02-04 09:05 54人阅读 评论(0) 收藏
    Python+Scrapy(完整包全安装过程) 分类: 安装配置说明 2015-02-02 21:29 108人阅读 评论(0) 收藏
    Remove Element 分类: Leetcode(线性表) 2015-01-29 10:47 55人阅读 评论(0) 收藏
    Search in Rotated Sorted Array 分类: Leetcode(线性表) 2015-01-29 10:23 58人阅读 评论(0) 收藏
    机器学习基础(四)LMS,代价函数的求解和概率意义 分类: 机器学习 2015-01-26 14:52 114人阅读 评论(0) 收藏
    机器学习基础(一)线性回归
    AcWing1341. 十三号星期五
    JavaWebServle执行流程解析
    AcWing 466. 回文日期
  • 原文地址:https://www.cnblogs.com/Itst/p/15772811.html
Copyright © 2011-2022 走看看