- 博客(38)
- 收藏
- 关注
原创 左值,右值,引用和move()
左值和右值左值指的是可以取地址的变量,在内存中有实体;右值一般指的是临时变量,可以在内存中也可以在cpu寄存器中。左值与右值的根本区别在于能否获取内存地址,而能否赋值不是区分的依据。通常临时量均为右值。区分表达式的左右值属性有一个简便方法:若可对表达式用 & 符取址,则为左值,否则为右值。引用引用是C++语法做的优化,引用的本质还是靠指针来实现的。引用相当于变量的别名。引用可以改变指针的指向,还可以改变指针所指向的值。引用的基本规则:声明引用的时候必须初始化,且一旦绑定,不可把引
2021-05-13 15:44:54
286
原创 Tree indexex
表索引哈希表只能进行单个Key的查找,不能进行范围扫描的查询。表索引则可以做到这一点。表索引是表中属性子集的一个副本,我们将它以更高效的方式存储(如B树),使得可以进行更高效的遍历和查找操作。索引是一个副本,因此要和表同步。也就是如果表修改了,索引也应该同步更新。B+树知乎文章一种自平衡的树形结构,当我们插入数据的时候会保证数据的有序性,这样就可以沿着叶子节点高效查询数据。插入,删除时间复杂度: O(logn)O(log n)O(logn)B+树是M路搜索树,他可以通过m条不同的路径到
2021-05-13 15:44:02
149
原创 CMU-15445 LAB1:Extendible Hash Table, LRU, BUFFER POOL MANAGER
我的github仓库如图为buffer pool manager的标准接口,其中Disk manager和log manager是实验源码中已有的环境,其提供的接口如图包括将页写回到磁盘上和读磁盘上的页等函数。除此之外自己需要实现的是lru_replacer和extendible hash table,因此实现LAB1的子任务便是实现这两个数据结构。lru_replacerLRU的实现方式是双向链表和map,其中map将page_id映射到一个指向链表节点的指针。思路:利用map询问pag
2021-05-13 15:43:09
1366
1
原创 2020.06.02 Codeforces Round #646 (Div. 2)补题
https://codeforces.com/contest/1363A - Odd Selection//#include<bits/stdc++.h>//poj,hdu can't use it#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <stack>#include <map>#inclu
2021-05-04 16:02:34
157
原创 二分,三分
二分法是一种在一类单调的问题中快速寻找答案的方法,复杂度为O(logn)。while(left < right){ int mid = left + (right - left)/2; //也可也写成(left+right)>>1 if(check(mid)){ ans = mid; left = mid + 1; } else
2021-05-04 16:02:00
135
原创 HDU 3038带权并查集
#include <bits/stdc++.h>#define ll long longconst int maxn = 1e6+10;using namespace std;int par[maxn];int height[maxn];int sum[maxn];void init(){ for(int i = 0; i <= maxn; i++){ par[i] = i; height[i] = 0;
2021-05-04 16:01:37
153
原创 Codeforces Round #698 (Div. 2)
A给出一个非递减的数组,问最少用几种颜色染色,使得每一个颜色中的数严格递增明显只要不是同一个数,就可以用同一种颜色染,因此记录最多出现的数#include <bits/stdc++.h>using namespace std;#define BUFF ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)#define rep(i,a,n) for(int i=a;i<=n;++i)#define per(i,n,a) for(i
2021-05-04 15:59:53
1121
2
原创 Hash Table
Hash table属于如图层次中的Access Methods一层,是一种用来对数据库进行读或写的方式。数据库内部锁维护的数据结构有两种:hash table和order-preserving tree。Page table或page directory本质上就是hash table,通过page_id得到buffer pool中的frame或者得到磁盘上的位置。Hash Tables哈希表是一个抽象数据类型,通过它来提供无需的关联函数实现API。也就是将任意的key映射到对应的值上。空间.
2021-05-03 18:07:43
417
原创 缓冲池和内存管理
DBMS管理系统如何将数据从内存和磁盘中移动Buffer pool managerBuffer pool是在数据库内部分配的一块大的内存区域,被分成一个个固定大小的Frame(类似页中的slot),可以将page放在里面。当数据库发送请求,需要一个Page的时候,会从buffer pool里面查看是否已经存在这个Page。如果存在,则直接使用,否则若空间足够:从硬盘中拷贝一份并放到buffer pool中。若空间不够,则需要从buffer pool中的某些页写回到磁盘中,然后将该页写到buffer
2021-05-03 18:04:17
732
原创 Educational Codeforces Round 108 (Rated for Div. 2) VP总结
总结:时间复杂度过了也要考虑常数(C题)A. Red and Blue Beans题意 将a和b两种物品放到若干个篮子里,要求每个篮子都至少有一个a和一个b,且a和b数量的差值小于等于d。思路:a和b差值的部分肯定尽量分布到数量少的那一个上面是最优解。inline void Solve(){ /*write your code down here*/ int r,b,d; Read(r,b,d); if(r < b)swap(r,b); int tm.
2021-05-03 17:54:48
91
原创 README
项目参考《STL源码剖析》实现,编译环境为c++11,使用中文注释https://github.com/Whalesong0622/MySTL第一次接触与尝试实现STL,也是第一个项目,用于学习源码实现方式和功能一途,有不足之处请指出。笔记将更新于我的CSDN博客和我的个人博客中,欢迎交流与学习。...
2021-05-01 16:38:36
68
原创 构造和析构:construct,destory
construct构造就是对new的一个简单的包装,调用构造函数的同时分配空间对于destory来说,如果接受的是一个指针,那么简单的调用它的析构函数即可;否则的话则是接受两个迭代器first,last,使得析构[first,last)范围内的对象。为了效率着想,需要判断迭代器的型别是否有trivial destructor,也就是用户如果没有定义对象的析构函数的话,那么什么都不做即可,否则的话需要用一个循环一个一个的调用他们的析构函数,具体如图和以下代码//调用T1::T1(value)temp
2021-05-01 16:37:42
238
原创 迭代器Iterator
迭代器是一种方法,可以依照顺序访问容器的元素,而不会暴露容器的内部结构和内容。迭代器是一种smart pointer,最重要的工作是内容提领和成员访问,因此需要对 operator*和operator->进行重载迭代器的五种型别①:value type:是迭代器所指向的对象的型别,或者说是类型②:difference type:用来表示两个迭代器之间的距离,也可以表示一个容器的最大容量,比如stl的count()函数,返回值就是返回迭代器的difference type。③:referen
2021-05-01 16:35:58
93
原创 数据库存储02
OLPT联机事务处理On-line Transaction Processing,联机事务处理基本思路是:从外部得到新数据之后更新数据库系统的数据,只会去读取一小部分数据或更新一小部分数据。比如一个客户在登陆网站时只会更新自己的登录信息,记录等,只会访问小部分的tupleOLAP联机分析处理On-line Analyticla Processing,联机分析处理基本思路是,基于已有的数据派生出新的信息。比如从数据库中得到用户名以.gov结尾的表。OLTP只产生了简单的,少量的写操作;而
2021-05-01 16:29:42
162
原创 数据库存储01
面向磁盘的数据库特点是,我们所尝试读取的数据不在内存中,而是在磁盘中。因此数据库的数据在管理过程中是从非易失性存储到易失性存储的移动,在易失性存储中支持快速随机访问,但在非易失性具备的是块可寻址访问而不支持字节可寻址访问。字节可寻址访问:也就是按字节访问块可寻址访问:访问的单位是一个块或者页,需要先得到块之后再从中得到需要的数据。因此,在数据库系统中,我们需要实现类似虚拟内存的思想,给数据库提供一种能够提供足够的内存将数据库存入内存中的假象。之所以不直接使用虚拟内存,也就是通过mmap
2021-04-30 21:21:39
406
1
原创 traits
traits 扮演的是“特性萃取机”的角色迭代器所指向的对象的型别称为该迭代器的value type,虽然可以通过template来推导参数型别,但是若value type要用于函数的返回值,就没有办法了用于获取各个迭代器的特性比如迭代器的value_type,difference_type等,因此迭代器应该提供标准接口,体现在iterator.h处,将在迭代器笔记处补全含义[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传特偏化partial specialization含
2021-04-28 16:50:03
218
原创 Educational Codeforces Round 107 (Rated for Div. 2)总结与A-D题解
比赛链接总结:A题没仔细读完题就冲了,送了一发罚时,题目没读完别乱冲;D题交第一发的时候只有一个小问题没处理好,两发乱改改出问题了,最后复制第一份代码把大于等于改成等于就过了…确定思路没有问题的情况下不要随意更改思路。A. Review Site题意:有两个电影分别统计好评和差评。有三类观众,第一种会投好评,第二种会投差评,第三种如果当前好评大于等于差评就投好评,否则投差评,问最后能得到最多的任一电影好评数为多少。思路:其中一个电影吸引全部差评数,其他票数放在另一个电影上。inline voi
2021-04-13 15:26:41
97
原创 Divide by Zero 2021 and Codeforces Round #714 (Div. 2) 总结与A-E题解
思考与总结:①赛后观察他人代码,发现一个题目有更多简单且易于实现的写法,自己的代码有时候显得冗余了,且可能容易出错,需要改进实现方式。②这场比赛一共WA了五发,其中三发没开long long,一发dp数组开小了。细节考虑清楚能减少debug时间和罚时,规避掉小错误这场就进前三百了。不确定的情况下直接开long long,边界条件考虑的要更清楚一点。A. Array and Peaks大意:找到一个长度为n的全排列,其中包含k个峰值。峰值定义为ai>ai−1,ai>ai+1,(1<.
2021-04-12 11:13:50
345
4
原创 可达性统计 拓扑排序
因为一个点能到达的点等于他后续的点能到达的点集的并集,因此需要先算完后续的点才能算该点。如何先算后续的点呢?先找到已经算完的点,当一个点的入度等于0的时候,它的值就不会再有变化了,这启发我们用拓扑排序。反向建边,这样子每次找到一个入度为0的点,就可以找到他的前驱节点,并将自身的点集并到前驱结点上。由于一个点可能被多个点到达,这样子不能简单的统计到达的点的数量,这里用的是bitset来进行合并。#include <bits/stdc++.h>using namespace std;#d
2021-04-06 19:28:16
147
原创 Codeforces Round #712 (Div. 2) 3-Coloring 二分图构造
##题意:用1,2,3数字填充n*n的矩阵,限制为:①相邻数字不能相同②不能与每次给出的数字aia_iai相同思路:将矩阵分成i+j为奇数和i+j为偶数的两部分图,奇数部分尽量用1填充,偶数部分尽量用2填充。由于每次给出的限制只能限制一个数,所以1和2其中一个必然会填充完上述之一的图。此时,剩下的只要用1/2和3来填充即可。#include <bits/stdc++.h>using namespace std;#define BUFF ios::sync_with_stdio(fals
2021-04-04 19:44:59
144
原创 ARC116 A - Odd vs Even
ARC116题意:给出T个数,问这个数的偶数因子多还是基数因子多思路:奇数乘奇数为奇数,其他都是偶数如果这个数是奇数,必然奇数因子多,因为找不到一对因子使得其中一个因子为偶数,理由如上如果这个数是偶数,则需要判断质因数分解后2的个数。如果大于等于2,那么偶数多,否则基数偶数一样多:因为如果只存在一个二,那么得到这个数永远都是偶乘奇,不可能是偶乘偶。#include <bits/stdc++.h>using namespace std;#define LL long long
2021-03-29 21:04:35
256
原创 Codeforces 1493D GCD of an array 数论,数据结构
题意:给一个长度为n的数组,q次询问,每次修改a[i]乘等x,求每次修改完之后数组的gcd思路①gcd由各个数的因子最小值构成,其中一个因子的数量如果到达n的话,那么这n个因子里的数量最小值就会对gcd有贡献②记录一个数有哪些因子可以通过map来记录,同时支持修改,删除和查最小值的数据结构就是multiset。③每次a[i]*x,可以先对x进行质因数分解,然后对原来的map和multiset进行维护。维护思路:如果之前已经有n个这个因子了,那么先对gcd除掉这个因子的贡献,然后加入这个数之后再
2021-03-29 20:32:34
147
原创 Codeforces 1499D The Number of Pairs 数论,LCM/GCD的性质
已知c,d,x,问有多少对a,b使得c∗lcm(a,b)−d∗gcd(a,b)=x已知c,d,x,问有多少对a,b使得c*lcm(a,b)-d*gcd(a,b)=x已知c,d,x,问有多少对a,b使得c∗lcm(a,b)−d∗gcd(a,b)=x思路:①上式中仅有两个未知量,因此只要知道gcd或lcmgcd或lcmgcd或lcm就能知道另一个量,因此考虑枚举②gcdgcdgcd是lcmlcmlcm的因数,因此他们的任意组合都是gcd的倍数,因此gcd也是x的因数,因此枚举x的因数作为gcd③问题转化为
2021-03-29 18:34:12
118
原创 Codeforces 1493C K-beautiful Strings
1493C题意:修改一个字符串,最小化字符串且大于等于原字符串,同时每一个出现的字符数量为K的倍数思路:①:最小化且大于等于原字符串,因此考虑从后往前枚举,能不修改尽量不修改;②:如上限制,走到一个字符的时候向上枚举,并看后面的字符能不能修改成满足K的倍数。如果可以就向后填字符,否则继续向前枚举位置;③:字符数量用前缀和实现判断。#include <bits/stdc++.h>using namespace std;#define BUFF ios::sync_with_stdio
2021-03-28 11:56:17
167
原创 Codeforces 1484D Playlist
Codeforces 1484D题意:一个循环链表,如果下一个数与当前数互质,那么删除下一个数。问被删除的数的坐标有哪些。思路:利用next模拟链表,同时利用队列来保证一个数在状态不变的情况下不会被访问多次。#include <bits/stdc++.h>using namespace std;void Solve(){ int n; cin>>n; vector<int>v(n); for(auto &it:v)
2021-03-28 11:32:13
167
原创 Codeforces 1506G Maximize the Remaining String 思维
题意:给出一个字符串,删掉其中某些出现了大于等于两次的字符,并最大化每一个字符只出现一次的字符串思路:从一个空串开始添加字符。因为要求的是最大字符串,因此我们最大化每一次添加的字符。但是什么样的字符是能够添加的呢?答案是这个字符第一个出现的位置的后面包含了所有剩余的字符,否则添加了这个字符可能会使某些字符无法添加。#include <bits/stdc++.h>using namespace std;#define BUFF ios::sync_with_stdio(false), c
2021-03-28 11:24:31
184
原创 树状数组初步应用
给定一个数组a[maxn],提出如下问题问题1:求这个数组的所有值的总和。方法一:定义变量sum,遍历数组使sum+=a[i]。方法二:定义另一数组pre,使pre[i]为原数组的前缀和。a[0]+a[1]+...a[i],则pre[last]=pre[last-1]+a[last]即为答案。问题2:在问题1条件下,修改任意一个a[i]值(设+=change)的同时修改总和方法一:直接...
2021-03-28 11:15:00
181
原创 Codeforces Round #709 useful edge 枚举,最短路
题目大意:一个无向有全图中,给出q个u,v点以及权值l,定义一条路径上以u和v分别为起点和终点的路径,且这条路径的边权和不超过l,那么这条路径上的所有边都是有用的边。求有用的边的个数思路:枚举所有边,看他是否能成为有用边。具体做法:枚举边的端点i,j,先找到i到q个目标点u的最大剩余值max{l-dis[i][u]},那么只要边的另一个端点j离目标点的距离小于max{l-dis[i][u]}即可。由于数据范围n小于600且时间范围5s,因此最短距离dis可以用floyd。#include <bit
2021-03-27 17:23:14
93
原创 Travel Expense 最短路,二分
https://ac.nowcoder.com/acm/problem/213992给出一张图,多次询问点a到b的最大携带货物量i为多少,假设a到b距离为k,则花费金额为i1+i2…i^k,要求是花费不能大于上限b。首先最短路是显然的。注意到地图的数据范围n,m (1≤n≤100, m≤(n(n+1)/2)),查询次数Q (1≤Q≤10^5),地图范围很小而需要频繁的询问不同点之间的距离,显然是floyd。至于寻找最大携带货物量用二分查找即可。注意,判断上式是否大于b,如果用我这种写法需要在大于b的时
2020-11-24 12:23:05
136
原创 tokitsukaze and Soldier 优先队列
https://ac.nowcoder.com/acm/problem/50439将人从大到小排列,这样子的好处在于万一队列新进来了人,当前人数大于这个人能接受的人数上限,可以从队列里删除人,且根据贪心肯定是删除队列里人值最小的人,那么就可以应用优先队列。反之没有贪心策略。#include <bits/stdc++.h>#define ll long longconst int maxn = 1e6 + 10;using namespace std;struct node{
2020-11-22 19:46:54
101
原创 HDU 6889 Graph Theory Class(min_25求素数前缀和)
题意:给定数n,表示有n个值从1-n的点,求最小生成树。其中边的权值表示为lcm(x+1,y+1)。设一点的值为x。x>=3时,若x为素数,则能找到的最小边为与点1的连边,权值为2*x;若为合数,则一定可以找到一个因数y+1,使得权值为lcm(x+1,y+1)=x+1。因此只要求2到n+1的和,再加上该区间的素数和即可。数据范围很大(1e10),普通的筛法会时间和内存都不够。现在我已知的方法有两种,第一个是分块打表,第二个是用min25筛。在这里使用min25筛,思想可以参照https://bl
2020-09-23 21:59:24
320
原创 HDU 5976 逆元,前缀和,数论
一些总结:1)一个数字若是分成任意数字求乘积和最大,则尽量全部分成32)分成两个则是n/23)拆成n个,拆成这个数/n4)不能重复,则优先拆为2,3,4…,剩余▲x从后往前平分。逆元应用:https://www.cnblogs.com/WHLdbk/p/6051706.html求逆元:inv[1]=1;//1的逆元显然是1for(i=2;i<n;i++)inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD#include<bits/stdc++.h>#d
2020-09-06 21:36:11
220
原创 C - Orac and LCM CodeForces - 1350C 数论
https://vjudge.net/contest/374073#problem/C第一种方法是传统的质因数分解。找到一个质因数,若在n个式子中出现n次,如果次小值的指数为p,则最终结果贡献为n^p;若出现n-1次,最小值指数为p,则最终贡献为n P;若小于n-1次,则贡献为0。第二种方法是公式法,用到的公式为GCD(lcm(a1,a2),lcm(a1,a3),…lcm(a1,am) ) = lcm(a1,gcd(a2,a3…am))下面为证明GCD(lcm(a1,a2),lcm(a1,a3),.
2020-05-22 23:37:13
284
原创 「网络流 24 题」搭配飞行员 网络流做法
套EK模板#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <stack>#include <map>#include <cmath>#include <algorithm>#d...
2020-04-13 19:04:23
156
原创 hdu1195 双向广搜
#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <stack>#include <map>#include <cmath>#include <algorithm>#define ...
2020-04-04 16:30:00
249
原创 线段树初步应用
目录一:线段树简介二:线段树原理----1.自上而下的分解(建树)2.自下而上的合并(区间求和)3.单点修改4.区间修改三:模板例题四:个人模板给定一个数组a[maxn],提出如下问题问题1:求这个数组的所有值的总和。方法一:定义变量sum,遍历数组使sum+=a[i]。方法二:定义另一数组pre,使pre[i]为原数组的前缀和。a[0]+a[1]+...a[i],则pre...
2020-02-28 16:33:53
228
原创 图的bfs,dps,拓扑排序
#include <bits/stdc++.h>#define inf 0x3f3f3f3f#define ll long long#define inf 0x3f3f3f3f#define sd(a) scanf("%d",&a)#define mem(a) memset(a,0,sizeof(a))const int maxn = 1e5+10;const i...
2020-02-19 17:59:44
190
原创 [CodeForces-1153D] [Problem A](树形DP)
这类题做的不多,一开始被困扰了很久。这道题的关键在于叶节点。最后根节点的大小只可能等于其中一个叶节点,而每个子树的父节点的值也都是从叶节点得来的,相当于一个传递过程。因此令dp[node]叶节点中的第几大的数,则若结点是max,则当然是选取min(dp[node],dp[temp]),(例如最大的叶节点最大,所以dp[node] = 1;若结点是min,假如传到左边是第四大右边第五大,那么合并...
2020-02-17 14:48:45
149
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人