
算法竞赛
文章平均质量分 59
算法竞赛学习
梦中醉卧惊起
这个作者很懒,什么都没留下…
展开
-
百亿富翁 (单调栈)
百亿富翁题目描述这天小明买彩票中了百亿奖金,兴奋的他决定买下蓝桥公司旁的一排连续的楼房。已知这排楼房一共有 NN 栋,编号分别为1∼N,第 ii 栋的高度为h i 。好奇的小明想知道对于每栋楼,左边第一个比它高的楼房是哪个,右边第一个比它高的楼房是哪个(若不存在则输出 -1)。但由于楼房数量太多,小明无法用肉眼直接得到答案,于是他花了 1 个亿来请你帮他解决问题,你不会拒绝的对吧?输入描述第 1 行输入一个整数 N.表示楼房的数量。第 2 行输入 N 个整数(相邻整数用空格隔开),分别为 h_原创 2022-04-03 15:55:33 · 364 阅读 · 0 评论 -
单调栈、单调队列(超详细)
单调栈、单调队列单调栈单调递增栈:栈中数据入栈或出栈的序列为单调递减序列;单调递减栈:栈中数据入栈或出栈的序列为单调递增序列。维护单调递增栈:遍历数组中每一个元素,执行入栈:每次入栈前先检验栈顶元素和进栈元素的大小。如果栈空或进栈元素大于栈顶元素则直接入栈;如果进栈元素小于等于栈顶元素,则出栈,直至进栈元素大于栈顶元素。//单调递增栈int nums[maxn]; stack < int > q; for (int i = 0; i < nums.length; i++)原创 2022-02-15 13:47:09 · 2479 阅读 · 0 评论 -
前缀和,差分
前缀和,差分一维前缀和为了方便计算区间和,所以下标从1开始#include <iostream>using namespace std;const int maxn=1e6+5;int q[maxn];int main(){ int n,m; cin>>n>>m; q[0]=0; for(int i=1;i<=n;++i){ int a;cin>>a;//输入n个数 q[i]=原创 2022-02-15 13:26:19 · 161 阅读 · 0 评论 -
关押罪犯(带权并查集)
并查集int pre[maxn];//维护父亲节点int num[maxn];//维护每个集合里的个数int d[maxn];//维护到根节点的距离void init(int n){//初始化pre数组 for (int i = 1; i <= n;i++){//注意从0开始还是从1开始 pre[i] = i;//把初始值赋给自己 d[i]=0; num[i] = 1;//按秩合并 }}void merge(int x,in原创 2022-02-15 13:22:27 · 527 阅读 · 0 评论 -
Boxes And Balls(三叉哈夫曼)
三叉哈夫曼堆如果是偶数则加上一个0,变成一个奇数拆的时候是先拆大的,保留小的;如果不能一次拆完,则第一次等于种类数之和,保证留下的是最小的组合合并的时候先合并最小的,能够一次合并的越多越好方法一:if (q.size() % 2 == 0) q.push(0); ans = 0;while (q.size() > 1) { ans1 = q.top(); q.pop(); ans2 = q.top(); q.p原创 2022-02-15 11:39:17 · 284 阅读 · 0 评论 -
哈夫曼树,编码模板
哈夫曼树wpl给定n个权值,作为n个叶子结点,构造一棵二叉树;对n个数求和,每次求和都要付出所求的和的代价,求最小代价的总和。priority_queue<int,vector<int>,greater<int> >q;int main(){ int n,m; while(scanf("%d",&n)&&n!=0){ while (!q.empty()) q.pop(); for (int i原创 2022-02-15 11:38:11 · 360 阅读 · 0 评论 -
二分查找,二分答案
二分法二分查找include <algorithm>binary_search(a,a+n,value) 在递增序列中查找,找到返回true ,falselower_bound(a,a+n,value) 返回大于等于value的值lower_bound(a,a+n,value,greater<T>()) 返回小于等于的值upper_bound(a,a+n,value) 返回大于value的值upper_bound(a,a+n,value,greater<T>原创 2022-02-14 09:46:38 · 409 阅读 · 2 评论 -
表达式求值 (容器 数组模拟)
表达式求值给定一个表达式,其中运算符仅包含 +,-,*,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。注意:数据保证给定的表达式合法。题目保证符号 - 只作为减号出现,不会作为负号出现,例如,-1+2,(2+2)*(-(1+1)+2) 之类表达式均不会出现。题目保证表达式中所有数字均为正整数。题目保证表达式在中间计算过程以及结果中,均不超过 2^31−1。题目中的整除是指向 0 取整,也就是说对于大于 0 的结果向下取整,例如 5/3=1,对于小于 0 的结果向上取整,例如原创 2022-02-14 09:32:40 · 126 阅读 · 2 评论 -
位运算基础操作
位运算基础操作常识 :无符号数32位的取值范围是: 0~4294967295有符号数32位的取值范围是: -2147483648~2147483647位运算的操作& 与运算 :两个位都是 1 时,结果才为 1,否则为 0,如应用:一个数与-1 即1 1 1 1 1 1 1 1与运算时等于本身 1 0 0 1 1& 1 1 0 0 1 1 0 0 0 1| 或运算 :两个位都是 0 时,结果才为 0,否则为 1,如应用:一个数与0或运算时,等于原创 2022-02-13 16:47:05 · 883 阅读 · 1 评论 -
快排 (模板及应用)
排序快排分治选取分界点 q[l] q[r] q[l+r>>1] 随机选值调整范围,递归左右两边平均复杂度: nlogn实现思想选取分界点,有四个典例,然后以分界点调整左右区间,有双指针 i = l-1 , j = r+1 如果满足q[i]<x则i++ ,如果q[j] >x则j-- ,如果停住则交换两数 , 先整体进行一次排序后,然后递归排序每一个区间;算法模板#include <iostream>using namespac原创 2022-02-13 16:31:39 · 358 阅读 · 1 评论 -
归并排序 (模板及应用)
排序归并排序分治选取分界点进行递归,这里选取中间点(l+r)>>1以中间值进行左右分别递归,排序将左右值合并平均复杂度: nlogn实现思路每次都选取一个中间值,然后分开递归排序,i = l,j = mid + 1;如果小的就保存到tmp数组直到 i / j 跑到结尾然后将剩下的进行移动中间点左右递归合并算法模板#include <iostream>using namespace std;const int maxn=1e6+5;int q[原创 2022-02-13 16:28:38 · 214 阅读 · 1 评论 -
链表 堆 (C++模拟)
链表单链表基础实现一个单链表,链表初始为空,支持三种操作:向链表头插入一个数;删除第 k 个插入的数后面的数;在第 k 个插入的数后插入一个数。现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2 个插入的数,…第 n 个插入的数。输入格式第一行包含整数M,表示操作次数。接下来 M 行,每行包含一个操原创 2022-02-13 16:26:59 · 231 阅读 · 1 评论 -
数组模拟栈,队列
数组模拟栈,队列模拟栈实现一个栈,栈初始为空,支持四种操作:push x – 向栈顶插入一个数 xx;pop – 从栈顶弹出一个数;empty – 判断栈是否为空;query – 查询栈顶元素。现在要对栈进行 M 个操作,其中的每个操作 3 和操作4 都要输出相应的结果。输入格式第一行包含整数 M,表示操作次数。接下来 M 行,每行包含一个操作命令,操作命令为 push x,pop,empty,query 中的一种。输出格式对于每个 empty 和 query 操作都要输出一个查询原创 2022-02-14 09:30:35 · 108 阅读 · 2 评论 -
STL大法使用详解
STL大法vector, 变长数组,倍增的思想 size() 返回元素个数 empty() 返回是否为空 clear() 清空 erase() 删除 front()/back() push_back()/pop_back() begin()/end() sort() 支持比较运算,按字典序pair<int, int> first, 第一个元素 second, 第二个元素 支持比较运算,以原创 2022-02-13 16:16:10 · 368 阅读 · 1 评论