ACM
文章平均质量分 50
程勇uestc
电子科大
展开
-
红黑树笔记
0、2-3树满足二分搜索树的基本性质节点可以存放一个元素或者两个元素,分别称为2节点和3节点2-3树绝对平衡2-3树的插入:假设依次插入42,37,12,则首先创建一个节点42,37来之后会和42节点合并形成一个3节点,12来后会先暂时和42,37形成节点[12,37,42],然后进行分裂,37为根,12为左子树,42为右子树红黑树和2-3树的等价性:所有红色节点向左倾斜1、红黑树特性红黑树是一颗二叉搜索树根节点是黑色(2-3树中两种节点显然易得)叶子节点(空节点)是黑色红原创 2021-07-31 21:50:11 · 432 阅读 · 0 评论 -
卡特兰数应用
详见卡特兰数原创 2021-05-27 15:49:21 · 295 阅读 · 0 评论 -
IEEEXtreme 刷题(动态规划)
刷题网址:https://csacademy.com/contest/archive/Divisor Clique\quad一个简单的dp,首先将数组从小到大排序,假设dp[i[表示使用排好序的数组前i个数并且使用第i数的情况下能得到的最大子集,则dp[i]=max(dp[j]+1),j≤i且a[i]%a[j]=0dp[i] = max(dp[j]+1),j\le i且a[i]\%a[j]=0dp[i]=max(dp[j]+1),j≤i且a[i]%a[j]=0。程序如下:#include <i原创 2020-10-19 17:43:31 · 1613 阅读 · 0 评论 -
IEEEXtreme Game of life
\quad这是一个很有意思的模拟题,模拟生命游戏,规则如下:任何有两个或三个活邻居的活细胞都可以存活。具有三个活动邻居的任何死单元都将变为活动单元。所有其他活细胞将在下一代死亡。同样,所有其他死细胞仍保持死亡状态。\quad按照题目要求去模拟,数组大小为25∗2525*2525∗25,模拟轮数高达10710^7107,直接暴力模拟的话时间复杂度为25∗25∗8∗107=5∗101025*25*8*10^7=5*10^{10}25∗25∗8∗107=5∗1010,肯定超时。刚开始博主不加优化的模拟原创 2020-10-10 17:15:46 · 750 阅读 · 1 评论 -
快速求n阶乘在b进制下的末尾0数
\quad思路就是先将b分解质因数,得到每个质因子及其出现次数,然后计算n!n!n!中各个质因子出现次数t,最后将t除以其对应质因子的出现次数,取最小值即可。long long zeros(long long b, long long n){ map<long long, long long> mp; long long res = 1e18; // 将b分解质因数,存在mp中 for(long long i = 2; i * i <= b; i ++原创 2020-10-10 09:48:08 · 846 阅读 · 2 评论 -
异或操作在算法竞赛中的应用
一、前缀异或场景:给你一个数组arr,需要在O(1)O(1)O(1)时间内查询得到arr[l]到arr[r]arr[l]到arr[r]arr[l]到arr[r]的异或值。我们预处理一个前缀异或数组pre,注意pre[0]=0,pre[1]=arr[0],pre[n]=pre[n-1]^arr[n-1],这样输出pre[r+1]^pre[l]即为arr[l]到arr[r]arr[l]到arr[r]arr[l]到arr[r]的异或值二、求连续一段自然数的异或值long long get(long lo原创 2020-10-09 16:33:34 · 810 阅读 · 0 评论 -
CCF CSP 2013年12月 I’m stuck!
\quad这就是一个搜索题,DFS和BFS均可。需注意搜索的时间复杂度为O(m2n2∗4)O(m^2n^2*4)O(m2n2∗4),最多每个有4个搜索方向。故而计算量达到2.5∗1072.5*10^72.5∗107,稍不留神就超时了。所以需要写程序的时候进行一些优化,比如存放各个字符对应哪些搜索方向就不要采用判断或者map存放,会导致最后一个点超时。#include <iostream&...原创 2020-03-29 21:34:26 · 1166 阅读 · 0 评论 -
CCF CSP 201409-4 最优配餐
\quad这个题主要考察多源BFS,有几个坑点如下:实现上尽可能高效,博主在使用cin,cout时最后两个测试点超时队列中每个点信息存储时尽量用结构体,博主最开始用queue里面嵌套vector得的方式存储每个点信息,超时最后的结果可能会爆int,最多有大约1000*1000个用户点,每个点最多参量为1000,距离供货点最远为2000,完全可以爆int。故用long long存储结果...原创 2020-03-29 20:23:34 · 1292 阅读 · 0 评论 -
最长回文子串的几种求法
题目链接:最长回文子串一、暴力求解O(n3)O(n^3)O(n3)\quad直接枚举两端点i,ji,ji,j,再判断字符串s[i,,,j]s[i,,,j]s[i,,,j]是否是回文串,一共三重循环。class Solution {public: string longestPalindrome(string s) { int n = s.length(); ...原创 2020-01-29 20:24:07 · 1450 阅读 · 0 评论 -
背包九讲
一、01背包要求:每种物品只能选择0个或1个,即对于每种物品只有选或者不选两种情况。题目描述:(题目链接)\quad有 NNN 件物品和一个容量是 VVV 的背包。每件物品只能使用一次。第 iii 件物品的体积是 viv_ivi,价值是 wiw_iwi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式:\quad第一行两个整数,N,VN...原创 2020-01-26 18:24:00 · 1298 阅读 · 1 评论 -
刷题篇-队列
一、小组队列题目描述:\quad有n个小组要排成一个队列,每个小组中有若干人。当一个人来到队列时,如果队列中已经有了自己小组的成员,他就直接插队排在自己小组成员的后面,否则就站在队伍的最后面。请你编写一个程序,模拟这种小组队列。输入格式:\quad输入将包含一个或多个测试用例。对于每个测试用例,第一行输入小组数量t。接下来t行,每行输入一个小组描述,第一个数表示这个小组的人数,接下来的数表...原创 2020-01-13 19:38:43 · 1424 阅读 · 0 评论 -
刷题篇-栈
一、设计一个最小栈题目要求:设计一个支持push,pop,top等操作并且可以在O(1)O(1)O(1)时间内检索出最小元素的堆栈。push(x)–将元素x插入栈中pop()–移除栈顶元素top()–得到栈顶元素getMin()–得到栈中最小元素样例:MinStack minStack = new MinStack();minStack.push(-1);minStack.p...原创 2020-01-11 18:47:25 · 1453 阅读 · 0 评论 -
ccf csp认证:除法 暴力80分!
说实话,这个题就是一个线段树或者梳妆数组的裸题,难度放在第五题有点牵强。关键是数据还特别水,纯暴力可以拿80分!我也是服了!这是我暴力得到的结果:暴力程序如下,纯暴力即可。#include <iostream>#include <cstring>using namespace std;const int N = 1e5+10;int a[N];int m...原创 2019-12-06 10:31:09 · 1924 阅读 · 1 评论 -
网络流问题
一、最大流我们有一张图,要求从源点流向汇点的最大流量(可以有很多条路到达汇点),就是我们的最大流问题。EK算法模板如下#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int INF=0x7ffffff...原创 2019-10-18 20:42:02 · 1187 阅读 · 0 评论 -
FFT
\quad学过信号系统的同学都知道,FFT是快速傅里叶变换,能将DFT从O(n2)O(n^2)O(n2)的时间复杂度降为O(nlogn)O(nlogn)O(nlogn),通常可以用于大整数乘法和多项式乘法。例如下图的题给个FFT板子如下:#include <bits/stdc++.h>using namespace std;const double PI = acos(-1...原创 2019-10-18 17:13:31 · 1323 阅读 · 0 评论 -
欧拉函数及快速筛欧拉函数
一、欧拉函数\quad欧拉函数,即ϕ(n)\phi(n)ϕ(n),表示的是小于等于n和n互质的数的个数。ϕ(1)=1\phi(1)=1ϕ(1)=1当n是质数的时候,显然有ϕ(n)=n−1\phi(n)=n-1ϕ(n)=n−1利用唯一分解定理,我们可以把一个整数唯一地分解为质数幂次的乘积,设n=p1k1p2k3⋯psksn=p_1^{k_1}p_2^{k_3}\cdots p_s^{k_s...原创 2019-10-18 17:03:14 · 1411 阅读 · 0 评论 -
回文串算法之-manacher
\quad给定一个字符串s="abababc"s="abababc"s="abababc",求这个字符串有多少个回文串或者最长回文串是哪个。我用d1[i]d_1[i]d1[i]是以i为中心长度为奇数的回文串个数,d2[i]d_2[i]d2[i]是以i为中心长度为偶数的回文串个数,则对字符串s而言,d1[0]=1(a),d1[1]=2(b,aba),d1[2]=3(a,bab,ababa),d2...原创 2019-10-18 16:34:38 · 1173 阅读 · 0 评论 -
求第k大数
\quad求一个序列里面第k大的数,用partition可以再O(n)O(n)O(n)时间复杂度内求解/* 对数A[left,right]进行一次partition操作后,主元pivot左侧元素都小于它,右侧都大于它。设pivot索引为p,则pivot是第p-left+1大元素。求第k大时,若k==p-left+1,则说明第k大数就是pivot,若k<p-left+1,则说明第...原创 2019-10-18 11:19:48 · 1251 阅读 · 1 评论 -
LCA问题
\quadLCA问题即为求树的最低公共祖先。#include <iostream>#include <vector>using namespace std;const int maxn = 5e5+10;vector<int> E[maxn];int father[maxn]; // 记录节点的父亲int depth[maxn]; // 记...原创 2019-10-18 11:19:26 · 1303 阅读 · 0 评论 -
强连通分量——两次DFS求解
\quad求一个有向图强连通分量个数以及每个点所属连通分量#include <iostream>#include <vector>#include <cstring>using namespace std;const int maxn = 1e5+10;vector<int> E[maxn]; // 正向边vector<int...原创 2019-10-18 11:19:06 · 1861 阅读 · 0 评论 -
基础数论
一、负进制数\quad将一个整数R进制分开,R为负数。例如-15的-2进制如下:程序输入为整数N和负整数R,输出其R进制(-R<36)。大于10的数用A-Z表示。// 负进制转换,即R为负数#include <iostream>#include <vector>using namespace std;int main(int argc, char c...原创 2019-10-18 11:01:01 · 1296 阅读 · 0 评论 -
最小生成树模板
\quad输入图点数,边数,再依次输入每条边。输出为最小生成树权重和。#include <bits/stdc++.h>using namespace std;//最小生成树啊,会用到并查集const int maxn = 1e5+1;int father[maxn];int find(int x){ int a = x; while(x!=father[x]) x =...原创 2019-10-18 10:34:46 · 1069 阅读 · 0 评论 -
IEEE Xtreme 11.0极限编程题目分类
题目类型11th极限编程题数Ad hoc2二分查找2位运算2构造算法1并查集2线段树1栈1动态规划2计算几何1图遍历(环问题)2最短路2最大流1最大匹配1贪心2模拟1交互1排列1埃拉托色尼筛选法1排序1字符串1最近公共祖...原创 2019-10-12 09:49:33 · 2586 阅读 · 0 评论 -
树状数组理论阐述及几道经典例题讲解
1、lowbit操作这个函数的功能就是求某一个数的二进制表示中最低的一位1。举个例子,x = 12,它的二进制为1100,那么lowbit(x)就返回4,因为最后一位1表示4。算法实现:先用x&amp;(x-1)消除最后一位1,再用原数x减去消除最后一位1后的数,即得答案。若学过计算机组成原理,也可用x&amp;(-x),即x按位与自身补码,也可以得到。比如12,二进制为1100,(12-1...原创 2018-11-21 21:29:11 · 2284 阅读 · 0 评论 -
binary_search,lower_bound, upper_bound的实现和c++调库
自己实现#include &lt;bits/stdc++.h&gt;using namespace std;// 在数组里面查找值为val的索引,如果有多个值为val,随即返回一个索引;如果没有返回-1.int binary_search(int *a, int n, int val){int left = 0, right = n, mid;while(left &lt; righ...原创 2018-10-27 09:29:48 · 1672 阅读 · 0 评论 -
二分法求函数零点
/*二分法求函数的零点 */#include <bits/stdc++.h>using namespace std;double f(double x){ return pow(x, 2) + 3*x + 2; // f = x^2+3x+2}// 指定根区间范围为[a, b],根误差为epsdouble root(double a, double b...原创 2018-10-26 23:07:44 · 3348 阅读 · 0 评论 -
构建哈希表——优化暴力求解方程
/* Consider equations having the following form: a*(x1)^2+b*(x2)^2+c*(x3)^2+d*(x4)^2=0 a, b, c, d are integers from the interval [-50,50] and any of them cannot be 0. It is consider a solution ...原创 2018-10-26 23:06:35 · 1100 阅读 · 0 评论 -
构造哈希表——求前m大的数
Problem Description 给你n个整数,请按从大到小的顺序输出其中前m大的数。Input 每组测试数据有两行,第一行有两个数n,m(0<n,m< 1000000),第二行包含n个各不相同, 且都处于区间[-500000,500000]的整数。Output 对每组测试数据按从大到小的顺序输出前m大的数。#include <b...原创 2018-10-26 23:03:51 · 1820 阅读 · 0 评论 -
c++枚举permutation
自己手动实现的枚举wom可能会遇到这样一类问题,就是需要我们将问题的所有可能的解全部枚举出来,一一去验证。比如我要枚举{1, 2, 3}的所有组合,并按照字典序打印出来。可以这样做#include &lt;bits/stdc++.h&gt;using namespace std;// 枚举void permutation(int n, int *A, int cur){ if...原创 2018-10-19 21:10:09 · 1814 阅读 · 0 评论 -
搜索入门——BFS走迷宫+记录路径
在之前的博文里面,我们实现了BFS走迷宫的最短步数,但没有记录这个具体行走路径。在实现的时候,我们可以开一个跟迷宫等同大小的二维数组,记录当前坐标是由上一个坐标转移而来(我们称之为父亲)。这样,我们就能够从迷宫出口不断找其父亲,父亲的父亲…直到找到迷宫入口。将这条路径反向输出即为我们的行走路线(可以借助栈实现)。我们来看一个题,POJ3984Description定义一个二维数组:int ...原创 2018-10-08 15:07:20 · 3271 阅读 · 0 评论 -
搜索入门——BFS之走迷宫
BFS也称为宽度优先搜索,也是一种暴力搜索算法。BFS类似于以一个点为起点,一层一层向外扩展,就像是一个石子落入水里,荡起的涟漪一层一层向外散开。BFS不但可以完成DFS的功能,还能找到无权图最短路、迷宫最短路径等等。只是BFS相对于DFS而言需要借助于队列来辅助实现,实现上没有DFS那么无脑。接下来我们看一个走迷宫的问题:问题描述输入:(S表示迷宫起点,T表示终点)10 10#S#...原创 2018-10-08 14:57:08 · 2348 阅读 · 0 评论 -
sscanf和sprintf用法讲解
\quadsscanf主要用于把字符串重新输入到指定类型的变量中,而sprintf则是将指定类型的变量转化为字符串。用法示例如下,主要用于oj刷题。#include <bits/stdc++.h>using namespace std;int main(int argc, char const *argv[]){ float f1; int f2; string s =...原创 2019-07-15 21:15:35 · 1503 阅读 · 1 评论 -
几个经典的动态规划问题
一、数塔问题#include <bits/stdc++.h>using namespace std;// dp[i][j]=max(dp[i+1][j], dp[i+1][j+1])+f[i][j]const int maxn = 101;int f[maxn][maxn], dp[maxn][maxn];int main(int argc, char const *...原创 2019-07-29 21:51:20 · 1893 阅读 · 0 评论 -
矩阵快速幂和斐波那契递推式的快速计算
矩阵快速幂\quad首先定义两个矩阵想成的运算函数multypedef vector<vector<int> > Mat;const int M = 1e4+10; // 容易溢出,给一个小于int开根号的数来模Mat mul(Mat &A, Mat &B){ int m = A.size(), n = B[0].size(), l = B.s...原创 2019-10-11 18:46:56 · 1252 阅读 · 0 评论 -
求图中两点间的所有的最短路径
一、理论篇\quad如下图所示,是一个有7个顶点的图,每条边权值均为1,试问从点0点6,有多少条最短路径呢,分别是什么?\quad我们可以直观的看出来,一共有4条最短路径,分别是0->1->4->60->2->4->60->2->5->60->3->5->6\quad那么问题来啦,我们要如何记录下这些所有的...原创 2019-09-03 11:37:59 · 10088 阅读 · 0 评论 -
最短路模板
spfa#include <stdio.h>#include <vector>#include <queue>#include <cstring>using namespace std;const int maxn = 1e5+10;vector<pair<int, int> > E[maxn];int di...原创 2019-08-25 11:30:34 · 1182 阅读 · 0 评论 -
排序算法详解——选择、插入、归并和快排
一、选择排序特点:每次从待排序序列中选取最小值最为当前元素值流程:已排好序的数组为A[0,i-1],将未排序序列A[i,n)中最小值赋给A[i]。const int maxn = 10000;int A[maxn];void selectSort(int A[], int n){ for (int i = 0; i < n; ++i) { for (int j = i; ...原创 2019-08-27 16:02:20 · 1364 阅读 · 0 评论 -
大顶堆模板
\quad该大顶堆跟c++ stl库设计方法相似,提供size,empty,push,top,pop功能,简易版实现。#include <bits/stdc++.h>using namespace std;template<typename Item>class MaxHeap{private: Item *data; int count; /...原创 2019-07-28 16:35:04 · 1220 阅读 · 0 评论 -
线段树模板
一、单点修改,区间最值#include <bits/stdc++.h>using namespace std;const int maxNode = 1<<19;const int maxn = 2e5+10;struct Node{ int val, left, right;}node[maxNode];int father[maxn];...原创 2019-08-05 16:34:34 · 1099 阅读 · 0 评论 -
并查集模板
#include <bits/stdc++.h>using namespace std;const int maxn = 1e4+10;int father[maxn];int isRoot[maxn]; // 记录是否是根节点int find(int x){ while(x!=father[x]) x = father[x]; return x;}// 路径...原创 2019-07-27 11:37:21 · 1125 阅读 · 0 评论