数据结构
Buyi.
努力进大厂
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
*NOJ2446.小陈的气球(树状数组+区间处理+离线处理)
题目链接:https://acm.njupt.edu.cn/problem/NOJ2446 题意:有n个气球,每次把区间[L,R]之间的气球去掉,问还剩下多少中颜色的气球 解题思路: ①先将气球序列扩大两倍,记录下前i个气球中的种类数sum和每一个位置处气球对应相同颜色的下一个气球的位置Next ②离线处理询问,那么题目中的删除[L,R]区间内的气球,求[1,L-1]和[R+1,N]之间气球的颜色就可以转换为求[R+1,N+L-1]区间内的气球个数,同时将R+1看成L,N+L-1看作R,重新保存到结构体中原创 2020-11-27 12:47:27 · 164 阅读 · 0 评论 -
PTA 基础实验3-2.4 出栈序列的合法性(模拟)
题目链接:https://pintia.cn/problem-sets/988034414048743424/problems/988038770777137152 解题思路:将1到n模拟进栈,当当前栈顶与当前给定的待出栈的数字相同时,则出栈,一直模拟,如果将n个数全部模拟进栈后,最后堆栈为空,那么YES,否则NO。同时要注意模拟过程中,判断堆栈容量不能超过m 题解: #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<c原创 2020-11-15 21:21:59 · 486 阅读 · 0 评论 -
2020绵阳J.Joy of Handcraft(线段树/并查集+去重优化)
题目链接:http://codeforces.com/gym/102822/problem/J 题意:有n个灯,灯有亮度值x和亮的时间t,每2k*t+1到(2k+1)*t时间内灯亮,(2k+1)*t+1到(2k+2)*t时间内灯熄灭,问m个时间点内每个时间点灯的最大亮度。 解题思路: 区间修改(区间求最大值)+单点查询 ①利用线段树,区间修改+单点查询,注意改一下模版,每次不是求和,而是求最大值了。 同时注意按Lamb[i].t进行排序,相同的t将亮度x大的放在前面,如果 Lamb[i].t已经处理过,直接原创 2020-11-12 22:30:55 · 273 阅读 · 0 评论 -
2020牛客暑期多校第二场C.Cover the Tree(无根树+dfs)
题目链接:https://ac.nowcoder.com/acm/contest/5667/C 题意:找出最少的路径来包括所有的树的结点 解题思路: m为树的叶子结点 答案个数最少应该是m/2向上取余个 答案组合就是叶子结点连接叶子结点 所以找到一个子节点个数>=2的结点当做根结点,从这个点开始dfs寻找叶子结点个数即可 #include<iostream> #include<cstdio> #include<string.h> #include<vector原创 2020-07-21 23:16:10 · 190 阅读 · 0 评论 -
**2020暑期牛客多校第二场F.Fake Maxpooling(单调队列+lcm处理)
题目链接:https://ac.nowcoder.com/acm/contest/5667/F 解题思路: 单调队列详解:单调队列适用于解决一定长度的最大值最小值问题 #include<iostream> #include<cstdio> #include<vector> #include<deque> #include<string.h> using namespace std; #define ll long long int n,m,p;原创 2020-07-21 17:29:32 · 158 阅读 · 0 评论 -
2020暑期牛客多校第二场G.Greater and Greater(bitset+思维构造)
题目链接:https://ac.nowcoder.com/acm/contest/5667/G 解题思路: bitset用法 :Bitset 大佬博客解析 代码里面也有一些说明,可以参考 #include<iostream> #include<cstdio> #include<string.h> #include<algorithm> #include<bitset> #include<vector> using namespace s原创 2020-07-21 16:49:13 · 279 阅读 · 0 评论 -
CF706E.Working routine(十字链表)
题目链接:https://vjudge.net/problem/CodeForces-706E 题意:给出一个n*m的矩阵,q个任务,每个任务要求将两个相同大小的子矩阵块交换位置。输出最后形成的新矩阵 解题思路: 暴力一个个元素交换肯定会超时 可以发现一个子矩阵内部都是相联系的(不会改变的),交换两个矩阵,只需要将两个矩阵的上下左右边界交换一下就可以了。 所以每次交换,更新交换一下两个子矩阵上下左右边界对应即可 #include<iostream> #include<cstdio>原创 2020-06-16 13:42:43 · 319 阅读 · 0 评论 -
*CF1132D.Stressful Training(二分+队列+贪心)
题目链接:https://vjudge.net/problem/CodeForces-1132D 题意:给n个笔记本,每个笔记本有初始电量ai和每个时间点耗电量bi,要求在整个会议k个时间内,给出最小单位时间充电量x来保证每台笔记本在每个时间点都是有电的(电量>=0),每个时间点只可以给一台笔记本充x电量。 解题思路:先求出每个笔记本在什么时候电量耗尽需要充电,即ai/bi+1,然后按需要充电的时间点从小到大排序,即最需要充电的放在前面,这里直接利用优先队列就可以,遍历每个时间点1到k,如果当前笔记本原创 2020-06-09 23:39:51 · 245 阅读 · 0 评论 -
CF547B.Mike and Feet(单调栈+区间处理)
题目链接:https://vjudge.net/problem/CodeForces-547B 题意:给出n个数,要求求出所有规模大小为1-n的连续子串中的strength的最大值,strength为一个子串中的最小的那个数值 解题思路: L[i]表示第i个元素的最左边作用范围(左边界) R[i]表示第i个元素的最右边作用范围(右边界) 如:1 2 3 4 3 2 1 L[4]=3; R[4]=5; L[1]=0; R[1]=n+1=8; 利用的是单调栈(单增)进行处理 分两次分别处理L和R原创 2020-06-07 18:50:08 · 287 阅读 · 0 评论 -
CF253D.Table with Letters - 2(前缀和+技巧暴力+模拟队列)
题目链接:https://vjudge.net/problem/CodeForces-253D 题意:给出一个n*m的矩阵,要求找出四角字母相同,且含有a的个数不超过k的子矩阵数量 解题思路: 1、先对矩阵进行预处理,求出a的个数 这里有两种预处理方式:①a[i][j]表示,第j列中第1行到第i行a的个数 转换方式:a[i][j]=a[i-1][j]+(s[i][j]==‘a’); ②a[i][j]表示从(1,1)到(i,j)位置处的a的个数 转换方式:a[i][j]=a[i-1][j]+a[i][j-1]原创 2020-06-07 11:42:03 · 295 阅读 · 0 评论 -
CF140C.New Year Snowmen(优先队列+map)
题目链接:https://vjudge.net/contest/376896#problem/D 题意:给出n个数,询问能排出多少个长度为三的纯单调序列,顺序可以打乱,一个数只可以用一次 阶梯思路: 先用map函数记录每个数出现的次数,然后遍历map数组,将各个数对应的个数 放入优先队列中,优先队列按数量从大到小排序,即数量大的数先选择。然后用a、b、c数组分别保存在三个数,k保存数量 注意map函数遍历的方法,大的数值统计个数时候很实用 it->first 是坐标i,it->second是ma原创 2020-06-06 16:13:25 · 247 阅读 · 0 评论 -
*CF777E.Hanoi Factory(栈+贪心)
题目链接:https://vjudge.net/contest/376896#problem/J 题意:n个货物,每个货物都有内径a,外径b,高度h,他们堆放在一起的条件是上面货物的外径>下面货物的内径,小于上面货物的外径。问,最大堆放的高度是多少 解题思路:将货物按外径b从大到小排序,外径b相同的按内径a从小到大排序,注意内径一定要按从小到大排序,因为b相同的时候上下两个货物肯定能够堆放在一起,让上面的那个货物的a尽可能的小,可以使得后面货物选择的空间更大。 货物的堆放用栈实现,后进先出,如果当前要原创 2020-06-06 15:47:28 · 336 阅读 · 0 评论 -
CF566D.Restructuring Company(并查集)
题目链接:https://vjudge.net/contest/376346#problem/D 题意:给出n个人,q个操作,一开始n个人各自为一个团队,输入a,b,c, ①a=1时,将b和c放在同一个团队中 ②a=2时,将区间[b,c]中的所有人放到同一个团队中 ③a=3时,询问b和c是否在同一个团队中,在的话输出YES,不在输出NO 解题思路: a=1的时候直接合并 a=2的时候如果一个个遍历合并的话会超时,用一个nex[i]数组表示i点所在区间的右边界+1,然后在遍历合并的时候,每次合并完i的值的时候原创 2020-06-03 19:12:38 · 230 阅读 · 0 评论 -
CF1253D.Harmonious Graph(路径合并类并查集)
题目链接:https://vjudge.net/contest/376346#problem/C 题意:给出n和m,n为结点个数,m为路径条数。如果,l和r之间能够互通,那么l到所有[l+1,r-1]结点都要能够互通 解题思路:先将已知的m条路径保存,以后面的结点为父结点进行合并。 然后遍历每一个结点i,找出该点的父结点tmp,根据要求区间[i,tmp]内的每一个点都要与i相通,遍历区间内的每一个结点,如果j的父亲结点等于tmp则相连,如果不等于tmp,则需要连接一条路径(j和tmp),ans++,同时更新原创 2020-06-03 18:38:11 · 255 阅读 · 0 评论 -
POJ1456.Supermarket(贪心+并查集)
题目链接:https://vjudge.net/problem/POJ-1456 题意:给n个商品,在截止期限d前卖出可以赚到p钱,问怎么安排可以使得利益最大化 解题思路: 利用贪心+并查集优化 先贪心按p的从大到小进行排序,将pa[i]初始化为i,使得每一个i各自成为一个集合。当选择一个物品(p,d)时,使pa[d]–,将它从d集合并入d-1的集合中,也就是相当于d这一天被占用了,原来的d集合中的物品想要被卖的话只能在前d-1天内卖出才可以。这样当pa[find(d)]>0的时候表示这个物品可以被选原创 2020-06-01 11:15:21 · 160 阅读 · 0 评论 -
HDU3038.How Many Answers Are Wrong(带权并查集)
题目链接:https://vjudge.net/problem/HDU-3038 题意:给出n和m,n为数的个数,m为给出的区间和的个数,只要给你的区间和与之前的不矛盾,那么就认为这个区间和一定正确。问有多少个区间和是错误的。 解题思路: 利用并查集 一定要注意,这题比较特殊,pa[i]表示的不是第i个数的直接祖先,是它的直接祖先坐标-1的数的位置 设置一个sum[i],表示第i个数到pa[i]之间的数的和(不包含pa[i]),也就是它到它的直接祖先的区间和 只要关键点是更新祖先和区间和的部分,可以去找几个原创 2020-05-30 10:11:52 · 165 阅读 · 0 评论 -
CF546C.News Distribution(带权并查集)
题目链接:https://acm.njupt.edu.cn/problem/CF1167C/editor 解题思路:简单的并查集问题,根据条件找到所有的关联块,然后输出每一个人属于的块的大小即可 #include<cstdio> #include<iostream> #include<string.h> #include<vector> using namespace std; const int maxn=5e5+10; int n,m; int vis[m原创 2020-05-29 17:20:47 · 219 阅读 · 0 评论 -
CF546C. Soldier and Cards(队列+模拟)
题目链接:https://acm.njupt.edu.cn/problem/CF546C/editor 解题思路:唯一难点就是如何判断能不能分出胜负,这里因为总卡片不大于10,所以直接判断在队列进行次数很大却没有分出胜负的时候输出-1即可,也是一种好思想呀。 用哈希保存状态应该也可以做,不过就是比较麻烦了 #include<iostream> #include<cstdio> #include<queue> using namespace std; int n; int原创 2020-05-29 15:48:51 · 1397 阅读 · 1 评论
分享