第二课——线段树 上一节课讲了树状数组,也介绍了树状数组的优点与不足,这里简单回顾一下。 **优点:**树状数组的代码非常简短,易于实现,被刘老师亲切的称为IO选手的"HelloWorld!",就是因为代码短。 **缺点:**树状数组的缺点也非常的明显,只能处理单点修改区间查询或者区间修改单点查询的问题(以较高的效率)。而区间修改区间查询的问题没有办法很优雅的解决,于是引出了线段树。 线段树 2024-03-23
第一课——树状数组 前缀和算法可以计算某一个区间的累记和,但是出现修改的时候,前缀和的效率便得不到保障。于是数状数组出现了。出现原因总结——需求从单纯的区间查询变为了单点修改 + 区间查询。 树状数组 本文不探讨树状数组的开发过程,这里先给出树状数组的结构: 树状数组的设计非常巧妙,它让下标为\(i\)(从1开始)的位置存储原数组的部分和。比如下标为2的位置,存储了前两个数据的和,而下标为4的位置存储了前四个数据 2024-03-15
B-Spline B-Spline 注: 本文只是作者自己对B样条的理解和实现,如有错误欢迎指出,谢谢。 作者邮箱:zhywyt@hdu.edu.cn B-Spline 是图形学中非常基础的一个曲线,我的导师徐岗徐老师,让我们从 B样条的绘制开始,无疑是一个很好的开始。 同 Bezier 曲线,B样条也是一个由伯恩斯坦基函数加权得到的曲线,因此它和 Bezier 曲线有这很多的相似点,这里我们把 Bezier 曲 2024-01-30 CG
花期内的花的数目 2251.花期内的花的数目 看到题目的第一想法是桶排序,但是想想肯定会超时,在题解区看到了这么一种解法,感觉很有意思,就记录一下。 要统计某一时间内多少花开放,也就是统计某一时间有多少花开放在它之前,结束在它之后。因为一朵花的开始一定是比结束早的,所以并不需要关心匹配问题。 使用两个数组分别存储花开与花谢的日期,排序后使用二分法即可快速得到某一日期的花开数量。 优点 :不用存储花期的对应关系。 2023-10-08
简单的拓扑排序 [OI WiKi]什么是拓扑排序? 简单来说,拓扑排序要解决的问题是给一个有向无环图的所有节点排序。 使用一个队列维护入度为零的节点,取出队列中的节点,存入答案,并把该节点的后续节点入度减一,得到新的有向图。 例题一 : 标准拓扑 课程表II 1234567891011121314151617181920212223242526272829class Solution {public: 2023-09-15
games101 HomeWork7 Games101 HomeWork7 导航 导航 多线程 这次的作业,我想先教大家实现多线程,再进行操作。多线程多我的吸引力实在是太大了。废话不多说,我们直接开始: 多线程主要是在Render中进行的 12345678910111213141516171819202122232425262728293031323334353637383940414243void Renderer::Render 2023-08-03 CG > games101
多线程之OMP 记录在学习games101的时候碰到的多线程知识 以下所有结果均在Ubuntu 22.04.2 LTS操作系统下使用g++ 11.3.0运行 所有的问题来自下面这段代码,这是games101 的第七次作业的一部分,需要使用多线程加速Path Tracing 123456789101112131415161718192021222324252627282930313233343536373839 2023-08-02
Linux批量修改文件名字 在做这样一件事情的时候我遇到了困难:我有十几个文件的日期都是以点作为分割符的,但是我需要提交的文件名中不能有.,那我需要把这些文件名改成-为分割符。 mv 我只知道mv可以修改文件的名字,但是也只能修改一个: mv 7.20.png 7-20.png 于是我望着我剩下的文件发呆 百度准备解决一次,用一辈子 rename 经过一番百度,我才发现mv只能进行单个文件的命名修改,使用rename才能 2023-07-31 Linux
games101 HomeWork6 Games101 HomeWork6 导航 导航 作业要求 IntersectP(const Ray& ray, const Vector3f& invDir,const std::array<int, 3>& dirIsNeg) in the Bounds3.hpp: 这个函数的作用是判断包围盒BoundingBox 与光线是否相交,你需要按照课程介绍的算 2023-07-30 CG > games101
games101 HomeWork5 Games101 HomeWork5 导航 导航 任务 Renderer.cpp 中的 Render():这里你需要为每个像素生成一条对应的光线,然后调用函数 castRay() 来得到颜色,最后将颜色存储在帧缓冲区的相应像素中。 Triangle.hpp 中的 rayTriangleIntersect(): v0, v1, v2 是三角形的三个顶点,orig 是光线的起点,dir 是光线单位 2023-07-29 CG > games101