- 博客(178)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Codeforces Round #702 (Div. 3) A—G
A. Dense Array直接模拟即可。#include <bits/stdc++.h>#define inf 0x3f3f3f3f#define INF 0x3f3f3f3f3f3f3f3f#define ll long long#define ull unsigned long long#define PII pair<int, int>#define PLL pair<ll, ll>#define PIL pair<int, ll>
2021-02-22 12:45:40
193
1
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 写代码时经常出错的点(持续更新)
考虑数据范围不能只看输入的范围和结果的范围,计算过程中的范围也一定要考虑,比如输入n个1e9,但是现在需要求前缀和,那么多个1e9相加一定会爆int,所以就要开long long。__int64,long long,int型之间的相加不能直接进行,只能同种类型相加。比如__int64 j和int i。i是不能和j进行加和操作的!除了返回值是void型的函数以外,其他所有的函数都需要明确写出返回值是什么,如果出现函数返回值不为void但是没有写任何return的情况的话会TLE!....
2021-02-09 16:32:34
696
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 线段树专题
敌兵布阵 HDU1166(单点修改 + 区间查询) 易#include <bits/stdc++.h>#define inf 0x3f3f3f3f#define INF 0x3f3f3f3f3f3f3f3f#define ll long long#define ull unsigned long long#define PII pair<int, int>#define PLI pair<ll, ll>#define PIL pair<int, ll
2021-01-24 11:20:25
117
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
转载 multiset用法总结(可重复的set)
c++语言中,multiset是库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,而且他能时刻保证序列中的数是有序的,而且序列中可以存在重复的数。简单应用:通过一个程序来看如何使用multiset:#include <string>#include <iostream>#include <set>using namespace std;void main(){ intx; scanf("%l
2021-01-21 10:44:25
3581
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 ICPC2019徐州区域赛复现赛
C < 3 numbers教训就是不能看见素数就不管三七二十一直接上线性筛板子,还是需要多仔细想想题意。题解:解法一这是一道素数密度的题目,首先需要推出一个结论。一个常识就是素数越往后是越来越分散的。观察素数表以后可以发现从100左右开始,如果区间长度超过了50(估计值),那么区间内的素数一定小于1/3.。如果区间的长度小于50,那么对于这个区间内的所有数做一遍√n的素数判断就可以。代码:#include<bits/stdc++.h>#define ll long long
2021-01-17 14:43:56
171
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 大数模板(加减乘除)
加// C = A + B, A >= 0, B >= 0vector<int> add(vector<int> &A, vector<int> &B){ if (A.size() < B.size()) return add(B, A); vector<int> C; int t = 0; for (int i = 0; i < A.size(); i ++ ) {
2021-01-17 08:57:06
93
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 多源最短路问题(迪杰斯特拉变形)
题目题意大概就是给你p个点,要你求出每个点离其它p-1个点中最近的点的距离。开始看见多源最短路就想用Floyd,一看数据量 1e5,直接嗝屁。后来百思不得其解。 在逛了一大堆大佬的题解之后终于有点明白。首先放弃了Floyd之后我们可以想想其他的解法,p遍djikstra是复杂度是O(p * mlogn), p 和 m都是1e5,直接爆炸。那我们想想看能不能将djiksra优化一下呢?既然有多个起点,那么我们在djikstra开始的时候就将所有起点放入优先队列中,然后开始正常松弛。很容易发现这样松
2021-01-15 15:06:35
526
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 图论大纲(更新中)
图论基础图的建立DFS与BFS拓扑排序最短路(难点在于从题目里提取出信息,建图,侧重于实现算法)最小生成树二分图:染色法、匈牙利算法图的建立邻接矩阵 —— 适用于稠密图(m接近于n2)邻接表—— 适用于稀疏图(m接近于n)DFS与BFS拓扑排序拓扑排序(DAG图上的BFS)最短路(难点在于从题目里提取出信息,建图,侧重于实现算法) 单源最短路一般在图论中,源点就是起点,其实也就是单起点的最短路。所有边权都是正数稠密图(m接近n2)——朴素版的Djikstra 
2021-01-12 18:02:44
101
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 CCUT 2021寒假二期集训 训练赛1 补题
C - Bob’s Problem题目大意就是有黑边和白边,白边有数量限制,但是黑边没有,问连通图的最大权值和(注意已经联通之后也可以加边)。就是一个最大生成树的问题,但是需要贪心求解。首先黑边只要有我们都可以连上,因为黑边只要少连了一条我们的权值和都会减少。然后将所有的白边排序,贪心的从权值大的边开始判断,如果这条边可以使当前图的联通块减少的话,就加入这条边,将题目给的白边数量减一,并标记这条边。如果for一遍白边进行上述操作之后白边的数量还没有用完,就从权值大的白边遍历到权值小的白边,如果这条边没
2021-01-11 19:26:50
147
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 块状链表(STL rope)
块状链表(STL rope)首先介绍一下块状链表。我们都知道:数组 具有 O(1)的查询时间,O(N)的删除,O(N)的插入。链表 具有 O(N)的查询时间,O(1)的删除,O(1)的插入。既然数组和链表各有优劣,那么我们为何不将链表和数组组合起来,一起来均摊时间呢?做法就是维护一个链表,链表中的每个单元包含一段数组,以及这个数组中的数据个数。每个链表中的数据连起来就是整个数据。时间复杂度证明:设链表的长度为a,每个单元中数组的长度为b。那么无论是插入还是删除,在寻址的时候都要遍历整个
2021-01-05 15:30:24
2356
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 第 45 届国际大学生程序设计竞赛(ICPC)亚洲网上区域赛模拟赛 A-Easy Equation (差分优化枚举)
题目题意很简单,就是要你求所有满足x + y + z = k的方案数。直接一个个枚举的话太慢了,接近1e24。我们考虑用差分去优化枚举。怎么优化呢。我们先来考虑x + y的得数情况,可以枚举x。x + y的范围一定是在[x,x+b]的,也就是说,对于每个x来说,x + y的得数就是从 x ~ x + b的所有数,也就是这个区间都加上1,用差分来维护。枚举一遍x之后就能得到一个x + y得数的差分数组,将差分数组做一个前缀和操作就能得到实际的每个得数的个数。这是第一层差分数组。之后,同样考虑
2021-01-03 15:02:13
216
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 计算代码运行时间
#include <bits/stdc++.h>using namespace std;#define ll long long#define fi first#define se second#define endl '\n'#define debug(x) cout << #x << " = " << x << "\n"const int N = 1e7;int a[N], p[N], cnt; //a数
2021-01-03 10:07:01
227
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 快速幂(递归写法+迭代写法)
ll ksm(ll a, ll b, ll mod){ ll res = 1; while(b) { if(b & 1) res = res * a % mod; a = a * a % mod; b >>= 1; } return res;}
2021-01-02 15:04:13
290
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 求全是1的联通块的块数(模板)
int j; for(int i = 0; i < n; i = j) { for(j = i; j < n && a[j] == a[i]; j ++); if(a[i] == 1) ans ++; }
2020-12-01 20:34:35
126
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 通过前序遍历,后序遍历,中序遍历的任意两种建立一棵树(对数组指针的运用)
二叉树的遍历主要有三种:(1)先(根)序遍历(根左右)(2)中(根)序遍历(左根右)(3)后(根)序遍历(左右根)举个例子:先(根)序遍历(根左右):A B D H E I C F J K G中(根)序遍历(左根右) : D H B E I A J F K C G后(根)序遍历(左右根) : H D I E B J K F G C A 以后(根)序遍历为例,每次都是先遍历树的左子树,然后再遍历树的右子树,最后
2020-11-25 19:21:59
287
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 解决联通块问题的一般方法
7-10 红色警报 (25分)战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报。输入格式:输入在第一行给出两个整数N(0 < N ≤ 500)和M(≤ 5000),分别为城市个数(于是默认城市从0到N-1编号)和连接两城市的通路条数。随后M行,每行给出一条通路所连接的两个城市的编号,其间以1个空格分隔。在城
2020-11-13 10:59:13
374
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 二分答案的使用前提
二分答案基于二分原理,即用二分的思想快速“猜出”最合适的答案。当且仅当:题目难以用直接数学方法解出;题目用逐步验证的方法相对容易解出,但暴力枚举又容易超时;答案有确定的范围,且范围时间上允许二分答案(时间复杂度一般近似O[lg(right-left+1)];问题的答案是单调的(反复强调的重点,即mid不可能同时存在满足和不满足两种状态),即当验证答案X满足条件,则[n,right]或[left,n]也一定满足;不满足时,也可表明[left,n]或[n,right]也一定不满足。满足以上条件时
2020-10-02 09:36:52
234
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Hash表(离散表)
Hash表一般是用来缩小数据空间的一种数据结构。比如现在有一些数的范围是-1e9~1e9,我们需要知道某个数字是否出现过,就需要用到Hash表。一般我们用取模一个可以接受的范围内的最大素数的方法来Hash(如我们的数据可以接受在1e5,那么找到大于1e5的第一个素数,将所有的原数对这个素数取模)。一般Hash表都会有冲突的位置,即多个数字共用了一个位置。正常情况下有两种减少冲突的方法:拉链法拉链法用到了数组+链表,即如果Hash表在一个位置上有多个数字的话,可以将他们放在这个位置的一条链表上
2020-10-01 16:43:55
602
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 逆元的求法(分mod是素数和非素数的情况)
当mod是素数的情况,可以直接使用递归求逆元:LL inv(LL i){ if(i==1)return 1; return (mod-mod/i)*inv(mod%i)%mod;}时间复杂度:O(logmod);当mod不是素数且很大的情况,使用扩展欧几里得算法求逆元LL exgcd(LL a,LL b,LL &x,LL &y)//扩展欧几里得算法 { if(b==0) { x=1,y=0; return a
2020-09-30 18:33:17
2195
1
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 整型二分答案(bound search模板)
前言:二分算法的本质不是单调性,而是渐进边界性。没有单调性的问题也可以用二分来解决。解决所有整数二分的时候,首先先根据所要求的性质,看一下如果是true的时候,边界应该是r= mid还是l=mid,如果是l=mid,那么mid要等于r+l+1>>1。二分是一定有解的。例:有一个前缀和数组,给你一个数n,你需要求n是在哪一个前缀和数组内。a【0】 = 3;a【1】 = 8; a【2】= 15;a【3】 = 24;true尽量是>=,也就是区间的要求的值的右边。二分的结束条件是whi
2020-09-18 21:26:18
95
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 向上取整,向下取整以及四舍五入
设a为一个实数。向上取整向下取整四舍五入向上取整判断a是否等于(int)a,如果不相等,说明a是一个>(int)a的实数,所以将(int)a + 1就能得到a向上取整的结果。向下取整强制转换为int型,就可以达到向下取整的效果,如:double a = 1.6; (int a) = 1;四舍五入根据题目给定的精确到第几位小数,这里假设精确到小数点后一位,先将a + 0.5,再将a强制转换为int型(即向下取整),得到的数就是a四舍五入的结果。...
2020-09-17 11:11:19
596
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 排序模板
快排模板:void quick_sort(int q[], int l, int r){ if (l >= r) return; int i = l - 1, j = r + 1, x = q[l + r >> 1]; while (i < j) { do i ++ ; while (q[i] < x); do j -- ; while (q[j] > x); if (i < j)
2020-08-01 14:32:01
92
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Trie树(字典树,前缀树)
前言字典是干啥的?查找字的。字典树自然也是起查找作用的。查找的是啥?单词。看以下几个题:1、给出n个单词和m个询问,每次询问一个单词,回答这个单词是否在单词表中出现过。答:简单!map,短小精悍。好。下一个2、给出n个单词和m个询问,每次询问一个前缀,回答询问是多少个单词的前缀。答:map,把每个单词拆开。judge:n<=200000,TLE!这就需要一种高级数据结构——Trie树(字典树)什么是字典树?叫前缀树更容易理解字典树的样子黑色的点就是插入一个单词时候的结束
2020-07-31 10:02:54
278
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 读入,输出优化模板
int read()//读入优化{ int x=0; char c=getchar(); while(c<'0'||c>'9') c=getchar(); while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar(); return x;}void write(int x)//输出优化{ if(x<0) putchar('-'),x=-x; if(x>9)
2020-07-24 18:17:30
109
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 最长公共子序列(DP)
给定两个长度分别为N和M的字符串A和B,求既是A的子序列又是B的子序列的字符串长度最长是多少。输入格式第一行包含两个整数N和M。第二行包含一个长度为N的字符串,表示字符串A。第三行包含一个长度为M的字符串,表示字符串B。字符串均由小写字母构成。输出格式输出一个整数,表示最大长度。数据范围1≤N,M≤1000输入样例:4 5acbdabedc输出样例:3问题要求找出a与b最长的公共子序列,那么就需要找出a的所有子序列和b的所有子序列,然后对比找出最长的公共子序列,最坏的情况下
2020-07-20 10:41:44
1254
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 拓扑排序(DAG图上的BFS)
拓扑排序指的是在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。先统计所有节点的入度,将入度为0的节点分离出来,并存下这个节点,然后把这个节点指向的节点的入度减一。一直做改操作,直到所有的节点都被分离出来。如果最后不存在入度为0的节点,那就说明有环,不存在拓扑排序,也就是很多题目的无解的情况。下面是算法的演示过程。需要注意的是拓扑排序的序列不唯一。下面是演示代码:#include<iostream>#include<stdio.h> #i
2020-07-16 22:57:02
493
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
转载 map常用用法详解
map翻译为映射,也是常见的STL容器在定义数组时(如int array[100]),其实是定义了一个从int型到int型的映射比如array[0]=25、array[4]=36就分别是将0映射到25、将4映射到36一个double型数组则是将int型映射到double型,如db[0]=3.14,double[1]=0.01但是,无论是什么类型它总是将int型映射到其他类型这似乎表现出一个弊端:当需要以其他类型为关键字来做映射时,会显得不太方便例如有一本字典,上面提供了很多的字符串和对
2020-05-11 14:32:15
352
原创 没有任何成员函数和成员变量的类的大小是多少?
编译器不允许一个类的大小为0,会为它分配1字节的内存。一个空类对象的大小是1byte。这是被编译器安插进去的一个字节,这样就使得这个空类的两个实例得以在内存中配置独一无二的地址。
2023-05-25 12:02:54
198
原创 C++ 动态绑定和静态绑定
静态类型:对象在声明时采用的类型,在编译期既已确定;动态类型:通常是指一个指针或引用目前所指对象的类型,是在运行期决定的;静态绑定:绑定的是静态类型,所对应的函数或属性依赖于对象的静态类型,发生在编译期;动态绑定:绑定的是动态类型,所对应的函数或属性依赖于对象的动态类型,发生在运行期;非虚函数一般都是静态绑定,跟声明时的类型有关;而虚函数都是动态绑定,跟指向的对象有关(如此才可实现多态性)
2023-04-28 11:04:00
280
原创 C和C++的区别
由于C++ 实现上比 C 更加复杂,编译器实现自然也更为复杂,这就使得 C++ 代码在不同的系统上的行为尤为不同。当一个项目需要使用一个旧的 C++ 版本时,代码库极有可能无法与新版本的C++ 兼容,这就需要程序员进行大量改写。:C++ 包含了更多的语法和概念,例如继承、多态、模板等,使得学习和使用起来比 C 更加复杂。同时,C++ 的复杂性也导致了更容易出现代码错误或者设计上的不合理,这需要程序员有更高的技术水平接受挑战。:C++的STL库是一个非常强大和高效的数据结构和算法库,可以大大提高编程效率。
2023-04-27 21:59:42
4768
1
原创 C++ 野指针
所谓野指针(wild pointer),简单讲是指指向不可用的内存区域的指针。需要注意的一点是,野指针与NULL空指针是不同的。NULL指针一般比较好判断,直接用if (p==NULL)语句判断即可。但是野指针是指向垃圾内存区域的指针,野指针会指向一段实际的内存,只是它指向哪里我们并不知情,或者是它所指向的内存空间已经被释放,所以在实际使用的过程中,我们并不能通过指针判空去识别一个指针是否为野指针。避免野指针只能靠我们自己养成良好的编程习惯。
2023-04-27 02:36:14
967
原创 C++ 智能指针
智能指针是一种现代C++中非常常用的数据结构,它的作用是在动态内存管理时帮助我们更安全、更方便地使用指针,避免出现常见的内存泄漏等程序错误。智能指针是一个类模板,它们封装了指向动态分配对象的指针,并且支持自动释放内存、自动调用析构函数等功能,可以解决在程序中容易出现的内存泄漏问题。使用智能指针可以在一定程度上避免裸指针的操纵造成的错误,可以更容易地管理对象的内存生命周期,从而简化了C++程序的开发和维护。C++中有多种类型的智能指针,包括unique_ptr、shared_ptr和weak_ptr等。
2023-04-04 11:13:23
219
原创 new和malloc的区别
异常处理:new 能够抛出 bad_alloc 异常,这是在运行时发现它无法为程序提供所需大小的内存时发生的。new会自动调用构造函数并返回指向对象的指针,而malloc只是返回分配空间的地址,不会调用构造函数。new和malloc都是在动态内存分配时使用的。综上所述,new更适用于C++中创建和初始化对象,而malloc更适用于纯C语言中进行内存分配。内存分配大小:new运算符需要指定类型,而malloc所分配的内存大小则是以字节为单位。语法:new是C++特有的运算符,而malloc是C语言中的函数。
2023-04-04 11:12:34
766
原创 C++ 虚函数与纯虚函数的区别
同:两者都是为了实现运行时多态。异:虚函数:子类可以复写(override)父类中的虚函数,也可以不复写。包含虚函数的类,可以有实例化对象。纯虚函数:子类必须要复写父类中的纯虚函数。包含纯虚函数的类,也被称为"抽象类",不能有实例化对象。只有实现了这个纯虚函数的子类才能有实例化对象。
2023-03-31 14:22:28
113
原创 c++17中的optional
类模板 std::optional 管理一个可选的容纳值既可以存在也可以不存在的值。在C/C++中,非指针如何表示一个空值。举一个例子,一函数用来创建一个类对象,如果它没有成功返回什么?像这种情况的解决办法,一般是搞这个bool值用来看是否执行成功,再来拿取对象;或者搞个魔数1,2,3等等来判断,原理都是一样。更或者,可以采用异常处理的方式,这个在c++里就有些惨不忍睹了。前者代码丑陋,后者是犯不着这么大费周章。那有没有一个类似于nullptr的东西呢?有,,它是空类类型用于指示。
2023-03-29 23:10:16
255
原创 C++ 17:string_view
是C++17所提供的用于处理的轻量。考虑一下这种场景,我们有一个字符串,然后我们想获取这个字符串中的某个子串,然后对这个字符串做一些只读操作,例如将其与其他字符串作比较,输出等。一般情况下,我们会使用,但是此时会新建一个对象,并且进行内存分配。但是大量的新建对象和分配内存会使得程序的性能降低,那么我们有没有什么方法来避免这个过程,提高性能呢?C++17给出的答案就是。同样获取一个子串,的操作是下和。省去了分配内存及赋值等操作。
2023-03-29 21:35:19
570
原创 C++ 仿函数
仿函数(Functor)又称为函数对象(Function Object)是一个能行使函数功能的类。仿函数本质上是一个类,只不过类里面重载了小括号。
2023-03-28 23:45:40
104
原创 TCP与UDP的区别
TCP协议的特点面向连接仅支持单播传输面向字节流可靠传输提供拥塞控制 : 当网络出现拥塞的时候,TCP能够减小向网络注入数据的速率和数量,缓解拥塞。UDP协议的特点面向无连接有单播,多播,广播的功能是面向报文的不可靠性头部开销小,传输数据报文时是很高效的。
2023-03-28 23:30:28
76
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人