自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 git常用命令

设置用户名和邮箱git config --global user.name “123”git config --global user.email “123@qq.com”查看git配置git config --list本地搭建仓库git init克隆仓库git clone [ssh的url]查看状态git status添加文件到暂存区git add [文件名]git add. 所有文件从暂存区提交到本地仓库git commit -m “消息内容”将本地仓库的东西提交到远程仓

2021-06-15 14:31:22 12

原创 C++ 手写vector

#include<iostream>using namespace std;template<typename T>class vector{private: int __capacity,__size; T* __a;public: vector():__capacity(0),__size(0),__a(nullptr){ cout<<"默认构造\n"; } vector(const vector&a

2021-06-13 15:03:30 25

原创 第 53 场双周赛 5756. 两个数组最小的异或值之和

这范围一看就是显然状压,刚开始一直想状压,因为这两个数组是独立的,然后发现只需要在开一维表示选了前i个即可dp[i][nxt]=min(dp[i][nxt],dp[i-1][st]+(nums1[i] ^ nums2[k]))其中st是第二个数组的二进制状态,nxt= st | 1<<k初始化的话就是一开始所有数字赋值无穷大然后dp[i][1<<j]=nums1[i] ^ nums2[j]class Solution {public: int dp[16][1&l

2021-05-29 23:59:13 20

原创 Docker常用命令

文章目录打开docker重启docker关闭docker一、帮助命令二、镜像命令1.查看本地主机的镜像2.搜索3.下载镜像 [分层下载 image核心 联合文件系统]4.删除镜像三、容器命令1.新建容器并启动2.列出所有的运行的容器3.退出容器4.删除容器5.启动和停止容器6.后台启动容器7.显示日志8.查看容器中进程信息9.查看容器元数据10.进入当前正在运行的容器11.从容器内拷贝出来到主机top四、其他打开dockersystemctl start docker重启dockersystemct

2021-05-24 02:54:48 24

原创 5765. 跳跃游戏 VII

思路每次可以选择给定区间的步数进行跳跃,并且要求达到的点权值为0.考虑一个点能达到,那么要求这个点满足两个要求1.当前权值为02.[i-ma,i-mi]这个区间存在可以跳到的点第一个条件直接判断即可,第二个条件呢?我们可以用前缀和保存能到达的点,那么就可以O(1)算出区间中是否有可达到的点就行了赛中有想到这个,但是忘记了为啥没写这个做法…计算上一个区间的时候要注意边界class Solution {public: bool canReach(string s, int minJu

2021-05-23 13:48:07 37 2

原创 c++11 emplace_back

emplace_back()是c++11引入的一个新特性,它是用来向STL容器中丢入元素到容器尾部的,那么它对比push_back()有哪些优化呢?写一个demo如下:为了防止vector扩容带来的影响,所以直接先reserve出10个位置#include<bits/stdc++.h>#include<time.h>using namespace std;class A{ public: A(int b):a(b){ cou

2021-05-20 21:50:40 16

原创 Linux目录结构

bin: 二进制可执行文件,比如常用指令cd、cp、ls、pwd等等boot: 跟引导有关的程序dev: 跟设备有关的文件(万物皆文件)etc: 几乎所有的配置文件home: 顾名思义,家文件,保存了每个用户的私有数据(root特殊 单独的)lib(library): linux运行的相关库文件media: 自动挂载目录mnt: 正常挂载目录,u盘、光盘(和media类似,但mnt一定有,media不一定有)opt: 一般用来装大型软件(根据规定 不强制)proc: 保存系统实时信息的虚.

2021-05-20 00:06:37 17

原创 第 52 场双周赛 1862. 向下取整数对和

前言上去一眼,感觉就是傻逼题,整除分块搞一下,复杂度也就sqrt(1)+sqrt(2)+…+sqrt(1e5) (没有仔细去算这个值是多少),感觉上大分了。。然后疯狂TLE test44后面算了一下上面那个式子,复杂度大概2e7,但是因为过程中还有反复的取模操作,所以稳稳的TLE了。。思路其实可以根据素数筛法来优化这个计算过程,我们计算一个数是不是素数,其实就是枚举sqrt以内的看能不能整除,这样子复杂度自然高,而素数筛则是反过来,我去枚举因子筛掉那些能整除的数。同理,整除分块是枚举这个值,看

2021-05-17 16:01:55 23

原创 socket编程初步

文章目录socket介绍网络通讯流程函数原型socketconnectbindlistenaccept示例代码服务端客户端socket介绍socket,又叫做套接字,其实个人感觉这个概念十分的抽象。在unix中,本着“一切皆文件”的原则,所以我们可以认为socket是一个为了完成当前任务而所创建的一个特殊文件,而网络通讯之间都通过这个socket来完成达到发送/接受数据的目的。网络通讯流程首先,服务端要先创建一个socket,称为监听套接字,然后对所需要进行监听的ip和端口进行绑定(ip可以理

2021-05-14 17:37:48 33 1

原创 第 240 场周赛 5753. 有向图中最大颜色值

虽然赛中做出来了,也是一眼拓扑排序,但是转移方程部分一开始想歪了,所以简单记录一下。(要是第一次没想歪,就上大分了)思路看到有向图,加上还需要判环,所以肯定想拓扑排序1.拓扑排序判环的话,我们只需要把入度为0的点加入队列中,不断的跑图即可,如果每个点都被到达了,说明不存在环。2.那么对于要计算的答案的话,因为小写字母只有26个,所以我们维护一下每个字符在该点能出现的最大次数即可。对于从点x到点y,即更新点y时候每个字符出现的最多次数dp[y][i]=max(dp[y][i],dp[x][i]+

2021-05-09 12:50:39 14

原创 c语言主函数后的参数

有的c语言程序的主函数是带有参数的,如下代码int main(int arg,char *argv[])那么这两个参数到底是什么呢?其实第一个参数,是命令行参数的个数第二个参数,是每个命令行参数的字符串的值什么意思呢?看一下下面代码就懂了。#include<bits/stdc++.h>using namespace std;int main(int argc ,char *argv[]){ cout<<argc<<endl; for(i

2021-04-25 15:19:03 46

原创 单例模式

文章目录单例模式懒汉式饿汉式单例模式单例模式是最常见的设计模式之一,其实就是只有一个实例,并且它自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。懒汉式一开始不创建,知道第一次调用的时候才进行创建,很懒的样子class Singleton{ private: Singleton(){} static Singleton* Instance; public: static Singl

2021-03-23 13:01:08 28

原创 5695. N 次操作后的最大分数和

思路看到范围应该想到dfs或者状压。那么为什么想状压,而不是dfs呢?首先dfs的话存在大量重复的可能。就是假设你前面都删除的都一样,但是到了后面的某一次操作选了不一样的,那其实最后一部分要去计算多次而已,但是跑dfs的话,前面一样的操作会大量的进行。dp[sta]表示当前选了的数字的二进制串为st时候的最大值。那么转移也很简单,我们从sta这个二进制串中去掉任意两个,枚举上一个二进制串last那么last其实就是sta(1<<i)(1<<j)维护dp[sta]的最

2021-03-21 13:56:19 60

原创 5711. 有界数组中指定下标处的最大值

思路首先很容易想到,答案具有单调性。我当前index值为mid的时候,如果整个序列总和小于等于maxSum,那么当前index值小于mid的时候一定满足。那么我们就尝试增大一下mid,如果满足继续增大…根据题目条件,注意两点1.都是正整数2.相邻两个差值最多为1那么我们知道当前a[index]=mid,就是尽可能让这个位置为最值点,其他位置尽量小。我们去计算左边部分,左边可以放index+1个数字(包括第index这个位置)那么其实就是往左边一直递减放就可以了。如果减到了1,因为要为正整

2021-03-21 12:45:52 33

原创 72.编辑距离

很经典的题。就是说给你两个字符串a和b,你可以对a或者b进行操作,每次操作可以增加、删除、或者修改一个字符。问最少操作多少次,可以让字符串a等于字符串b思路:对A增加 = 对B删除对A删除 = 对B增加修改A = 修改 B所以其实等价三种操作对A增加,对B增加,修改A我们定义dp[i][j]表示字符串a的前i个字符和字符串b的前j个字符的最小编辑距离那么其实,dp[i][j]可以由三种状态转移过来,也就是对应上面的三种操作dp[i][j]=dp[i-1][j]+1即表示a串的最后一个

2021-03-08 15:23:05 35 1

原创 leetcode 环形链表Ⅰ 和 环形链表Ⅱ

我们可以通过双指针做这题。快指针每次走两步,慢指针走一步考虑一下,如果由环,那么两个指针最后是在环上面的。那么因为快指针每次都比慢指针多走一步。所以距离每次会减少一,一定会相遇。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */clas.

2021-02-28 18:51:25 16

原创 操作系统常见面试题

文章目录1、进程和线程的联系与区别联系区别2、为什么需要有线程3、线程的类型用户级线程内核级线程4、并发和并行5、进程的状态6、进程调度算法①先来先服务 FCFS②短作业优先 SJF③最短剩余时间优先算法④时间片轮转⑤优先级算法⑥多级反馈队列7、上下文切换1、进程和线程的联系与区别进程:进程是一个有特定功能的程序在某个数据集合上的一次运行。线程:线程是系统调度的最小单位,包含在进程之中。联系进程可以有多个线程,最少包含一个线程,即主线程。一个线程只能属于一个进程。线程是进程执行的实体。区别1

2021-02-28 17:00:38 172

原创 5687. 执行乘法运算的最大分数

思路:这种选择的方式当然是dp来做啦dp[l][r]表示左边选了l个数字,右边选了r个数字的最大得分转移方程:dp[l][r]=max(dp[l-1][r] + mut[idx] * nums[l-1] ,dp[l][r-1] + mul[idx] * nums[n-r])其中idx=l+r-1方程应该比较好想到的,就是我要达到当前状态选左边的还是要选右边的才能最大,idx就是当前选了多少个,因为下标从0开始所以要减去1。class Solution {public: int max

2021-02-21 22:41:09 42 3

原创 5670. 互质树

思路首先容易发现num[i] 仅仅只有50.又因为树是一颗有层次的结构,当前节点的祖先节点,也就是从祖先结点一直到当前结点。而且要最近的。那么其实我们只需要更新路径上的值的拥有者即可。ok[i]=x 表示结点x的num[x]=i我们进行bfs,每次下传一个vector 保存了1到50的数值的拥有者。因为要离得最近的,我们这样子只是存了这个数值最近是谁的。可能当前数值和很多祖先互质。所以我们还需要用dep维护一个深度。儿子结点的深度等于当前结点深度+1代码class Solution {p

2021-02-21 00:17:27 34

原创 Codeforces Round #703 (Div. 2) D. Max Median

题意:给一个长度为n的序列,对于一个区间长度不小于k的子区间,中位数为这个区间排序后的第(k+1)/2个数字。现在求所有的长度不小于k的子区间,中位数的最大值是多少。思路:首先要想到,对于一个中位数,在这题中,对于偶数长度,取的中位数是靠左边的那个,那么大于等于中位数的就有一半以上。所以大于等于中位数的个数要比小于中位数的个数多。利用这点,那么其实我们可以在On复杂度判断出来一个数字是不是 ≤中位数。可以判断一个数是不是≤中位数?那么我们是不是可以去二分?其实这是有单调性的。判断一个数字是不是

2021-02-19 02:44:45 1120 4

原创 Codeforces Round #702 (Div. 3) G. Old Floppy Drive

题意:给了n个数字,成一个环,最开始在第一个数字的位置上,每次移动就是向下移动一格。m次询问,每次询问给出一个x,求最少要移动多少次,经过的数值之和≥x?思路:询问次数,显然,每次询问需要一个log的做法。我们维护一个前缀和sum,维护一个前缀和的最大值ma.对于x,如果小于等于ma[n],也就是不用完整移动一轮就能找到答案,容易知道ma是单调不降的,可以二分快速找到。对于剩下的,就说明ma[n]<x,那么我们要看每经过一轮大小会不会增加,因为x是正的。如果sum[n]<=0,经

2021-02-18 19:38:31 23

原创 C++为什么要将析构函数设为虚函数

首先我们知道虚函数是实现运行期的多态的。根据类型兼容原则,在需要基类指针的地方,都可以用派生类的指针去代替。如下代码,就实现了多态。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=2e5+50;int a[N];class A{ public: A(){ } ~A(){ } virtual

2021-02-18 00:51:13 77

原创 C++常见面试题

文章目录c++编译的过程指针跟引用的区别栈和堆的区别new和malloc的区别deine和const的区别const和static的用法conststaticconst和static在类中的注意事项c++编译的过程这是一个超链接编译预处理、编译、汇编、链接指针跟引用的区别1.指针可以为空,引用初始化必须绑定对象2.指针可以改变指向的地址,引用绑定后不能改变绑定的对象3.指针可以多级指向,引用不可以4.指针占内存,引用不占内存(有待证实)栈和堆的区别1.栈是系统自动分配的,而堆是程序员自

2021-02-11 19:16:42 192

原创 二叉树前序、中序、后序遍历递归与非递归版本、层序遍历

文章目录二叉树的层序遍历二叉树的前序遍历递归非递归二叉树的后序遍历递归非递归二叉树的中序遍历递归非递归二叉树的层序遍历思路:层序遍历采用队列即可。每次操作就是进行一层的遍历,将当前一层的值存进vector,并且如果当前节点的左右节点不为空,就丢进队列。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right;

2021-02-11 14:03:45 49 1

原创 1755. 最接近目标值的子序列和

思路:看到n是40,很容易想到复杂度是指数阶的。但是直接暴力枚举的话,2^40肯定TLE。那么很容易想到我们分开两部分 一部分各20个算出来所有组合情况。处理完所有组合情况后,我们对左半部分从小到大排序,对右半部分从大到小排序。这样子我们可以利用双指针计算出来答案。左半部分我当前指向了这个部分的最小值。右半部分我当前指向了这个部分的最大值。计算出来的x和goal去比较,如果x>goal,那么我们要去减少x,那么其实就只能移动右半部分的指针,因为右半部分才能减小。如果x<goal,

2021-02-08 19:14:33 30

原创 数据库面试常见问题

1、数据库 上数据库 中数据库 下2、24 个必须掌握的数据库面试问题!

2021-02-08 14:57:40 127

原创 计算机网络面试常问

三次握手第一次握手:客户端将SYN的标志位置为1,随机产生一个数值c,作为数据包的序列号seq,即seq=1,然后发送数据包给服务端第二次握手:服务端收到了来自客户端的报文,通过SYN=1,知道了这是要请求建立连接,于是服务端先随机生成一个数值s作为自己数据包的序号,即seq=s,然后在TCP首部的确认应答号ack=c+1 ,将SYN和ACK的标志位置为1,然后发送报文给客户端。第三次握手:客户端收到了来自服务端的应答,还需要想服务端回应最后一个应答报文。将应答报文TCP首部的ACK标

2021-02-04 19:22:24 235

原创 C++ 多态

多态的概念多态是指在同样的消息在被不同类型的对象接收时导致不同的行为。这里的消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。简单的例子就是运算符,比如运算符的"+",可以实现整型与整型、浮点与浮点之间的加法。如果是不同类型的变量相加,比如整型和浮点,就先将整型转为浮点在相加。多态的类型面向对象的多态性可以分为四类:重载多态、强制多态、包含多态、参数多态。前两种统称为专用多态,后两种统称为通用多态。①重载多态:包含普通函数的重载、类的成员函数的重载、运算符的重载。

2021-02-02 19:48:34 29

原创 C++ 函数重载

函数重载对于一些具有相同功能的函数,我们希望他们的函数名字希望都一样,但是参数的类型和个数不一样,这怎么办呢?这就用到了函数重载。重载函数是用来实现功能类似,而数据类似不同、或者数据个数不同的问题下面这个是重点两个重载函数必须在下列一个或两个方面有所区别:1、函数的参数个数不同。2、函数的参数类型不同或者参数类型顺序不同,即两个重载函数的形参部分必须至少满足上述条件之一,与返回值类型无关其实笔者的个人理解就是,对于两个同名函数,对他们的参数表按顺序对比,只要有一个数据类型不同或者一个有一个没

2021-02-01 17:52:31 22

原创 5666. 回文串分割 IV

思路:其实就是枚举第二个回文串的起点和终点,这样子,三个回文串的起点和终点都有了。只要三个区间都是回文即可。那么我们考虑如何判断一个区间是不是回文串呢?做法有很多,这里n只有2000所以允许n^2的做法 我们可以枚举回文中点去左右拓展,也可以去区间dp这里介绍的是区间dp。dp[i][j]表示第i个字符到第j个字符之间是不是回文串 是的话就为1,不是就为0l==r 显然dp[l][r]=1l+1==r dp[l][r]= s[l] == s[r]其他 即r-l+1>=3 dp[l][r]

2021-01-31 13:26:11 22

原创 归并排序

归并排序基本思想归并排序是每次选取当前序列的中点,分为两部分,继续递归下去,直到左右两部分已经有序,然后合并的话,利用一个数组从小到大存下来左右两部分的值,然后从左端点到右端点依次赋值即可,存两部分的值其实是用到了双指针的思想代码#include<stdio.h>const int N=1e5+50;int a[N],temp[N];void merge_sort(int l,int r){ if(l>=r) return ; int mid=l+r>&

2021-01-29 22:45:23 18

原创 C++ 继承

1、类的继承类的继承指的是,新的类从已有的类中获得已有的特性。新的类成为派生类,也叫子类,被继承的类叫做基类,也叫做父类。下面是继承的基本格式class 派生类:继承方式 基类1,继承方式 基类2,......,继承方式 基类n{}在C++中,允许多继承下面代码段是D以公有继承的方式继承了A,以私有继承的方式继承了B,以保护继承的方式继承了C三种继承方式的说明会在下文提到class A{};class B{};class C{};class D:public

2021-01-29 21:55:51 25

原创 C++ 友元

友元关系的引入考虑一个问题,对于一个Point类,用来保存一个坐标,即它有两个实数型变量是它的坐标,那么我们现在想要计算点与点之间的距离,这个函数要放在哪里比较合适?①放在类中作为类的成员函数吗?但是这个函数不属于单独的一个点,也不属于Point类。②放在类的外面定义为普通函数吗?但是这样就体现不了这个函数与Point类的关系,并且不能直接访问点的坐标(私有成员)所以这里就引入了友元关系友元关系:提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制也就是说通过友元关系,

2021-01-27 15:49:14 35

原创 快速排序

原理本质其实是一个分治的过程,每次选定一个基准,将小于等于基准的都移动到左边,将大于等于基准的都移动都右边。然后继续递归跑基准左右两部分。代码实现#include<stdio.h>const int N=1e5+50;int a[N];void quick_sort(int l,int r){ if(l>=r) return ; int i=l-1,j=r+1,x=a[l+r>>1]; while(i<j){ do i+

2021-01-26 00:05:12 28

原创 C++ 析构函数

1、析构函数析构函数,其实就是构造函数的相反操作,构造函数是创建对象时候,用来给对象的成员数据赋值的,而析构函数是用了清理对象的。2、析构函数的特点①析构函数就是位取反运算符+类名表示。②构造函数可以有多个,而析构函数只能有一个,不可重载,不能有参数。③与构造函数相同,析构函数没有返回值。如果没有显式写出析构函数,编译器会自动加上一个默认的析构函数,如果写了的话,就不会再加。#include<bits/stdc++.h>using namespace std;class Poin

2021-01-25 17:21:15 39

原创 leetcode 第225场周赛 题解

替换隐藏数字得到的最晚时间思路:直接暴力判断赋值即可。class Solution {public: string maximumTime(string t) { if(t[0]=='?' && t[1]=='?') t[0]='2',t[1]='3'; else if(t[0]=='?'){ if(t[1]>='4') t[0]='1'; else t[0]='2'; }

2021-01-24 21:40:24 79 1

原创 leetcode 第44场双周赛 题解

找到最高海拔思路:前缀和一下,恢复原来的序列,然后维护个max即可class Solution {public: int largestAltitude(vector<int>& gain) { int ma=0,now=0; for(auto &x:gain){ now+=x; ma=max(ma,now); } return ma; }};

2021-01-24 17:07:25 27 1

原创 C++ 构造函数

1、默认构造函数以及构造函数的重载默认构造函数,即创建对象时,会自动执行的函数。如果不写的话也是可以的,编译器在执行时候发现类中没写构造函数,会自动给类中加上一个无参的构造函数,即默认构造函数。但如果你自己编写了构造函数的重载,编译器识别到了存在构造函数,那么空参的构造函数就不会自动给你加上去, 所以建议手动写上默认构造函数。#include<bits/stdc++.h>using namespace std;class A{ //类的外部接口 public:

2021-01-24 16:42:30 68

原创 2020上海ICPC B.Mine Sweeper II

思路:考虑一个二元关系(点,雷),要想到我们把整张图取反后,这个二元关系的个数是不变的想到这点这题其实就已经过了。我们计算一下图A和图B两张图不同的个数有多少个,如果少于一半,那么B可以变成A,所以输出A即可。如果大于一半呢?我们知道取反后二元组个数是不变的。所以我们对A进行取反,这样子,现在不同的个数就是没取反时候相同的个数,是小于一半的,并且满足要求,因此只需要输出A的补图即可。#include<bits/stdc++.h>using namespace std;char s[

2021-01-15 22:49:15 31

原创 2020济南ICPC D.Fight against involution

题意:给了n个人,每个人的写的单词个数在一个区间,最开始每个人都选择区间最右端点为自己写的单词个数,每个人的得分为n - 写的单词数大于他的人数现在让你给每个人选择写的单词数,要求得分不低于他们自己选的。思路:以右端点为第一优先级,左端点为第二优先级,从小到大排序。对于右端点一样的,我们让他们的选择都一样,并且左端点尽量小,但是要大于等于上一个人的分数这里要注意是可以取等号的因为排名与写的单词数大于他的有关,所以可以取到一样,这样每个人的得分都不低于自己的最开始希望。#include<bit

2021-01-07 22:51:25 78

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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