- 博客(30)
- 收藏
- 关注
原创 算法笔记(17):涉及左闭右开区间的防止死循环方式
在算法中有很多问题涉及左闭右开区间,如快速排序,二分查找以及很多数组分治策略。在编写这些算法过程中使用左闭右开区间很容易导致死循环(被折腾了好几个小时之后有感~)。故写此篇文章来防止这样的错误。记区间左端点为 lll,右端点为 rrr,区间为左闭右开 [l,r)[l,r)[l,r)。以二分查找为例:int solve1(vector<int> &a, int k){ int l = 0; int r = a.size(); int mid; whi
2022-03-19 15:19:02
367
原创 c++文件的二进制方式和文本方式读写文件
Windows读二进制方式读(打开文件时加上ios::binary参数)>>方式:将文本中的内容看作字符串转化后读入数据中,不会读入\n、\r、空格等。考虑in >> a,根据a数据类型的不同来进行不同的转化。例:int a;则读入a为123123,在计算机中的编码是整型123123对应的编码,而不是文件中存储的字符型编码。若文件为:则读入失败,a置任意值(大多数情况下为0),in.good()置0。read方式:把文件中存放的内容的编码原封不动直接读入数据中,。
2021-11-10 10:30:17
1508
原创 linux和windows下回车与文件差异比较
回车差异在windows下,回车会被当做\r\n写入文件中;而linux下,回车被当做\n写入文件中。这里发现一个重要的差异。当在windows下创建一个文件时,在文件中的写入的回车都会被当做\r\n,即使将该文件移入linux平台下,其仍然具有该属性。同理linux,当在linux下创建一个文件时,在该文件中写入的回车都会被当做\n,即使该文件移入windows平台下,其仍然具有该属性。猜想写入回车的方式应该是文件本身的属性,在不同平台下创建文件时,其被赋予不同的属性,所以对待回车的方式与该文件
2021-11-09 23:33:18
1006
原创 vscode workspace详解
"workspace"是什么?workspace指的是在窗口中打开的一个或者多个文件夹,他们共同构成一个工作区。当有多个文件夹时,称作 Multi-root workspaces.如何使用workspaceworkspace的使用与vscode的层级设置(优先级高的设置会override优先级低的设置)密切相关,vscode有两种修改设置的方式vscode 设置一、通过图形界面修改打开图形界面在图形界面中可以选择修改各个板块的设置,如全局设置,工作区设置和文件夹设置(workspace界面要
2021-11-05 10:50:33
16757
原创 已知二叉树前序和中序遍历来构建二叉树
#include <iostream>#include <string>using namespace std;typedef struct BiTNode{ char data; BiTNode *lc, *rc;} BiTNode, *BiTree;/*递归方式*/BiTree solve(const string &pre, const string &in){ if (pre.empty() && i
2021-11-03 11:08:22
139
原创 二叉树先中后序遍历的递归实现与非递归实现
递归实现typedef struct BiTNode{ char data; BiTNode *lc, *rc;} BiTNode, *BiTree;/*先序遍历*/void PreOrderTraverse(const BiTree T){ if (T) cout << T->data; else return; PreOrderTraverse(T->lc); PreOrderTrav
2021-11-02 19:48:29
349
1
原创 算法笔记(15):二分偏序问题
二分偏序问题通常以i>(<,≥,≤)j,ui>(<,≥,≤)vji>(<,\ge,\le)j,u_i>(<,\ge,\le)v_ji>(<,≥,≤)j,ui>(<,≥,≤)vj等形式出现,求符合以上两种情况的有序对的个数,朴素来讲这种题目可以用O(n2)O(n^2)O(n2)的复杂度来解决,但可以用树状数组来优化,使其复杂度为O(nlogn)O(n\log n)O(nlogn)典型的二分偏序问题,逆序对P1980 逆序对首
2021-10-27 11:01:34
168
原创 算法笔记(14):树状数组
树状数组的原理在树状数组中,tree[k]tree[k]tree[k]维护了∑i=k−lowerbit(k)ka[i]\sum_{i=k-lowerbit(k)}^k{a[i]}∑i=k−lowerbit(k)ka[i]。其支持单点修改和区间查询操作。本质上树状数组是利用了二进制的性质的一种数据结构,下面我们分别来看单点修改和区间查询是如何以一个较低的复杂度实现的。先给出lowerbit的实现:int lowerbit(int x){ return (x & (-x));//返回x的
2021-10-27 10:28:52
125
原创 算法笔记(13):埃氏筛与欧拉筛
在刷算法题的时候经常遇到与质数有关的问题,而普通方式筛选质数十分耗时(判断n是否为质数的O(n)O(n)O(n) 或O(n)O(\sqrt{n})O(n)比较耗时),故今天学习了埃氏筛和欧拉筛两种算法。埃氏筛int prime[N];//记录[1,N]中所有质数,从小到大排序int vis[N];//vis[i]=1当i是合数vis[0] = vis[1] = 1;for (int i = 2; i <= N; i++){ if (!vis[i]) { pr
2021-10-26 20:45:54
165
原创 算法笔记(12):字符串匹配算法KMP(substr)
记ppp为模式串,aaa为文本串。#include <iostream>#include <cstring>using namespace std;const char *p = " QAQ";const int lenp = 3;const int N = 1e6 + 5;int dp[lenp][256];//dp[i][j]指当处于i状态,遇到字符j时的下一个状态char a[N];int main(){ int x = 0; cin
2021-10-26 12:09:16
150
原创 牛客竞赛小白月赛39补题
HAC代码:#include <iostream>#include <algorithm>using namespace std;using ll = long long;const int N = 1e6 + 5;ll a[N];ll dp1[N], dpl[N]; //dp1[i]维护前i只需要砍的次数,dpl[i]代表以第i只为最左边挥刀次数。ll dp2[N], dpr[N]; //dp2[i]维护后i只需要砍的次数,dpr[i]代表以第i只为最右边挥
2021-10-24 16:44:49
97
原创 docker搭建linux环境艰辛历程
在啃csapp的时候偶然了解到他的lab十分高质量,于是准备写写lab,但是他是基于linux系统的,故需要在windows上搭建一个linux系统,主流有两种做法购买云服务器,在本地写代码然后上传到云服务器,在云服务器编译运行代码。利用docker建立容器将本地文件挂载上远程的linux系统,这样远程文件与本地文件能够同步。一开始采用方法2按照网络教程搭建在拉取镜像后,创建容器的命令行使用部分错误,导致创建的容器下文件挂载有问题,如下图在指定本地文件绝对路径后少了:/(linux下共享文
2021-10-23 20:29:37
456
原创 AutoX安途杯中山大学程序设计校赛-补题
ac代码:#include <iostream>#include <cmath>using namespace std;int ans;void dfs(int a[], int len){ if (len == 1) { ans = min(ans, a[1]); return; } int t[15]; for (int i = 1; i < len; i++) { .
2021-10-18 10:47:29
367
原创 2021 ccpc 赛后补题
jumping monkey大致题意:有一颗nnn个节点的树,由n−1n-1n−1条边连接而成,每个节点有一个权值aia_iai,对于树上任意两个节点uuu,vvv,monkey能从uuu跳到vvv当且仅当ava_vav是从uuu到vvv的最短路径(由于是树,故任意两个节点只有一条不经过重边的路,最短路径即该条路)所经过节点中权值最大的节点,问monkey从k(k∈(1,n))k(k\in(1,n))k(k∈(1,n))出发,最多能经过多少个节点。分析:刚开始的想法是求出每个节点iii能跳的
2021-10-14 09:24:15
305
原创 算法笔记(11):求解字符串的subsequence
const char *p = " 需要匹配的字符串";const int lenp = strlen(p+1); dp[0][0] = 1;//必要初始化过程 for (int i = 1; i <= lena; i++) { dp[i][0] = 1;//必要初始化过程 for (int j = 1; j <= min(i, lenp); j++) {
2021-10-11 14:37:39
135
原创 算法笔记(10):树上dp
ac代码#include <iostream>#include <vector>#include <algorithm>using namespace std;const int N = 6e3 + 5;int r[N];bool worker[N]; //标记第i个人是否有上司,用于找出校长int n;vector<int> edge[N]; //由于不一定是二叉树,故用图的方式存树int dp[N][2]; //树上.
2021-09-15 11:10:30
87
原创 算法笔记(9):floyd算法和dij算法的比较
今天发现两算法用队列优化时表现出许多相似性,而且队列优化思想与未优化的思想有所不同,容易产生误解,故总结一下Floyd算法核心for (int k = 1; k <= n; k++) for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) if (dis[i][j] > dis[i][k] + dis[k][j]) dis[i][j] = d
2021-08-25 22:15:45
285
原创 2021集训新生赛4:区间覆盖PLUS
#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N = 1e5 + 5;struct line{ int l, r; int w; bool operator<(const line &l) { return w < l.w; }} a[N];stru
2021-08-24 15:01:57
91
原创 算法笔记(8):二叉搜索树
今天学了一种名为二叉搜索树的数据结构并自行实现了一番,写的过程发现了很多容易错的部分,现将其总结一下。性质任意节点的键值大于其左子树上所有节点的键值,小于其右子数上所有节点的键值(一般二叉搜索树中不存在键值相同的节点)能够在O(logn)内做到删除、添加和查找节点一般用链表来存储实现自己写的代码template <class _Ty>struct treenode{ _Ty val; treenode<_Ty> *l; treenode&
2021-08-15 22:06:38
90
原创 2021-08-14
算法笔记(7):01背包问题与完全背包问题的内存优化一般实现代码01背包问题const int max_n = 105;const int max_m = 10005;int n, m;//n种物品,总重不超过mint dp[max_n][max_m];//dp[i][j]指从前i个物品中选,总重不超过j时的背包最大价值int w[max_n], v[max_n];void solve(){ for (int i = 1; i <= n;i++) fo
2021-08-14 18:50:35
65
原创 算法笔记(6):线段树与树状数组
简单来说,线段树比树状数组难实现,但线段树能够维护的性质多于树状数组,并且把树状数组包含在内。例如,线段树可以维护数组随机区间的最大值,并且支持随意查询;而对于树状数组来说,只能维护数组前i个元素的最大值,而无法随意查询。lis中f[i]可用树状数组来维护,具体可见收藏。...
2021-08-13 21:18:12
98
原创 算法笔记(5):剪枝
记录一下肝了一天的剪枝,洛谷P1120 小木棍 [数据加强版]惨痛教训:dfs嵌套次数是指数性的,可能每次只执行10几次的循环,经过dfs嵌套后就无比无比无比耗时!!!!故编写dfs函数时尽量避免内部循环,用参数传递等方式来记录上代码!#include <iostream>#include <algorithm>using namespace std;bool book[70]; //标记用过的木棍int n;int len; //记录木棍的原始..
2021-08-13 20:45:13
92
原创 算法笔记(4)-线段树
#include <iostream>using namespace std;const int N = 1e5 + 5;struct node{ int l, r; long long sum; long long addv;} tree[N * 4];long long a[N];long long b[N][4];//将o这一层的lazy_tag下放void pushdown(int o){ if (tree[o].addv &.
2021-08-11 10:04:34
64
原创 算法笔记(3):求两个正整数的最大公约数
int solve(int a, int b){ if (a == b) return a; if (a < b) return solve(b, a); else { if (!a & 1 && !b & 1) //a,b都是偶数的情况 return solve(a / 2, b / 2) * 2; else if (!a & 1 &am.
2021-08-10 14:57:45
213
原创 算法笔记(二)-激发思维的主元素问题最优解
#include <iostream>using namespace std;const int N = 1e5;int a[N];int main(){ int i, j; int count; int n; cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; i = 0, j = 1; count = 0; whil.
2021-08-08 14:21:47
71
原创 算法笔记(一):求最短路径-dijkstra算法
#include <iostream>#include <algorithm>using namespace std;const int N1 = 20;int e[N1][N1]; //存放地图int dis[N1];int book[N1];int main(){ int i, j; int inf = 99999; int c1, c2, len; int c; //求该城市与其他城市之间距离的最小值 .
2021-08-07 19:34:22
115
原创 bellman-ford算法的队列优化
#include <iostream>using namespace std;const int N = 1e4 + 5;const int inf = 999999;//自己写一个简单队列,比stl的更实用,既可以让队首出队也可以让队尾出队struct que{ int a[N]; int head, tail; que() { head = 1; tail = 1; }};que q;bool .
2021-08-07 15:41:13
108
原创 单调队列的初步实现
#include <iostream>#include <algorithm>#include <climits>#include <list>using namespace std;const int N = 3e5 + 10;list<int> que;int main(){ int n, m; int s[N]; s[0] = 0; cin >> n >> m; .
2021-08-07 14:26:06
70
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人