- 博客(637)
- 收藏
- 关注
原创 01分数规划,二分法,题目练习
那么 sum(t - w * m) >= 0,我们如何得到sum(w) >= W下最大的sum(t - w * m)?那么二分最大比率 m,有 sum(l) / sum(h) <= m,即 sum(l - m * h) <= 0。我们对于 节点i,j,以 l(i, j) - m * h(i, j) 为边权求最小生成树即可。l(i, j) 为 节点 i 和 j 之间的欧氏距离,h(i, j) 为二者高度差。sum(t) / sum(w) >= m,m 为二分最大值。考虑从推荐人向被推荐人连有向边。
2025-03-20 22:26:20
636
原创 康托展开,逆康托展开,原理分析,题目练习
对于 lemher[n - 1],它的贡献是 lemher[n - 1] * 0!对于 lemher[n - 2],它的贡献是 lemher[n - 2] * 1!n 个元素构成的排列的排名为 所有排列按字典序升序下的排名,比如 “1234” 的排名就是 1。一个直接的方法是,预处理阶乘,然后权值树状数组初始化所有数字权值为1,然后顺序根据排名填写。康托展开是指一种将自然数展开为数列的方法,类似于试填法 / 数位dp,从而求出排列的排名。加1 是因为我们试填算的是字典序严格小于该排列的排列数。
2025-03-08 00:12:39
618
原创 高斯消元法,加法,异或,同余方程组,原理分析,题目详解
高斯消元法是线代中非常基础的知识,在数据量较小的时候,可以用来求解 加法/异或/同余方程组,矩阵求逆。
2025-03-02 01:07:07
795
原创 lab4 CSAPP:Cachelab
最简单的一集实验室分为两个部分。在A部分中,实现一个缓存模拟器。在B部分中,编写一个矩阵针对高速缓存性能优化的转置功能。感觉是比较经典的问题,之前在体系结构的课程中接触过,终于能通过lab实操一下了。实验目录的 traces 子目录包含参考跟踪文件的集合,将用于评估A部分中编写的缓存模拟器的正确性。跟踪文件是由 Linux 称为valgrind的程序产生的。先安装valgrind比如 我们用valgrind 捕获 ls -l 的内存访问操作-地址-大小 三元组格式I 表示指令读取L 表示数据读取。
2025-02-20 21:03:20
1132
原创 lab3 CSAPP:AttackLab
cookie.txt 一个8位16进制数,作为攻击的特殊标志符farm.c 在ROP攻击中作为gadgets的产生源ctarget 代码注入攻击的目标文件rtarget ROP攻击的目标文件hex2raw 将16进制数转化为攻击字符,因为有些字符在屏幕上面无法输入,所以输入该字符的16进制数,自动转化为该字符ROP是什么缓冲区溢出攻击可以采用栈随机化、栈破坏检测(金丝雀)、限制可执行代码区域这三种机制来限制(详见csapp 3.10.4)为了对抗这些机制,又出现了ROP攻击技术。
2025-02-17 17:23:15
743
原创 lab2 CSAPP:BombLab
这个实验要能看懂些汇编,然后会用一些gdb的基本操作。打开bomb.c可以看到我们实际上就是要找到那6个字符串,错误的话就会爆炸。
2025-02-12 18:02:55
888
原创 四、容斥原理与鸽巢原理,《组合数学(第4版)》卢开澄 卢华明
回顾一下加法法则:事件 A 有 m 种产生方式,事件 B 有 n 种产生方式,则事件 A 或 B 之一有 m + n 种产生方式。但是如果 |A| = m,|B| = n,A∩B∅A∩B∅,则|A ∪ B| = m + n。在算竞中,经常遇到复杂的计数问题,多种情况不能直接加法法则相加,如何做到计数不重不漏?很多时候都要用到容斥原理的思想。容斥的计数思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来;然后再把计数时重复计算的数目排斥出去。
2025-02-05 01:48:13
657
原创 三、递推关系与母函数,《组合数学(第4版)》卢开澄 卢华明
母函数是:计数工具不考虑收敛性不考虑实际上的数值形式幂级数(Formal power series)对于序列C_0, C_1, C_2, … 构造一函数G(x)=C0+C1x+C2x2+...G(x) = C_0 + C_1x + C_2x^2 + ...G(x)=C0+C1x+C2x2+...例如 (1+x)n(1 + x)^n(1+x)n 称为序列 C(n, 0), C(n, 1), …, C(n, n) 的母函数,序列的长度可能是有限的,也可能是无限的。母函数和计数法则:母函数:为什么母
2025-02-03 16:07:23
843
原创 可持久化线段树,原理分析,题目详解
可持久化线段树学习起来难度并不大,如果学过可持久化Trie,了解怎样复用旧版本的信息,只通过少量空间维护信息的修改,其实很容易理解可持久化线段树的原理。对于普通线段树,我们可能是维护序列,维护权值,但是可持久化之后,其实我们掌握的信息更多了,可以解决很多看起来只能暴力解决的问题。
2025-01-25 04:23:58
1105
原创 二、排列与组合,《组合数学(第4版)》卢开澄 卢华明
n - 1}的 (n - 1)!相当于把 r 个小球放入n 个区域,那么相当于在n + r - 1 个位置中挑出 r 个位置放隔板,故 C(n + r - 1, r):从 n 个中取 r 个的排列的典型例子是从n个不同的球中,取出 r 个,放入 r 个不同的盒子里,每盒1个。杨辉三角每个数等于上面两个数之和:C(n, r) = C(n - 1, r) + C(n - 1, r - 1)等式右侧:(0, 0) 至 (n - r - 1, r) 和 (0, 0) 至 (n - r, r - 1)
2025-01-24 18:33:00
628
原创 3b1b线性代数基础
3b1b之前没认真看,闲了整理整理。这里给一个非严格的叉积定义,在二维平面中,我们称 向量v 和 向量w 构成平行四边形的有向面积为向量v 和向量w 的叉积。正负通过右手定则判断,右手四指从v 弯向 w,大拇指朝外,则为正,否则为负。仍以二维平面为例,计算方式如下:将v 作为 二维矩阵第一列,w 作为第二列,行列式的值就是叉积结果。事实上,叉积是通过两个三维向量生成一个新的三维向量。计算方式如下:得到的新的三维向量的长度为v 和 w 围成的平行四边形的面积。
2025-01-23 17:40:24
1570
原创 一、引论,《组合数学(第4版)》卢开澄 卢华明
发现自己数数题做的很烂,重新学一遍组合数学吧。参考卢开澄 卢华明 编著的《组合数学(第4版)》,只打算学前四章。通过几个经典问题来了解组合数学所研究的内容。
2025-01-23 16:21:12
666
原创 观察+dp+组合恒等式,Codeforces 998 div3 F - Multiplicative Arrays
C(n+1,i+1)我们拆成阶乘,化简后,分子项数是log级别的,分母预处理阶乘逆元,不再赘述。那么我们对于每个x,枚举>1的长度i,计算C(n+1,i+1)*dp[i][x]即可。我们要计算f(i,x)*ΣC(j,i),j为a[]的长度,1<=j<=n。定义状态dp(i,j)为i个>1的数乘积为j的方案数。考虑k=1E5时,a[]中>1的数最多有多少个?每个x枚举>1的数字长度i。注意到n很大,没法算。
2025-01-20 02:06:05
436
原创 线段树优化dp,abc389F - Rated Range
那么我们用懒标记线段树维护f(i),每次读入l(i)r(i),对f值在l(i)和r(i)之间的线段进行+1即可。f(i,j)=f(i-1,j)+1,如果l[i]<=f(i-1,j)<=r[i]考虑定义f(i,j)为初始分数为j,经过i场比赛后的最终分数。时间复杂度:O(nlogn+q)空间复杂度:O(nlogn)显然具有单调性f(i,j+1)>=f(i,j)否则,f(i,j)=f(i-1,j)
2025-01-19 21:25:31
293
原创 二分+贪心+观察,abc389E - Square Price
k^2=(1+2k-1)*k/2,这相当于分别买了价格为P[i],3P[i],5P[i]...(2k-1)P[i]的物品。最终计算数目如果剩的钱购买x+1的话还要加上这一部分的贡献,具体为什么可以在混合数组上模拟下最优解可能长的样子。我们假如把所有物品混合,可能是P[0],P[1],2P[0],P[3],P[4].....根据x可以计算每个物品购买的数目,从而计算花费来check。如果给你一堆价格不同的物品,金钱有限的情况下怎么买买的最多?
2025-01-19 18:15:59
465
原创 树上启发式合并
这只是人们的基于直觉,一般来说树越大往往越高,那么小树优先合并到大树上面,似乎可以使得树高较低一点,是一种启发式策略,所以称为。暴力思路:对每一个子节点进行一次遍历,每次遍历是O(N)的,因此总体时间复杂度O(N^2)处理完所有的轻儿子之后,对于重儿子我们根据欧拉序,累加整棵子树的颜色——O(N),并且保留。外,还有类似于树链剖分的做法,我们也做 轻重儿子 的划分,这样做事实上有很优秀的性质。轻儿子dfs计算答案,即dfs轻儿子后,轻儿子子树内的贡献不保存在 cnt[] 数组。轻儿子:除了重儿子之外的。
2025-01-01 17:15:39
674
原创 六、链路层,《计算机网络》,谢希仁 &《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》
介质访问控制MAC):多个节点共享同一个“总线型”广播信道时,可能发生“信号冲突”。应该怎么控制各节点对传输介质的访问,才能减少冲突,甚至避免冲突?
2024-12-30 14:58:36
1178
原创 二、SQL语言,《数据库系统概念》,原书第7版
1974年,由Boyce和Chamber提出1975-1979年,由IBM的SanJose研究室在System R上首次实现,称为Sequel(Structured English QUEry Language)→SQL(Structured Query Language)。1986年ANSI/ISO推出SQL标准:SQL-861989年ANSI/ISO推出SOL标准:SOL-891992年进一步推出了SQL标准:SQL-92,也称为SQL2是SQL-89的超集。
2024-12-30 14:47:12
952
原创 分块与莫队,分块的暴力美学
很多时候,对于维护区间的问题,想到要用某种数据结构,但是实现过于繁琐,或者遇到自己的知识盲区,在数据量以及题目时限较为客观的情况下,分块/莫队可以解决我们的问题,而且大多数时候代码简单,可以在赛时更快的取得AC。
2024-12-30 03:15:00
835
原创 七、物理层
10BaseF*—— 10Mbps,光纤。*可以是其他信息,如10Baser FL,10Base FB、10Base FP。例如,在使用二进制编码时,只有两种不同的码元:一种代表0状态,另一种代表1状态。在一个信号周期内,如果只出现两种信号值,那么只能区分0和1,每种信号对应一个2进制数。10Base2——10Mbps,同轴电缆,最远传输距离200m(实际是185)信号传输通道上,如果存在强电场 / 磁场,那么是噪声,影响了数据传输速率。电磁波的公式:C=λF,C为光速,入为波长,F为频率。
2024-12-14 18:40:27
850
原创 五、网络层:控制平面,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》
E = 链路集合 = { {u, v}, {u, x}, {v, x}, {v, w}, {x, w}, {x, y}, {w, y}, {w, z}, {y, z} } 边有。同单播地址一样,组播IP地址也需要相应的组播MAC地址在本地网络中实际传送帧。一个不同的(通常是远程的)控制器与本地控制代理(CAs) 交互。利用了ICMP协议类型8的回显请求和类型0的回显应答完成。中的单独路由器算法元件,在控制平面进行交互。中的单独路由器算法元件,在控制平面进行交互。: 路由器故障会发生什么 (LS胜出)
2024-12-14 18:31:44
1295
原创 四、网络层:数据平面,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》
比如上面的例子,如果IPx 能够转发 200.23.20.0/23 ~ 200.23.30.0/23 和 200.23.16.0/23 这7个IP,而 200.23.18.0/23 是 IPy转发的,这个时候我们为了更为精确,:以4字节为单位指明首部长度。经过慢启动的过程,IPv6的路由器越来越多,从而,IPv4反而成了稀少的一方,那么自然可以将IPv4 放到IPv6 的数据部分来传输。,当IPv4数据报长度大于MTU,无法封装成帧,此时就需要对IP数据报进行分片,然后将每个分片封装成帧,分别发送。
2024-12-14 18:12:16
1259
1
原创 三、传输层,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》
为运行在不同主机上的应 用进程提供逻辑通信传输协议运行在端系统发送方:将应用层的报文分成报文段,然后传输给网络层接收方: 将报文段重组成报文,然后传递给应用层有多个传输层协议可供应选择Internet:TCP 和 UDP发送端最多在流水线中有N个未确认的分组接收端只是发送累计型确认接收端如果发现gap,不确认新到来的分组发送端拥有对最老的未确认分组的定时器只需设置一个定时器当定时器到时时,重传所有未确认分组发送端最多在流水线中有N个未确认的分组。
2024-12-14 18:02:44
1398
1
原创 九、运行时环境,《编译原理》(本科教学版),第2版
前端我们介绍了词法分析-语法分析-语义分析然后又介绍了中间端的中间代码生成和中间代码优化,它其实是和机器无关的现在到后端,我们就要考虑目标机器了,因为目标程序运行需要一个环境。编译器为目标程序创建并管理一个运行时环境,目标程序运行在其中主要是运行时的存储空间管理各种对象的存储位置和空间分配访问变量的机制过程间的连接参数传递机制过程或函数是模块程序设计的主要手段,也是节省程序代码和扩充语言的主要途径过程定义。
2024-11-27 16:09:11
727
原创 差分 + 模拟,CF 815A - Karen and Game
我们计算 minrow[i] = min{g[i]},mincol[j] = min{ g[i][j] }一个经典的差分数组的模板题目:可以进行区间 + - 1,请问将数组变相等的最少操作次数?先操作行:那么每行都得操作 minrow[i] 次,然后列再补齐。先操作列:那么每列都得操作 mincol[j] 次,然后行再补齐。列操作会对每一个行差分数组在该列的值的影响相同。行操作不影响行差分数组的值(除了第一个)因而得出结论:所有行差分数组的值都相同。对称的考虑:所有列差分数组的值都相同。
2024-11-26 18:07:13
488
原创 八、代码优化,《编译原理》(本科教学版),第2版
代码优化应该处在编译的什么位置?可以在语义分析之前吗?else 分支中的 printf(2) 显然是有类型错误的,因为 2 并非字符串程序员可能希望编译阶段检测出该错误,但是代码优化会将else 分支优化掉,这样导致后续语义分析检查不出这个错误显然,代码优化至少应该放在语义分析后面我们经过语义分析后得到一棵抽象语法树我们可以在抽象语法树上进行早期优化然后可以在中间表上上进行中间代码优化然后可以在。
2024-11-26 16:01:22
1121
原创 七、中间代码与程序分析,《编译原理》(本科教学版),第2版
三地址码中,一条指令的右侧最多有一个运算符。这也是为什么,前面三地址码只完成一个动作,不再有复合动作。s -> x = n // 常数赋值| x = y + z // 二元运算| x = θ y // 一元运算| x = y // 数据移动| x[y] = z // 内存写| x = y[v] // 内存读| x = f(x1, ..., xn) // 函数调用| Cjmp(x1, L1, L2) // 条件跳转| jmp L // 无条件跳转。
2024-11-26 15:55:12
1113
原创 LeetCode 第 425 场周赛 个人题解
定义 f(u, lim) 为 u 所在子树最大合法化值,lim = true 说明<p, u> 的边被父节点拿掉了,否则没拿掉。f(i, j, k) 为 [i, n - 1] 剩余 j 次 操作1,k次操作2的最小数组和。存一下s中每个块的数目和t的每个块比对下数量够不够。所以 u 能够保存的边数目为。枚举当前的方案进行转移即可。
2024-11-24 12:23:46
414
原创 六、代码生成,《编译原理》(本科教学版),第2版
前端对源程序进行进行分析并产生中间表示,后端则在此基础上生成目标代码。前面几章介绍了编译器前端的主要内容,接下来会进入中间端和后端的部分。中间端和后端的大致架构抽象语法树经过若干次中间表示和翻译,得到汇编代码。这是一个抽象层次逐渐降低的过程。上世纪七八十年代时的做法是仅通过一次代码生成然后得到汇编,这样的做法由于抽象层次跨度太大,所以实现困难。现代编译器的选择往往是经过多次生成而向目标代码逐渐靠近。
2024-11-18 23:02:06
714
原创 Codeforces 988div3 [A-G]个人题解
从5开始,我们奇数放一边,偶数放一边,奇数相加和偶数相加都是合数,只需找到一对奇数偶数之和为合数,最小的pair 为 4 + 5 = 9。定义 f[i] 为 到达 i 的路径数,sum[p1 p2 ... pk] 为 到达 被 p1 p2 ... pk整除的节点的路径数。即:f[i] += Σ sum[p1 p2 ... pk] * sign,sgn = (-1)^{k + 1}直接堆模拟即可,就是在不得不拿的时候,拿前面能拿的当中最大的那个。然后预处理 facs[i],即 a[i] 的质因子集合。
2024-11-18 12:07:50
811
原创 树状数组+概率论,ABC380G - Another Shuffle Window
我们发现我们只需计算子数组内产生的逆序对,而对于一个数组而言,数组内任意两个数之间构成逆序对的数目为 1 / 2,而 k-数组 pair 的数目为 k * (k - 1) / 2,每个pair 贡献1个逆序对的概率为1/2,根据二项分布的数学期望计算公式:E = np可得,k-数组的逆序对贡献期望为 k * (k - 1) / 4。每个滑窗这一部分的贡献为 (tot - cur) * (n - k + 1),因为 n - k + 1个滑窗等概率,所以贡献比例相同,这一部分的答案我们滑窗过程中直接累加。
2024-11-16 23:33:51
648
原创 搜索,CF 1666L - Labyrinth
考虑 从 s出发,搜索到 t,然后从t 沿着反向边一路往上走,不经过s -> t路径上的点最终到达s,那么说明找到了 两条首尾相同且不相交路径。考虑从 s 开始dfs,额外添加参数 p 记录上一个点,rev 记录当前是否走逆向,如果当前为逆向那么后续只能逆向走。以及 遇到搜索过的点,如果当前为逆向并且 该点为s,其实可以接着搜(找到了答案)时间复杂度: O(N + M)空间复杂度:O(N + M)如下图,黑色为正向边路径,红色为反向边路径。搜索的时候注意不能在s 就开始走逆向。
2024-11-15 16:53:12
457
原创 递推 / minmax搜索,CF 1767D - Playoff
定义 lt[x] rt[x] 分别为 节点x子树内 <= x 权值的数的个数,节点x子树内 >= x 权值的数的个数。我们按照 [1, 1 << n] 的值 构造一棵 锦标赛树,每个节点有两个儿子,该节点为 两个儿子中的胜者。最终答案就是 [lt[0], (1 << n) - gt[i] + 1]我们将每层按照s 值 分层,我们发现连续层产出的胜者一定是一个区间。从上往下 层数从0开始,那么 s[i] 就是本层的博弈规则。最后一层叶子就是值的排列。如果 s[i] = 1。如果 s[i] = 0。
2024-11-14 23:40:12
429
原创 五、语法制导翻译与抽象语法树,《编译原理》(本科教学版),第2版
Antlr-v4 是基于 LL(*)算法,这里介绍下 基于LR(1)的 yaccYacc 语言很简单,分为三大块:下面写一个简单的检测表达式输入的文法我们 通过 bison + 文件名来进行编译发现报错:出现二义性我们强制左结合优先:发现可以编译,并且生成了 test.tab.ctest.tab.c 是一个长达上千行,自动生成的一个LR(1)语法分析器我们利用gcc 去编译 test.tab.c:再次报错因为我们没有实现 yylex 和 yyerror再次重新编译
2024-11-10 16:40:54
1153
原创 LeetCode 第 423 场周赛个人题解
f[i] = f[i - 1] + 1,如果 nums[i] > nums[i - 1]然后看一下 是否存在 f[i] >= k and f[i + k] >= k。f[x] 为 x 结尾的好序列的和,g[x] 为 x 结尾的好序列的个数。定义 f[i] 为 以下标 i 为结尾的最长递增子数组长度。注意到值域很小,直接dp计数。
2024-11-10 12:00:05
382
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人