https://www.gravatar.com/avatar/4d675e65920d5b1eca1f5b9079ea3bf5?s=240&d=mp

Ramen's Box

Hackergame 2021 Writeups

久仰 Hackergame 大名,虽然今年是预定摸了的,但是有个朋友拉我来打,打着打着我自己上头了,也就认真搞了。

CTF noob 第一次打相关类型的比赛,幸好运气好拿到了 67 名的好成绩(至少对我这个水平来说)。学到很多东西,跟算法竞赛的体验还是不一样的,以后有时间可以多打。

Rust 的包装类型

对于一门对内存控制足够精细的语言来说,值类型与引用类型的区别是十分重要的:值类型通常意味着较低的拷贝成本,通常来说,这样的类型被分配在栈上(当然,对于 C/C++ 来说,我们可以在堆上直接分配一个值类型对象,如 int),而引用类型则通常分配在堆上,我们需要用一个包装过的对象去维护。

在 Rust 中,值类型和引用类型的界限在语言上提供了很明确的区分,而为了避免 C/C++ 中用户可以不受限制使用裸指针的情况,Rust 将很多裸指针操作都包在了 unsafe 块内,用户使用时必须对这种行为有足够的认知。当然,当用户需要使用指针,或者说引用类型的时候,Rust 也提供了 7 种包装类型来帮助用户更好的管理堆上的内存。

然而,Rust 官方教程和文档对这 7 种包装类型的介绍有很多容易混淆之处,同时网上的很多文章也已经完全脱离了最新版 Rust 的功能描述(如很多文章仍然描述 Cell 只接受实现了 Copy 的类型),导致很多初学者学习时容易产生迷惑和误用。这篇文章是我在复习 Rust 时重新学习包装类型相关时做出的笔记,希望能更好的帮助大家理解 Rust 的包装类型。

本文写作时的 Rust 版本为 Stable Channel 1.48.0。

Educational DP 题解

这篇文章已经咕了一年了,原先的前言已经完全脱离时代了,在第一版到最终成文的期间过去了很多事情,趁现在毕业前夕有点时间迅速把坑给填了,也算是给大学和竞赛生涯画个句号吧。

这次的刷题对象是 AtCoder 的 Educational DP Round。从简单到困难的问题都有,倒挺适合我这种不会 DP 的人的。

我的题解习惯是不贴代码的,所以下面所有的都是关于题目的讲解和方程的推导,要看代码参考Github或者提交页面