自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 2021-06-17 P11 组合与继承

P11 组合与继承设计复数、字符串这样的类是基于对象的设计,对于复数、字符串这样的类,基本上不会与其他class发生关系。但是有的时候处理更加复杂的问题时,就可能涉及到类与类之间的操作,这就是面向对象编程。所以我们就得看看类与类之间有些什么关系。Inheritance(继承)、Composition(复合)、Delegation(委托)1、Composition(复合),表示has-a1.1 定义下方代码是标准库中的代码为了便于理解,采用下面这种形式的代码,即queue这个类中包含de

2021-06-17 12:40:30 181

原创 2021-06-16 P10 扩展补充:模板类,函数模板,及其它

P10 扩展补充:模板类,函数模板,及其它1、静态1.1 概念静态成员数据是所有的对象用的同一个数据;静态成员函数没有this,只能处理静态成员数据。静态数据一定要在class的外面定义,是否设置初值都可以。调用static函数的方式有两种:(1)通过class name调用(2)通过object调用class Account{public: static double m_rate; static void set_rate(const double& x)

2021-06-17 10:36:52 159

原创 P8 堆、栈与内存管理

P8 堆、栈与内存管理1、所谓stack,所谓heapStack:是存在于某个作用域的一块内存空间。例如当你调用函数,函数本身即会形成一个stack用来存放它接受的参数,以及返回地址。在函数本体内声明的任何变量,其所使用的内存都取自上述stack。Heap:指由操作系统提供的一块全局内存空间,程序可自动分配,从中获得若干块。class Complex{...};...{ Complex c1(1 , 2);//在栈中获得,离开作用域自然消亡。 Complex* p = new

2021-06-16 21:21:55 150

原创 P7 三大函数:拷贝函数、拷贝复制、析构

P7 三大函数:拷贝函数、拷贝复制、析构1、Stringclass String{public: //Big Three String(const char* cstr = 0); String(const String& str); String& operator=(const String& str); ~String(); char* get_c_str() const {return m_data;}private:

2021-06-16 20:01:56 177

原创 网络流基础

网络流问题小结问:在给定图中是否存在s->t的路径?这个问题显然很简单,用dfs或bfs找一条。找到就存在,找不到就不存在。存在路径时,算法找出一条路径,成功;不存在路径时,算法失败,不存在路径仅当算法是正确的,但是没有证明过呀。能不能给一个针对该问题的证明?如果想证明从s->t不存路径,不妨画这样一幅图:此时,很直观地知道,s->t无路径。不妨先考虑什么叫存在一条从s到t的路径,这个时候,可以把所有以s开头,t结尾,节点所有的排列都写出来: 因为不考虑节点重复,所以肯定可以写出来。

2020-07-04 10:54:12 393

原创 bfs——A*算法

/*A*算法做法: 引入一个估值函数,用来估计某个点到达终点的距离。 记f是估值函数,g是真实值,那么f(state) <= g(state),越接近越好(当估值是0时,类似于Dijkstra算法) 记dist是从起点到state状态的步数; 利用的是优先队列,排序依据是dist[state] + f(state)证明: 反证法: 假设终点第一次出堆时不是最小值,那么意味着dist[end] >= dist优 那么说明堆中存在一个最优路径中的某个点(起

2020-06-26 00:18:02 420

原创 bfs的证明

①两段性:队列中最多存在两段:前面是x、x、x,后面是x+1、x+1…后面这段可能不存在②单调性:(数学归纳法)Ⅰ初始时:只有一个点显然满足单调性Ⅱ:假设当前满足条件,x、x、x、x+1、x+1.此时取出队头,找出能够扩展到的点,如果已经被遍历过则忽略,那么因为边长都是1,所以扩展到的点的距离都是x+1,将这些点放到队尾,此时队列仍然具有单调性和两段性。...

2020-06-25 12:46:17 540

原创 acwing——bfs中的Flood Fill

Flood Fill算法思路:顾名思义,洪水覆盖算法,任选一个合法的格子,从这个格子开始向其他合法的格子覆盖。可以在线性时间复杂度内,可以找到,所有连通块。AcWing 1097. 池塘计数#include <iostream>#include <algorithm>#include <cstring>#include <queue>using namespace std;typedef pair<int , int> PI

2020-06-25 10:03:28 218

原创 bellman-ford 和 spfa

bellman-ford#include <iostream>#include <cstring>using namespace std;const int N = 10010 , INF = 0x3f3f3f3f;struct Edge{ int a , b , c;}edges[N];int dist[N];int last[N];int n , m , k;void bellman_ford(){ memset(dist , 0x

2020-05-26 18:12:58 174

原创 acwing——贪心(哈夫曼树)

题目:合并果子算法思路:每次选择最小的两个点合并即可,利用优先队列(小根堆)这些点会构成一棵哈夫曼树(完全二叉树)。.处于深度最深的点会被合并最多次(可以理解为优先合并)。先证明以下两点:①权值最小的两个点,深度一定最深,并且可以互为兄弟(即优先合并,并且局部代价最小)证明:假设最小的两点深度不是最深,设点a、f是最小的两个点。当交换点b和点f后,因为最终的结果等于每个点的大小✖每个点到树根的距离,其余点不变,因此最终的结果会从3b+2f变成3f+2b,因为f<b所以结果变小。于是

2020-05-18 17:24:47 257

原创 acwing——数学知识(四)Nim游戏

一、经典Nim游戏题目:给定n堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。先手必胜态:可以走到某一个必败状态先手必败态:无法走到一个必胜状态定理:如果初始所有值的异或结果不为0,则先手必胜,反之必败证明:①败的最终状态000^0…=0②当a[1] ^ a[2] ^ … ^ a[n] = x != 0 时记x的二进制表示中最高位的1是第k位,则肯定存在一个a[i]的

2020-05-14 20:27:12 657

原创 Acwing——七夕祭(前缀和+中位数+环断链)

思路比较麻烦,但是代码很简洁!1.由该题联想到均分纸牌这题,但是该题首尾相接,相当于纸牌形成一个环,而且每次只能移动1。对均分纸牌做一个改变,即每次只能移动一张纸牌,先设纸牌数组为a数组,由平均数想到将a数组每一位减去平均数得到负债数组b(负债可正可负),每堆纸牌只受相邻左右两堆影响,因此从左开始,第i堆的负债(即b[i]),转让给第i+1堆(b[i+1]+=b[i]),第i堆归零,第i+1堆...

2020-05-06 23:57:42 232

原创 背包问题——求方案

一、求方案数此时要引入一个cnt数组,表示背包容积是i并且价值最大的方案数(注意是背包为i,并不是物品总体积是i)要注意:1.cnt[i]表示背包容积是i并且价值最大的方案数,因为cnt[i]的状态是背包容积是i,因此可以从cnt[i-1]这些值转移来,所以 最优解是cnt[m]2.初始化,没有读入任何物品,因此每一种体积下的最优方案都是13。外层循环 n 次,每次读入新物品的 v,w...

2020-04-29 16:30:20 279

原创 哈希表

哈希表是通过取模的方式将较大范围的数映射到一个较小范围。取模的话容易产生冲突,即不同的数映射到同一个数,通过调整模的大小可以减少冲突,一般对质数取模。但仍会有冲突,有两种可以解决冲突的方法:1.拉链法 、 2.开放寻址法1.模拟散列表i)拉链法通过链表的方式存储冲突元素:如果映射到一个相同的数,则在该数下延伸出一条链,链上挂着原数。#include <iostream>...

2020-04-16 14:51:07 235

原创 模拟堆

首先从要求入手:因为要对第k个插入的数进行操作,所以需要添加一个ph(pointer heap)数组,即用来索引第k个插入的数在堆中的下标。这样当我们需要删除第k个插入的数时,通过ph[k]就能找到它在堆中的下标,然后和堆尾元素交换,再对堆中下标是k的数up、down一遍即可。似乎一个ph数组足够了,为什么还要hp数组呢?原因就在于,当我们交换两个元素时,输入的是堆中的下标,那么此时必须要有一...

2020-04-16 11:00:44 252 2

原创 KMP

#include <iostream>#include <cstring>using namespace std;const int N = 10010 , M = 100010;int ne[N];int n , m;char p[N] , s[M];int main(){ cin >> n >> p + 1 &gt...

2020-04-15 17:09:53 122

原创 acwing802.区间和——离散化

acwing802.区间和即:数据十分稀疏。离散化就是一个映射的过程,将数据变得紧凑,便于处理。模板如下vector<int> alls; // 存储所有待离散化的值sort(alls.begin(), alls.end()); // 将所有值排序alls.erase(unique(alls.begin(), alls.end()), alls.end()); // 去...

2020-04-13 17:09:26 260

原创 acwing——贪心区间问题

1.区间问题1.区间选点算法思路:1.先将所有区间以右端点升序排序2.将定位到的区间右端点和接下来的区间左端点比较,如果找到一个区间左端点比定位区间右端点大,此时说明两区间中间有空档,将定位移到该区间右端点,直到循环结束。证明正确性:假定我们的答案是ans,求出来的是cnt,要想证明cnt = ans ,只要证明ans≤并且ans≥cnt。(1)显然ans≤cnt(2)因为自增cn...

2020-04-04 17:56:05 301

原创 acwing——线段树

主要操作:1.pushup:由子节点算父节点 ; pushdown2.build:将一段区间初始化成一棵线段树3.modify:修改某一个点或一个区间(需要用到懒标记)4.query:查询某一段区间的信息线段树是一棵满二叉树,用一维数组存。如果一个点的编号是x:父节点x>>1,左子节点x<<1,右子节点x<<1|1因为倒数第二层约有n个点,因此除最...

2020-04-04 16:58:31 625

原创 acwing——二分图

1.染色法判断二分图二分图:如果点集V可以被划分成两个互不相交的点集,并且这个图中的所有边的两个顶点分别属于两个不同的点集,则称该图为二分图。奇数环:由奇数条边组成的环。如果一条边的一个顶点属于点集V,那么另一个点必属于点集W。如果存在奇数环,那么就会存在矛盾。判断:只要没有奇数环,就是二分图。#include <iostream>#include <cstring&...

2020-04-03 21:03:48 217

原创 acwing动态规划(三)——数位统计、状压DP、树形DP、记忆化搜索

数位统计1.计数问题题目:算法思路:因为求的是一个区间内的值,所以利用前缀和思想。求出1~n中,x出现的次数即可。q:如何求出1~n中,x出现的次数?a:求出x在每一位上出现的次数。...

2020-03-28 16:16:51 372

原创 acwing动态规划(二)——线性DP、区间DP、计数类DP

1.线性DP递推的顺序是线性的。1.数字三角形算法思想:自上而下,判断可以选择的两个数中较大的那个。#include <iostream>#include <cstring>using namespace std;const int N = 510;int f[N][N];int main(){ int n ; cin >&g...

2020-03-27 11:51:53 369

原创 树状数组

树状数组作用:1.快速求前缀和O(logn)2.修改某一个数O(logn)(折中)基于二进制第一个区间的长度是x二进制中最后一个1对应的次幂第二个区间的长度是x-2i1二进制中最后一个1对应的次幂以此类推…即 (L,R]的长度是R的二进制表示的最后一个1对应的次幂这里需要引入一个lowbit()函数:lobit(x) = x & -x利用这个函数可以求出x的二进制表示...

2020-03-25 00:13:28 145

原创 最小生成树——Prime Kruskal

Prime算法核心:以点为参照,依次找到距离树最近的点,并入树中。无负边。#include <iostream>#include <cstring>using namespace std;const int INF = 0x3f3f3f3f;const int N = 510;int d[N]; //其他点到树上的距离int g[N][N];...

2020-03-22 21:35:52 189

原创 最短路径——Floyd Dijsktra

Floyd算法核心:通过比较 已有的路径长度和通过中转点t到达目标点的长度来求出任意两点间最短路径#include <iostream>#include <cstring>#include <algorithm>using namespace std;int n , m , k;int d[210][210];int x , y , z;...

2020-03-22 21:29:44 121

原创 状态压缩DP

玉米田(十字形)1.按二进制读入数据2.枚举所有方案,如果合理(一行中没有两两相邻的)就存储 i & (i << 1)3.因为每一层的状态只受上一层影响,因此循环两次所有合理方案,为每一个方案找到一系列下一层合理方案4.遍历每一行,并遍历每一行的所有合理方案,若与预处理不矛盾,继续遍历其下一行的所有合理方案,将情况累加。#include <iostream&...

2020-03-21 21:50:26 178

原创 acwing数学知识(三) 高斯消元 求组合数

1.高斯消元描述:解一个包含n个方程n个未知数的线性方程组算法流程:对每一列的系数进行如下操作1.找到一列中系数绝对值最大的一条方程(不考虑已经移动过的方程)2.将其移到最上方(同样不考虑移动过的方程)3.将该系数变为14.将下面的方程同一列的系数消为05.得到一个倒三角形方程组,即可求出解#include <iostream>#include <algori...

2020-03-19 19:50:38 322

原创 位运算

位运算题目:给定一个非空整数数组,除了某个元素只出现一此外,其余每个数都出现了2次。找出只出现过一次的那个元素。算法核心:利用⊕运算符,在位运算中,相同得0,不同得1。将整个数组遍历一遍后,最后剩下来的数就是只出现过一次的数,因为出现过两次的数被抵消了。a⊕b⊕a=b.int get(int a[]){ int ans = 0; for(int i = 0 ; i < n ; i...

2020-03-18 00:20:52 177

原创 acwing数学知识(二)欧拉函数 欧拉定理 快速幂 扩展欧几里得算法 中国剩余定理

1.欧拉函数1 ~ N 中与 N 互质的数的个数被称为欧拉函数欧拉函数的证明利用容斥原理,求1 ~N-1中与N互斥的数的个数s拆分出N的质因子p1、p2、p3…s = N - N/p1 - N/p2 - N/p3-…-N/pk+N/(p1*p2) + N/(p1*p2) + … + N/(p1*pk) + … + N/(pk-1*pk)- N/(p1*p2*p3) - N/(p1*p...

2020-03-14 01:06:33 738 2

原创 acwing动态规划(一)——背包问题

背包问题核心思想(1)01背包问题(物品只有1个)二维数组状态转移f[i][j] = max(f[i - 1][j] , f[i - 1][j - w[i]] + v[i])#include <iostream>#include <algorithm>using namespace std;const int N = 1010;int f[N][N]...

2020-03-13 17:53:30 305

原创 acwing数学知识(一)质数 约数

筛质数(yxc大佬的上课笔记)题目:给定一个正整数n,请你求出1~n中质数的个数。1.朴素筛法O(nlogn)把每个数的所有倍数筛掉void get_prime(int x){ for (int i = 2; i <= n; i ++ ) { if (!st[i]) primes[cnt ++] = i; for(int j = i + i ...

2020-03-12 12:28:17 653

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除