LOADING

加载过慢请开启缓存 浏览器默认开启

建议搭配 steam++ 食用更佳

Revethere の Blog

Bidirectional Edge Without Loop

『做题记录』Test 7.12

做题记录 2023/7/13

Bajka

题面

Fabijian 有两个字符串 , $afraid$ 和 $like$ .

将 $like$ 重构得到 $s$ 使其等于 $afraid$ , 有以下 2 中操作 :

1 . ( 如果有的话 ) 向左或向右移动 1 个字符 , 将移动后的字符添加到 $s$ 的末尾 .

2 . ( 如果有的话 ) 移动到与当前字符相同的字符上 , 无添加操作 .

每次移动的代价为两个字符的距离 , 总代价为 $cost$ .

最小化 $cost$ .

解题思路

显然的 $dp$ .

设 $dp_{i,j}$ 表示当前正在 $afraid$ 的第 $i$ 个位置 , 写下一个字符 $like_j$ 所需要的最小的代价 , 转移为 :

$$dp_{i,j} = \min{dp_{k,j - 1} + c}$$

在这种情况操作 2 是极为耗费时间的 , 显然不优 , 新的转移 :

1 . $dp_{i,j}$ 尝试向 $dp_{i \pm 1,j + 1}$ 转移 , 其中 $afraid_{i \pm 1} = like_{j + 1}$ .

2 . 从 $dp_{i,j}$ 向 $dp_{k,j}$ 转移 , 其中 $afraid_j = afraid_k$ . 前缀和优化到 $O(m)$ .

复杂度 $O(nm)$ .


$\text{序列修改}$

题面

有一个序列 $a$ , 定义其频度序列 $c$ , 其中 $c_i$ 表示 $a_1$ 至 $a_i$ 中不同数的个数 .

修改 $a$ 中的元素的代价为修改前后的差的绝对值 , 记为 $cost$ .

最小化 $cost + \sum_{i = 1} ^ {n} i \times c_i$

解题思路

每个数字的只有第一次出现时会对 $c_i$ 产生贡献 , 设 $i$ , $j$ 分别为 $a_i$ , $a_j$ 分别第一次出现的位置 , $k$ 为 $a_i$ 下一次出现的位置 , $S_i$ = $\sum_{j = i}^{n} j$ .

分类讨论 :

能够产生贡献的只有 $2$ 种情况 .

1 . $i > j$ , 新增的 $cost$ 为 $\lvert a_i - a_j \rvert - S_i + S_k$ , 用 $set$ 找到 $a_i$ 前最近的 $a_j$ .

2 . $i < j \ and \ j < k$ , 新增的 $cost$ 为 $\lvert a_i - a_j \rvert + S_i - S_j$ . 再次分类讨论 :

  • $a_i > a_j$ : 代价为 $(S_k + a_i)$ - $(S_j + a_j)$ .
  • $a_i < a_j$ : 代价为 $(S_k - a_j)$ - $(S_j - a_j)$ .

树状数组维护 .

复杂度 $O(n \log n)$

阅读全文

『做题记录』Test 7.10

做题记录 2023/7/11

城市天际线

题面

构造一个有 $n$ 个点 $m$ 条边的简单有向图 , 恰好有 $X$ 个 SCC ( 强连通分量 ) . $q$ 个限制每个限制要求 $2$ 个点 ( $a_u$ , $a_v$ ) 在同一 SCC .

$\text{解题思路}$

用并查集维护 ( $a_u$ , $a_v$ ) 的限制 . 设连通块按大小排序为 $s_1$ , $s_2$ . . . $s_k$ , 当 $k > X$ 时无解 . 否则将最大的 $X - k + 1$ 个 SCC 合并 , 得到最多的边 . 设大小为 $t$ 的连通块的边的范围为 $[t,t(t - 1)]$ , 大小为 $x$ , $y$ 的连通块之间的边数为 $[0,xy]$ , 判断上下界 .


排列

题面

定义 $f(n)$ 的值为满足下列长度为 $n$ 的排列 $p$ 的个数 :

$$p_1 = 1 \land \forall i < n,\lvert a_i - a_{i + 1} \rvert \le 2$$

给定 $T$ 组询问 , 回答每个询问 $f(n)$ 的值 ( $mod\ 1e9 + 7$ ) .

求所有值的异或和 .

解题思路

$p_1 = 1$ , $p_2 \in {2,3}$ . 分类讨论 :

1 . $p_2 = 2$ , 方案数为 $f(n - 1)$ .

2 . $p_2 = 3$ :

  • $p_3 = 2$ , 必有 $p_4 = 4$ , 方案为 $f(n - 3)$ .
  • $p_3 = 5$ , 有且仅有唯一方案 $[1,3,5,7\ .\ .\ .\ 2k + 1,2k,2k - 1\ .\ .\ .\ 4,2]$ .

有 :

$$f(n) = f(n - 1) + f(n - 3) + 1$$

换元优化一下矩阵快速幂 .

阅读全文

『做题记录』Test 7.7

做题记录 2023/7/11

异或平方和

题面

定义 $b_{i,j}$ 为 $a_i$ 的二进制的第 $j$ 位的值 . $f_{i,j,k}$ 为 $a_i \oplus a_j$ 的第 $k$ 位的值 .

$$ans = \sum_{i = 1} ^ n \sum_{j = 1} ^ n(a_i \oplus a_j) ^ 2$$

$$= \sum_{i = 1} ^ n \sum_{j = 1} ^ n(\sum_{k = 1} ^ {L}(b_{i,k} \oplus b_{j,k})2 ^ k) ^ 2$$

$$= \sum_{i = 1} ^ n\sum_{j = 1} ^ n\sum_{k = 1} ^ L \sum_{l = 1}^L f_{i,j,k}f_{i,j,l}2 ^ {k + l}$$

$$= \sum_{k = 1}^{L} \sum_{l = 1}^L 2^{k + l} (\sum_{i = 1}^n \sum_{j = 1}^n[f_{i,j,k} = 1 \And f_{i,j,l} = 1])$$

设 $dp_{i,j,0 / 1,0 / 1}$ 表示第 $i$ 位和第 $j$ 位的数的数量 .

复杂度 $O(n \log^2 \lvert V \rvert)$ .

阅读全文

『杂项-OI』锐评某周冥师

杂项 2023/7/5

突破信息奥赛生的天花板

只能说不好评价 .

先是很多人引流某周发的这篇「文章」( 姑且叫它文章吧 ) , 具体内容我不多说 , 没看的自己去看一下 . 于是很多人都看到了 .

如果某些家长 完全不了解OI 那这篇文章可能还有点「威慑力」 .

但对于大部分 OIer 来说 , 简直是一派胡言 .

不过太大必要去骂 , 营销号嘛 , 就当是 joker 就 ok $👎$ .

接下来一起一段一段地来看某周笑话 .

阅读全文

『小祭巧』什么是 FastIO , 我说...

小祭巧 2023/6/30

必要性

总所周知 , 在毒瘤大数据面前 , scanf/printf 很慢 , cin/cout 更慢 . 所以目前有两种主流的快读快写 , getchar/putchar ( putchar 有时甚至不如 printf ) 和 解绑 ios .

至于 cin/cout ( 不解绑的情况下 ) 为什么慢 , 这里不多阐述 ( 也相信你点进来不是为了这个 ) .

顺便一提 , 在某些评测姬上 , 解绑 cin/cout 特别能吃 $buff$ , 在处理字符上比 fread/fwrite 快了不知道多少 . $→$ 刷题时 $2e7$ 范围的字符 , $T$ 了三个点 , 后来才发现是 fread/fwrite慢啦 !

阅读全文

『杂项-OI』码风习惯分享

杂项 2023/6/20

$\text{前言}$

在刷题的过程中 , 我们会见到各式各样的码风 . 当然不乏有些「非主流」( 个人认为 , 不喜勿喷 ) :

比如极为玄学的 $3$ 格缩进 ( 但是我有时候感觉还挺好看的 ( 雾 , 以及看半天看不到一个空格分开语句 / 表达式的「紧凑代码」 , 还有从 $a$ 命名到 $z$ 的「屎山代码」( “屎山” 其实有很多方面 , 只是这点我很不能忍受 ) .

当然 , 码风习惯因人而异 , 自己觉得好看的码风或许在别人眼中十分另类 .

所以我的码风如果有不满意的地方别乱喷 . ( 😖

阅读全文

『Travel』SH 游记

Travel 2023/6/4

很久很久没出去旅游过了 , 浅浅发个游记记录一下 .

☆*: .。. o(≧▽≦)o .。.:*☆

阅读全文

『做题记录』Atcoder Beginner Contest 151

E Max-Min Sums

题面

给一个整数集合 $A$ , $\lvert A \rvert = n$ 和一个整数 $k$ .

求 :

$$\sum_{S \in A} [ \lvert S \rvert = k]\ f(s)$$

并对 $10^9 + 7$ 取模 .

其中 , $f(x) = \max_{x \in S} - \min_{x \in S}$

解题思路

最暴力的方法就是枚举 $C_n^k$ 元素个数为 $k$ 的子集 , 然后找 $\max$ 和 $\min$ , 复杂度爆炸 .

考虑集合的无序性 . 将集合中的元素从小到大排序 , 然后计算每个数可能子多少个子集中成为最大值 / 最小值 .

考虑如何统计作为子集中最大值的次数 :

对于前 $k - 1$ 个数 , 不可能成为任何子集的最大值 . 对于其它的数 , 第 $i$ 个数成为最大值的可能有 $C_{i - 1}^{k - 1}$ 种 , 即在前 $i - 1$ 个数中选 $k - 1$ 个数 , 与第 $i$ 个数构成子集 , 使其成为最大值 .

对于最小值 , 同理 .

记得用逆元 .

阅读全文
1 2 3 4
avatar
Revethere

悲观的乐观主义者
处于卷与摆烂之间