- 博客(16)
- 问答 (1)
- 收藏
- 关注
原创 高速缓存基础知识
建议使用写回和写分配的高速缓存模型,因为写回通常试图利用局部性,写回的高复杂性也不再成为阻碍。直写高速缓存通常是非写分配的,写回高速缓存通常是写分配的。的副本之后,怎么更新下一层的。只适合做小的高速缓存,最灵活。容易产生冲突未命中,不够灵活。要写一个已经缓存了的字。
2024-06-08 10:14:16
902
原创 近期比赛的 dp 总结
不单单看一个点到一个点的转移,我们看区间的转移,dp[i][j] 的值, 显然是与区间 i−k 到 i 这段有关的,因为一个数字它能改变的最大区域就是它相邻的 k 个数字,那么1到i−k−1 之前的这一段区域如何操作都不会影响 dp[i][j] 的值,所以它是无后效性的。dp[i][j]表示dp[选了前 i 个包][能拼成 j 的长度]=所需的最小值。拿 dp[i][j] 表示dp[前 i 个数字][前 j 次操作] 的最大值。dp[i][j]表示dp[前 i 张卡片][能组合的数字 j ]
2024-05-04 19:34:34
449
原创 高精度无符号整数类
最近做了几道很老的oi题,发现对高精度的考查很多,而且高精度融合在某些大题里面,让人调试的想死,恨c++没有py好用,只能处理1e18范围内的数字。乘法重载,也是每一位都互相乘,但是这个时候乘的结果存的位需要考虑,经过观察发现a[i],a[j]的贡献,都贡献到了i+j-1位上。先得保证a-b的时候a,a与b每一位都相减,然后从a的最末一位往前借位。于是写了个整数类,重载了很多符号,力求让它可以当作一个整型来使用。除法和取余重载都是基于减法实现的,除法需要判断除的不是0,细节请看代码。
2024-04-17 23:15:02
424
1
原创 文件读写与算法竞赛中造数据对拍检验程序正确性的技巧
ifstream和ofstream是一个类,input和output是类的实例化对象,调用类里面的open函数表示开始从文件里写入或读入信息。这里要注意一点,就是cout输出的内容和cin读取的内容会在终端里输入和输出。srand是cstdlib库里面的函数,随机生成的种子。取余用于设置数据范围。首先要写出一个绝对正确的程序,再写一个要检测的程序,把里面的输入输出语句改为input>>, outputc,表示读取string.in的内容,并把值赋给c。
2024-04-04 19:13:16
875
3
原创 洛谷P2455 线性方程组做题记录
回顾一下手算线性方程组的过程:把行列式化为行简化阶梯式,然后看是否出现了美丽的阶梯型,如果有一行全是零(出现了线性相关),且其他列正常,就是无穷解。如果有一行前面都是0,最后一个数字不是0,那么出现0=x的情况,也就是无解。当除数很大时,份数就会变得非常小,导致结果非常小。大多数被hack掉的原因是直接在循环中,把循环变量当成了当前处理行,导致当出现第一列都是0这样的数据时,第一行不会被处理,导致没有化为行简化阶梯型。在浮点数计算中,当除以非常小的数字时,可能会出现精度问题。**浮点数计算中的注意事项**
2024-03-04 18:45:24
370
2
原创 自定义类型二分查找与二分答案
二分答案是指答案所在区间满足有序性,那么通过二分的方式来缩小答案所在的区间,如果判断答案所需时间复杂度为n,区间长度为m,那么正常判断所需的时间为O(n*m),而二分查找所需时间O(n*logm)。因为pair重载了<,==,所以可以直接比较pair,pair的比较是从前往后比较,先比较第一个如果都相等再比较第二个。这里的make_pair()是构建一个临时变量,构建完就删除,查询的是first为2的变量。如果需要的类型超过两个,pair不适用了,那么就需要自己构建类型,用结构体举例。
2024-03-01 16:38:15
940
原创 ST表板子
查询l-r区间最值:cout<<max(dp[l][k],dp[r-(1<<k)+1][k])<<endl;ST表构建时间复杂度O(nlogn),查询时间复杂度O(1)用于查询分段区间最值。
2024-03-01 14:35:28
332
原创 对顶堆例题
放数字的时候,第一个数放q2里面,放入一个数,如果这个数大于q2顶,就放入q2.否则放入q1.动态寻找第k小的数,其实就是寻找第n-k+1大的数,对顶堆模板改一下就可.对顶堆是用两个优先队列组成的数据结构,一个大根堆,一个小根堆。通过维护q1的大小为k。q1的堆顶就是寻找的第k个数。通过这种方式可以动态的寻找第k大的数,而且复杂度很低。
2024-01-18 23:02:25
380
1
原创 基础数论学习记录
矩阵快速幂和快速幂实现上的区别:矩阵快速幂的re需要设为单位矩阵I,矩阵乘法需要重载运算符*,即aij的数等于第i行*第j列每个相应的数相乘再相加。技巧:lowbit的应用,lowbit就是找到一个数二进制最小为1的位,比如说为n。快速幂的复杂度是O(logn),a的n次幂,如果n是奇数,那么a的n次幂等于a的n-1次幂。如果n是偶数,a的n次幂等于a方的n/2次幂。不难看出从1异或到2n+2得到的就是两个单身的数字的异或,叫这个数为sum吧。由于两个相同的数字异或等于0,一个数异或0等于他自己。
2024-01-18 11:36:27
853
1
原创 并查集和带权并查集
寻根函数,每寻找一次根,都要改变它的值,即a吃b,b吃c,那么c的掌门可以归结到a上,fx存储的是a的下标,b和c的关系也需要改变到a和c的关系,这样两条边的权就变成了一条边的权,这个权如何递推是带权并查集需要思考的一个难点。同理经过多次赋值之后,会出现两个生物都有了自己的根节点,就意味着有了自己的生态位,也说明了他们是联通的,可以通过边权来溯源寻找生物之间的关系。寻找每个人的掌门,这个函数涉及到了路径压缩,即在查询掌门的时候,就把f数组的内容改成掌门,这样接下来的查询只需要一次就可以完成。
2024-01-18 00:23:43
1092
1
原创 map浅浅的应用
map是一种散列的数据结构,由键和值组成的,既可以构造int和int之间的映射(例如数字大小和出现次数的映射),也可以构造任何自定义类型之间的映射。简单的桶排序的基本思路是用一个bool数组,下标是数字,存的内容是存在/不存在,通过一次线性存储和一次线性遍历就可以做到降重和排序。而且map极大节省了空间,且可以构造不同数据类型之间的映射,肥肠好用。总结一下,map可以很方便的处理两个数据满足的同一确定条件,如相等,相加为定值等问题。样例2中,有(1,2),(2,3)两种方案可以满足彦卿的要求,故输出2.
2024-01-15 00:08:25
975
原创 求逆序数的板子(归并排序&树状数组)
/ 所以当a[i]在最前面时,后面一定有a[i]个比他小的数,n-a[i]-1个比a[i]大的数,所以每次把a【i】移到最后时,逆序数就会变化,a[i]到最后时,对应a[i]的逆序数为n-a[i]-1-a[i];// 然后是一个技巧,本题由于有一个条件,它输入的数一定是从0到n-1的一个排列(实际上线性代数实际也是这样的)// 如果在左面数组没放入的前提下,后面数组有数放入说明产生了逆序对。// 逆序对的变化是是左面数组已经放入的个数。// 是左面数组先放入然后后面数组再放入,// 两个数组a,b。
2024-01-13 22:37:35
425
2
空空如也
find这个指针有啥用
2023-09-24
TA创建的收藏夹 TA关注的收藏夹
TA关注的人