基于 concept 的归并排序
摘要:
基于 concept 的归并排序 template <std::random_access_iterator RandomIter, std::random_access_iterator RandomTempIter, typename Comp> requires requires(Comp c
基于 concept 实现的 Binary Heap
摘要:
Binary Heap 一个基于 concept 的二叉堆板子实现。 template <typename Ty, typename Compare, typename Container = std::vector<Ty>> requires requires(Compare comp, Ty a
c++20 模板约束
摘要:
concept 在 c++20 中,提案许久的 concept 被加入到标准中了,这也意味着不用再写恼人的 SFINAE 了(除非你是一个受虐狂,喜欢对着一堆报错中找到错误的位置)。 c++20 之前 在 c++20 之前,如果需要对模板实参进行编译期检查,只能使用 SFINAE ,或者是部分使用
Copy and Swap
摘要:
Copy and Swap 在 c++ 中,什么是 copy and swap ? struct Foo { Foo() { std::cout << "Foo construct\n"; } Foo(const Foo &) { std::cout << "Foo copy construct\n
实现一个 std::optional
摘要:
实现一个 std::optional 如果写过 c# 或者是 rust ,那么对于里面的可空类型一定是很常用的。在 c++17 中添加了 std::optional ,也就是所谓的可空类型。 不过这里的实现是 placement new 的方式,也是位于栈上。 实现的主要点是申请一块内存空间,由于需
实现一个简单的 std::unique_ptr
摘要:
实现一个简单的 std::unique_ptr 简介 std::unique_ptr 是一个独占资源所有权的智能指针,通过 RAII 来自动管理资源的构造和析构。 在标准库中,std::unique_ptr 的通常实现是具有空基类优化。具体来讲,对于 std::unique_ptr 的删除器是其类型
c++ 中的左右值
摘要:
c++ 中的左右值 前言:最近又需要再次复习一下关于 c++ 中 lvaue 和 rvalue 相关的知识。 左值和右值 简单看 int a = 1; 这条语句,对于左边的 a ,我们是可以对其取地址的,而对于右边的 1 来说,我们无法对其去地址。 对于能够取地址的 a ,位于=左边,我们就将其称之
[MIT 6.S081] Lab: mmap
摘要:
Lab: mmap 在本次实验中,我们要实现的是一个比较简简单的 mmap 实现,将文件映射到内存中的某个块,并根据权限设置这块内存的行为,以及为其提供延迟分配策略。 mmap 对于将文件映射到内存,其实是先规划好一块区域给文件使用,为什么要提供延迟分配,是因为如果需要映射一个文件时,就规划好一块内
[MIT 6.S081] Lab: file system
摘要:
Lab: file system 在这个实现中我们将为 xv6 的文件系统实现二级间接块以支持大文件,与实现文件的软链接。 Large files 在该任务中,我们将为 xv6 的文件系统实现二级间接块,以支持大文件。对于这个功能,我们需要修改 struct inode 中 addr 字段的功能。
[MIT 6.S081] Lab: locks
摘要:
Lab: locks 在本次实验中依然是承接上次的实验,继续多线程编程的实践。 Memory allocator 在该任务中,要为每个 CPU 实现单独的内存空闲队列分配,在该分配方式下,若单个 CPU 的空闲队列内存不够,则需要从其他 CPU 拿走一些空闲内存。 转到 kernel/kalloc.
[MIT 6.S081] Lab: Multithreading
摘要:
Lab: Multithreading 在这个实验中主要是要熟悉一下多线程的一些东西,比如实现一个用户态线程,还有使用一些 api 。 Uthread: switching between threads 这个任务的主要目的是实现用户态线程的调度,不过这个用户态线程个人认为是有栈协程。在这个任务中,
[MIT 6.S081] Lab: Copy-on-Write Fork for xv6
摘要:
Lab: Copy-on-Write Fork for xv6 在这个实验中,我们要为 xv6 实现 cow fork 。 Implement copy-on write 根据写时复制的方式,我们在复制页面的时候应该采用的是将父级的物理页面映射到子级的页面,因此我们需要修改 kernel/vm.c
[MIT 6.S081] Lab: xv6 lazy page allocation
摘要:
Lab: xv6 lazy page allocation Eliminate allocation from sbrk() 这一步比较简单,直接在 sys_sbrk 中将分配内存改为对内存大小进行修改而不分配内存即可。 uint64 sys_sbrk(void) { int addr; int n
[MIT 6.S081] Lab: traps
摘要:
Lab: traps RISC-V assembly 在这个任务中我们需要观察 call.asm 汇编。 int g(int x) { 0: 1141 addi sp,sp,-16 2: e422 sd s0,8(sp) 4: 0800 addi s0,sp,16 return x+3; } 6:
[MIT 6.S081] Lab: page tables
摘要:
Lab: page tables 前言 这个实验比较困难(指单纯上机 22 个小时,还不断重复看一遍和调 bug ,以及重新配置环境等等),其中的第一个小实验是带一遍理解 RISC-V 中的 page table ,而第二个小实验则是为每个进程附加一个 kernel page table ,并为第三
[MIT 6.S081] Lab: system calls
摘要:
Lab: system calls 前言 这次实验是实现内核中的两个 syscall :trace 和 sysinfo 。 回顾一下第三节课,用户态的进程想要执行某个系统调用,例如 exex(init, argv) ,首先会将 init 和 argv 的地址分别存放在 a0 和 a1 寄存器中,然后
[MIT 6.S081] Lab: Xv6 and Unix utilities
摘要:
Lab: Xv6 and Unix utilities Grade sleep sleep 格式如下 sleep 5 这边需要使用 kernal/stat.h 中的 sleep 系统调用,并将参数转化为传入。 #include "kernel/types.h" #include "kernel/st
[操作系统] 打印进程树 pstree
摘要:
打印进程树 简介 这是 jyy 老师的操作系统课程的 M1 实验,为了弥补一些欠缺的操作系统相关的知识。在这里实现的的 pstree 并不是严格的按照实验要求而设计的(一个原因是按要求实现的代码不可以公开),这里会看到一些不一样的简单实现,比如直接运行,没有命令行可选参数,输出格式会有所不同,编程语
[题解] CF1790E - XOR Tree
摘要:
CF1790E - XOR Tree 题意 给定一颗无根树,在可以改变任意一个点的点权操作基础上,让树上任意简单路径的异或和不为 ,问最少需要多少次操作。 思路 假设某个点为根,设 为 点到根的树上前缀异或和, 为 的点权,则
[题解] CF1245D - Shichikuji and Power Grid
摘要:
CF1245D - Shichikuji and Power Grid 题目传送门 题意 在一个网格图中,有 个城市。目标是使得 个城市都通电。 对于一个城市有电,要么选择在其位置建立发电站,要么和另一个有电的城市连线。 对于城市 ,在其位置建立发电站的费用为 \
[题解] CF632F - Swimmers in the Pool
摘要:
CF632F - Swimmers in the Pool 题目传送门 题意 给定一个大小为 的矩阵 。假设 满足以下条件,那么称该矩阵为 MAGIC ,否则为 NOT MAGIC ,并输出对应的属性(即 是 MAGIC 还是 NOT
[题解] CF1003E - Tree Constructing
摘要:
CF1003E - Tree Constructing 题目传送门 知识点:贪心 题意 给定 个顶点,问是否能够构造出一棵直径为 的树,且每个顶点的度数最多为 。 思路 我们要构造出一棵树,使得其直径长度一定为 ,那么我们可以先选择
[题解] CF1882D - Tree XOR
摘要:
CF1882D - Tree XOR 知识点:换根 DP 。 主要难点是要思考如何操作使得代价最小,这个过程是一个贪心的过程。想到怎么操作,计算答案的过程就是一个板子换根了。 题意 给定一颗 个节点的树,点 具有权值 。现在需要你不断执行以下操作,使得树上所有
[题解] Codeforces Round 900(Div.3) E~F
摘要:
Codeforces Round 900(Div.3) E~F E. Iva & Pav 因为按位与的结果不会随着越多数字的增加而增加,因此我们可以利用这个性质二分出右端点,只需要一个可以查询区间的数据结构即可。 或者是按位考虑第 个数字的第 位,后缀最近的 的位
[题解] CF1873H - Mad City
摘要:
CF1873H - Mad City 知识点:基环树找环 题意 给定一张具有 个点 条边的无向图。现在有两个人,第一个人在 点,第二个人在 点,第一个人要追到第二个人。 两个人每一回合都同时进行操作,要么停留在当前位置,要么走邻接的下一个点。同时,第一
[题解} CF1217D Coloring Edges
摘要:
CF1217D Coloring Edges 知识点: dfs 树。 题意 给定一张有向图,现在要求为图上所有的边进行染色,使得颜色种类最少的同时,同种颜色的边无法构成环,输出最少需要的颜色种类和任意一种染色可行方案。 思路 假设该有向图中不存在环,那么我们可以直接对所有的边染为同一种颜色。因此可以
[题解] Codeforces Round 895 (Div. 3) F~G
摘要:
Codeforces Round 895 (Div. 3) F~G F. Selling a Menageri 考虑如何让卖出的价格翻倍,那么自然是从 。通过这样连边,我们可以发现,边集构成了基环树森林。显而易见的是,如果不考虑环,那么图就是拓扑图,按照拓扑关系跑一遍,就
[题解] CF29D Ant on the Tree
摘要:
CF29D Ant on the Tree 题目知识点:LCA。 题目传送门 题意 给定一棵以 为节点的树,再给定树的所有叶子节点的一个序列。 现在执行一个操作:从 开始遍历每个节点,并返回根,要求每条边经过的次数一定为 。 问是否能够使得访问节点序列中叶子节点的
[题解] CF1526C2 Potions
摘要:
# CF1526C2 Potions 题目知识点:反悔贪心。 [题目传送门](https://codeforces.com/contest/1526/problem/C2) ## 题意 给定 瓶药水,喝下药水 可以给生命增加 ,现在要求你按照从 到 的顺序
[题解] AtCoder Beginner Contest 308 A~G
摘要:
# AtCoder Beginner Contest 308 A~G ## A. New Scheme ```cpp void Main() { vector a(8); for (auto &x : a) cin >> x; if (!is_sorted(a.begin(), a.end()) &
[题解] CF1328E Tree Queries
摘要:
# CF1328E Tree Queries ## 题意 给定一棵以 为根节点的有根树。 现在有 次询问,每次询问给定 个节点,问是否存在一条从根节点开始的链,使得每个节点到这条链的距离不超过 。 ## 思路 我们首先可以给出一个结论:如果节点 与一条链的距离
算法学习笔记:扩展欧几里得算法
摘要:
# 扩展欧几里得算法 ## 问题引入 求 的一组整数解。 ## 前置知识 ### 欧几里得算法 当 为非负整数时,以下等式一定成立。 ### 裴蜀定理 对于任意非负整数