算法
文章平均质量分 69
云归而-暝
这个作者很懒,什么都没留下…
展开
-
几道数论和其他题的题解
P3601 签到题题目背景我们定义一个函数:qiandao(x)为小于等于x的数中与x不互质的数的个数。这题作为签到题,给出l和r,要求 求出下面式子结果∑i=lrqiandao(x) mod 666623333\sum_{i=l}^r qiandao(x)\ mod \ 666623333i=l∑rqiandao(x) mod 666623333输入格式一行两个整数,l、r。输出格式一行一个整数表示答案。说明/提示对于30%的数据,l原创 2022-05-07 19:54:58 · 321 阅读 · 0 评论 -
P4447 分组
题目描述小可可的学校信息组总共有n 个队员,每个人都有一个实力值a[i]。现在,一年一度的编程大赛就要到了,小可可的学校获得了若干个参赛名额,教练决定把学校信息组的nnn 个队员分成若干个小组去参加这场比赛。但是每个队员都不会愿意与实力跟自己过于悬殊的队员组队,于是要求分成的每个小组的队员实力值连续,同时,一个队不需要两个实力相同的选手。举个例子:[1,2,3,4,5][1,2,3,4,5][1,2,3,4,5][1,2,3,4,5][1, 2, 3, 4, 5][1,2,3,4,5][1,2,3,4,原创 2022-04-20 12:53:07 · 556 阅读 · 0 评论 -
快速排序简洁写法
代码int partition(vector<int> &a, int s, int e) { for (int i = s; i <= e;) { while (a[e] < a[i]) i++; swap(a[s++], a[i++]); } return s - 1;}void quick_sort(vector<int> &a, int s, int e) { if (s < e) { int m原创 2022-01-01 14:14:50 · 405 阅读 · 1 评论 -
依概率不放回随机抽样算法
起因前段时间帮同学写了下ER网络和BA网络。其中BA网络要根据度占整个图的度的比例作为概率。于是就写了个按概率随机抽数的函数pick。思路当时想法很简单。就是把数轴分成几块,再随机抽点。比如数组[1,2,3],就生成区间[1,6]的随机整数。若随机数为5就认为选中第三个数。问题上面方法抽一个数很有效,但如果是抽n个数性能就下降的很厉害。越抽到后面重复的概率越大。我刚开始用洗牌算法,抽到第i个数,就和位置i的数字交换,再对后面数字依概率取数。这样虽然解决了重复取数的问题,但是效率仍然不高。原创 2021-12-22 16:18:47 · 1325 阅读 · 0 评论 -
删数问题【贪心】
给定n位整数d,去掉k(k<n)个数字后剩下的数字按原次序排列组成一个新的正整数。求最小正整数。贪心法一般有两种思路。思路1一种是 缩小问题规模。比如说本题就可以把原题改为给定n位整数d,去掉1个数字后剩下的数字按原次序排列组成一个新的正整数。求最小正整数。进一步说,可以转化成找一个数x,无论删除x前的数还是x后的数结果都比删除x结果差。下面分类讨论删除的数在x前设删除的数为 a如图只要对任意a, 满足a≤ba \leq ba≤b就行了。换句话说,x前为非递减序列的末尾原创 2021-12-18 15:18:32 · 1332 阅读 · 0 评论 -
leetcode 335. 路径交叉 题解及证明
原题 335. 路径交叉给你一个整数数组 distance 。 从 X-Y 平面上的点 (0,0) 开始,先向北移动 distance[0] 米,然后向西移动distance[1] 米,向南移动 distance[2] 米,向东移动 distance[3]米,持续移动。也就是说,每次移动后你的方位会发生逆时针变化。 判断你所经过的路径是否相交。如果相交,返回 true ;否则,返回 false。输入:distance = [2,1,1,2]输出:true分析分析一下题目,如果每条边都原创 2021-10-30 15:15:19 · 3306 阅读 · 0 评论 -
原生c语言实现模板函数
普通的堆排序#include <stdio.h>void swap(int *a, int *b) { int t = *a; *a = *b; *b = t;}void adjust_heap(int *heap, int s, int e) { for (int n;; s = n) { if ((n = 2 * s + 1) + 1 < e && heap[n + 1] < heap[n]) n++; if (n >原创 2021-10-25 22:22:01 · 438 阅读 · 0 评论 -
B-Tree
元操作split 操作#mermaid-svg-kZyz2rdXkVpbahOD .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-kZyz2rdXkVpbahOD .label text{fill:#333}#mermaid-svg-kZyz2rdXkVpbahOD .node rect,#mermaid原创 2021-07-30 14:37:36 · 56 阅读 · 0 评论 -
merger红黑树
package cn.lyf;public class rbt { Node root; class State { boolean bal; Node cur; public State(Node cur, boolean bal) { this.bal = bal; this.cur = cur; } } public void ins(int k)原创 2021-07-23 15:52:13 · 105 阅读 · 0 评论 -
手写红黑树
手写红黑树前言之前也写了一些数据结构但都写完就丢。没记录下来。感觉有点可惜,所以这次想记录一下。本次这个红黑树删除采用的不是传统的和叶子节点交换。而是通过合并两个子树来删除。我借鉴一篇haskell的红黑树。不知道是不是我没仔细看,感觉那篇红黑树实现起来有些漏洞。我上一篇博文也有点。虽然修补一下也没问题。但改来改去就是让人不爽。最后我放弃了blance高度必须减一的性质。思路就清晰多了。代码AVLpackage cn.lyf.tree;public class AVL<T extends原创 2021-07-22 15:33:56 · 194 阅读 · 0 评论 -
红黑树删除归并写法
红黑树删除归并写法dyeing 操作条件 当前节点为黑色,子节点孙节点存在连续红色性质 不改变黑高,维护搜索树性质和子树黑高相等作用 消去连续2-3个红色节点。使其不连续原来状态这里只画了两种情况。实际有四种#mermaid-svg-bH21tQiU9ea1DHrf .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#m原创 2021-07-20 12:27:35 · 129 阅读 · 0 评论 -
下一个排列,下一字典序
下一个排列,下一字典序题目实现获取 下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。思路及证明考虑一般情况,绿框中为最长递减后缀。现在要找一个序列大于该序列。有四种情况绿框内数字交换位置显然只改变绿框内数字的位置是无法使序列增大。排除黄框内数字交换位置若只改变黄框不会比绿框和黄框交换一个数字好。因为总可以找到一个数字比黄框最后一个数字大,也就是说只用改变最后一位,不用改变红框内原创 2021-06-22 19:57:10 · 155 阅读 · 0 评论