
数据结构
数据结构
chr1st0pher
Dancer on the keyboard
展开
-
Leetcode 1438. 绝对差不超过限制的最长连续子数组(双指针+单调队列)
Description给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。如果不存在满足条件的子数组,则返回 0 。Solution首先发现显然可以用双指针来计算答案,重点在于如何维护当前段内的最大最小值动态维护当前窗口内的最大值和最小值,可以采用单调队列时间复杂度O(N)O(N)O(N)空间复杂度O(N)O(N)O(N)Codeclass Solution {public:原创 2021-03-04 15:20:56 · 277 阅读 · 1 评论 -
剑指 Offer 59 - II. 队列的最大值(单调队列)
Description请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1Solution思路与剑指 Offer 30. 包含min函数的栈 类似,本质上也是相似的空间换时间的套路。维护两个队列,一个是正常队列,一个是非降的单调(双向)队列,若当前要压入队列的元素x比单调队列尾的元素y 大,则弹出队尾元素,并继续判原创 2021-03-01 23:53:46 · 128 阅读 · 0 评论 -
剑指 Offer 51. 数组中的逆序对(BIT + 离散化)
Description在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。Solution比较裸的求逆序对,这里采用的是竞赛中常用的BIT求法时间复杂度:O(NlogN)O(N\log N)O(NlogN)空间复杂度:O(N)O(N)O(N)Codeclass Solution {public: static const int maxn = 5e4 + 7; int lim,bit[maxn];原创 2021-03-01 21:45:47 · 159 阅读 · 0 评论 -
剑指 Offer 49. 丑数(小根堆)
Description我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。111是丑数nnn 不超过169016901690Solution因为要求从小到大的第n个丑数,所以我们采用小根堆,每次弹出当前最小的丑数,并把它的2/3/5倍插入小根堆即可注意还需要判重(set)Codeclass Solution {public: typedef long long ll; set<ll>s; c原创 2021-03-01 21:23:39 · 120 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点(LCA)
Description输入两个链表,找出它们的第一个公共节点。若不存在则返回NULL要求时间复杂度O(N), 空间复杂度O(1)Solution有点类似寻找LCA,故可借用朴素求LCA的思想,先把两个节点拉到同一深度,再同时向树根跳,第一次相遇的节点就是LCA。因此,本质上我们只需要预先求出两个链表长度的差值,再按照求LCA的方法即可。Code/** * Definition for singly-linked list. * struct ListNode { * int va原创 2021-02-24 01:07:31 · 110 阅读 · 0 评论 -
剑指 Offer 31. 栈的压入、弹出序列(思维)
DescriptionSolution若当前弹出的为x,那压栈队列中x之前的元素肯定已经被压过栈了基于这一点,容易发现:对于当前弹出序列的某一元素x, 若x比之前的弹出序列中在压栈序列中下标最大的元素下标还要大,那此次弹出合法若小于,且当前栈顶元素不等于x,则不合法,反之则合法我们只需要维护当前弹出序列元素在压栈序列中下标最大的元素的下标,并同时维护一个栈即可。时间复杂度:O(N)空间复杂度:O(N)Codeclass Solution {public: static con原创 2021-02-24 00:05:50 · 103 阅读 · 0 评论 -
剑指 Offer 30. 包含min函数的栈(单调栈)
Description定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。Solution光靠一个栈必然是无法实现O(1)查询min的,故我们考虑再加一个栈在维护一个正常的栈sta1的同时,维护一个非减的栈sta2(top是最小值之一)每次查询min的值时即为栈sta2顶的值为什么这样是正确的?假设当前需要push的值为x, 而sta2栈顶的值为y:若x > y,按照我们的设计,x不需要压入原创 2021-02-19 22:28:35 · 106 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树(二叉树的镜像)
DescriptionSolution二叉树和它的镜像,实际上就是在层序遍历中每一层是左儿子优先还是右儿子优先的区别实现上,我们这两种遍历方法同时进行,若每次遍历到的节点都相同,则证明一颗二叉树是对称的时间复杂度:O(N)O(N)O(N)空间复杂度:O(N)O(N)O(N)Code/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; *原创 2021-02-19 21:17:30 · 96 阅读 · 0 评论 -
Leetcode 1004. 最大连续1的个数 III (双指针)
DescriptionSolution显然满足双指针中的单调性,即左指针+1的情况下,右指针(非严格)递增Codeclass Solution {public: int longestOnes(vector<int>& A, int K) { int l = 0, r = 0, res = 0; int cnt = K, n = A.size(); if(!K) { int tmp = 0;原创 2021-02-19 21:11:09 · 118 阅读 · 0 评论 -
Leetcode 995. K 连续位的最小翻转次数(贪心 + 双向队列)
DescriptionSolution观察发现,当从头开始处理到第 iii 位(前面的位数都为111)时, 若该位(在考虑被之前的翻转所影响的情况下)为 000,则必须翻转,且是以从第 iii 位开始向后K个长度的翻转(因为前面的位数都为111了,再翻转它们没有任何意义),所以我们可以贪心的进行翻转操作,即可满足最少次数的要求。实现上,采用双端队列的方式,动态维护能影响到当前位的所有翻转,根据现存翻转个数来判断该位的当前值(奇数个则取反,偶数个不变)时间复杂度 O(N)O(N)O(N)空间复杂度原创 2021-02-18 23:35:14 · 192 阅读 · 0 评论 -
剑指 Offer 41. 数据流中的中位数(大根堆+小根堆)
DescriptionSolution经典问题,用一个大根堆和一个小根堆来维护数据流的中位数,稍微手推一下即可Hint priority_queue<int,vector<int>,greater<int> >q2;//小根堆 priority_queue<int,vector<int>,less<int> >q1;//大根堆Codeclass MedianFinder {public: /**原创 2021-02-11 00:45:54 · 203 阅读 · 1 评论 -
剑指 Offer 35. 复杂链表的复制(Map)
DescriptionSolution存在两种拷贝:深拷贝和浅拷贝深拷贝主要是将另一个对象的属性值拷贝过来之后,另一个对象的属性值并不受到影响,因为此时它自己在堆中开辟了自己的内存区域,不受外界干扰。浅拷贝主要拷贝的是对象的引用值,当改变对象的值,另一个对象的值也会发生变化。而本题需要我们用深拷贝来复制该复杂链表,若每个节点只有一个next指针指向下一个节点,则只需要顺序遍历一遍待拷贝链表,同时复制一份即可;但这里还有一个random指针,所有我们需要同时建立原链表和新链表内存地址的对原创 2021-02-10 22:41:36 · 133 阅读 · 0 评论 -
Leetcode 25. K 个一组翻转链表 (模拟)
DescriptionSolution题目要求: 常数额外空间 && 实际上的节点交换先遍历一遍链表获取链表长度,再通过一次遍历进行节点交换第二次遍历时, 将链表按 k 个一组分组, 记录下每组的第一个和最后一个本质上就是把组内节点倒过来, 把前一组的第一个节点指向该组最后一个节点即可具体实现细节见代码时间复杂度:O(N)O(N)O(N)空间复杂度:O(1)O(1)O(1)Code/** * Definition for singly-linked list. *原创 2021-01-25 21:26:29 · 111 阅读 · 0 评论 -
Leetcode 周赛#220 D. 检查边长度限制的路径是否存在 (并查集+离线)
DescriptionSolution将询问和边集按照边权从小到大排序后, 每次将比当前询问的lim小的边加入并查集中, 再判断此时两点是否连通即可Codeclass Solution {public: #define maxn 100005 int fa[maxn]; int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);} struct node{ int u,v,lim;原创 2020-12-24 10:34:50 · 121 阅读 · 0 评论 -
Codeforces 1450D. Rating Compression (二分 + 单调栈)
DescriptionSolution猜想:假如满足条件的k的最小值(除1以外) 为 x, 那么大于等于x的k值都满足条件证明:待补用单调栈check的二分来找到这个最小值x时间复杂度:O(N∗logN)O(N * \log N)O(N∗logN)Codeconst ll inf = 2e18 + 7;const int maxn = 3e5 + 7;int n, a[maxn];int head, tail,que[maxn];bool vis[maxn];bool check原创 2020-12-09 17:43:52 · 277 阅读 · 0 评论 -
2018 BACS Regional Programming Contest F. Football Free Kick(map离散化)
DescripionSolution用map维护连续空区间端点。可以用有三种状态的map维护,也可以用两个只有两种状态的map维护(很麻烦)Codemap<int,bool>mpl, mpr;int main(int argc, char const *argv[]){ int t; scanf ("%d",&t);int cas = 0; while (t--){ mpl.clear();mpr.clear(); int n,k,q;scanf("%d%d原创 2020-11-17 19:57:06 · 121 阅读 · 0 评论 -
2020 CCPC 威海 G. Caesar Cipher(Hash + 线段树)
DescriptionInput5 61 2 1 2 12 1 2 22 1 3 31 1 11 3 52 1 2 42 1 2 2OutputnoyesnoyesSolution题意很明了,就是两种操作,一种是对区间每个数+1再mod 65536,另一种则是判断两个区间的数是否相同很容易想到用线段树维护区间Hash值的和,区间+1等价于Hash值+=base值然而本题的关键在于每个数都是在mod 65536意义下的,每当+1到65536时,就变成0了,而此时的Hash原创 2020-11-16 22:36:29 · 241 阅读 · 5 评论 -
ICPC NEAU Programming Contest 2020 D. 旅游 (离线 + 单调栈)
解法:离线 + 单调栈Code:const int MX = 2e5 + 7;int a[MX];struct node{ int id; int y;};vector<node>q[MX];void solve(int n,int m){ int ans[MX]; int head = 0,tail = 0; int que[MX]; for(int i = n;i > 0;--i){ while(head < tail && a[.原创 2020-06-09 15:24:21 · 214 阅读 · 0 评论 -
BZOJ1047 [HAOI2007]理想的正方形(二维单调队列)
Description 有一个ab的整数组成的矩阵,现请你从中找出一个nn的正方形区域,使得该区域所有数中的最大值和最小值的差最小。Input 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。100%的数据2<=a,b<=1000,n<=a,n<=b,n<=1000...原创 2020-06-11 13:51:50 · 258 阅读 · 1 评论 -
Gym 102346F. Forests in Danger (二分 + 扫描线)
DescriptionSolution二分答案 ,扫描线checkCode#define ls rt << 1#define rs rt << 1 | 1int n,p;struct node{ int x1,y1,x2,y2;}li[maxn],all;struct Scanline{ int l,r,h,mark; bool operator< (const Scanline&it) const{ if(h == it.h) ret原创 2020-08-13 21:07:40 · 177 阅读 · 0 评论 -
Codeforces Round #629 (Div. 3) E.Tree Queries
Source题目大意:给定一颗根为 111 号点的树。有 mmm 次询问,第 iii 次询问给定 KiK_iKi 个不同的节点,问你是否能找到一条从根到任意节点 xxx 的树上路径,满足之前给定的 KiK_iKi 个不同的节点要么在路径上,要么离路径的距离为 111,每次询问输出 YESYESYES or NONONO。解法:先预处理出LCA的相关数组(包括每个点的深度depth[]d...原创 2020-03-29 18:13:20 · 549 阅读 · 0 评论 -
Codeforces 519E. A and B and Lecture Rooms (树上乱搞)
DescriptionA and B are preparing themselves for programming contests.The University where A and B study is a set of rooms connected by corridors. Overall, the University has n rooms connected by n - 1 corridors so that you can get from any room to any ot原创 2020-07-22 20:01:17 · 273 阅读 · 0 评论 -
BZOJ 3585 Mex (莫队 + 分块)
Description 有一个长度为n的数组{a1,a2,…,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。 Input 第一行n,m。 第二行为n个数。 从第三行开始,每行一个询问l,r。Output 一行一个数,表示每个询问的答案。 ExamplesSample Input5 52 1 0 2 13 32 32 41 23 5Sample Output12303Note1≤n,m≤2000001 \leq n,m \leq原创 2020-07-29 10:35:28 · 190 阅读 · 0 评论 -
2020杭电多校第一场1006 / HDU 6756 (分块 / 树状数组 + 二分)
DescriptionGiven an undirected graph G=(V,E)G=(V,E)G=(V,E). All vertices are numbered from 111 to NNN. And every vertex u has a value of AuA_uAu. Let SuS_uSu={Av│(u,v)∈E}\left\{ Av│(u,v)∈E\right\}{Av│(u,v)∈E}. Also, F(u)F(u)F(u) equals MEX(minimum exclu原创 2020-07-29 20:32:18 · 218 阅读 · 0 评论 -
「USACO 2019.12 Platinum」Bessie‘s Snow Cow (Set + 树状数组)
Description农场下雪啦!Bessie 和往年开冬一样在堆雪牛。她之前是个写实派,总是想把他的雪牛堆得和个真牛一样。但今年不一样,受到来自东方的神秘力量的影响,他想来点抽象艺术,因此他想堆成一棵树的样子。这棵树由 个雪球, 根树枝构成,每根树枝连接两个雪球,并且每两个雪球之间路径唯一。Bessie 要给他的雪牛来点细节。因此他给其中一个雪球加了个鼻子,来表示这是他那抽象的牛的头,并且把它称作雪球 。为了让雪牛更好看,他还要给某些雪球来点不同的颜色。于是,他用旧牛奶桶装满了颜料泼到雪牛上。这些颜原创 2020-07-17 21:12:00 · 562 阅读 · 0 评论 -
Codeforces 1367E. Necklace Assembly(并查集)
题目链接题目大意:现在你有n个珍珠,每个珍珠的颜色用字母a ~ z来描述。你可以从中选出任意个珍珠以任意顺序串成环,求最多能串成多长的环满足每个珍珠的颜色有k的循环周期。解法:枚举答案,对于当前长度用并查集check。Code:#include <bits/stdc++.h>#define clr(a,b) memset(a,b,sizeof(a));using namespace std;const int MX = 2e3 + 7;int n,k;char s[MX]原创 2020-06-22 23:05:08 · 310 阅读 · 0 评论 -
Codeforces 456E. Civilization (树的直径 + 并查集)
DescriptionAndrew plays a game called “Civilization”. Dima helps him.The game has n cities and m bidirectional roads. The cities are numbered from 1 to n. Between any pair of cities there either is a single (unique) path, or there is no path at all. A pa原创 2020-07-24 20:10:55 · 209 阅读 · 0 评论 -
Gym 102346A. Artwork (并查集)
DescriptionSolution把矩形的上下左右四个边界当作4个元素,维护n + 4 个元素的并查集最后根据四个边界的连通情况判断答案Codeconst int maxn = 2e5 + 7;int ex,ey,n;int fa[maxn];void init() { for(int i = 1;i <= n + 4;++i) fa[i] = i;}int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]);}原创 2020-08-13 22:41:47 · 280 阅读 · 0 评论 -
LeetCode 685. 冗余连接 II (并查集 + 树上乱搞)
题目链接Solution输入的边有N条,其中有一条为“附加边”,但我们不知道是哪条边。但这条边的存在会使得原本的有根树出现严格一个环(不考虑方向)。我们一边加边,一边将两端点用并查集合并,当两端点在合并前就属于同一个并查集时,说明加上这条边后就会出现环于是就找到了原图中唯一的环,我们用dfs将环上的点标记最后倒序枚举输入的边,若当前边在环上,且删去后图中入度为0的点有且只有一个,那么就找到了答案Codeclass Solution {public: int N, fa[1000原创 2020-09-17 21:16:10 · 127 阅读 · 0 评论 -
ZOJ 3998 Yet Another Data Structure Problem (线段树)
DescriptionSample Input15 51 2 1 2 13 2 41 1 5 23 2 42 1 1 43 1 1Sample Output43216Solution两个tag的线段树 + 欧拉降幂Codell t[maxn << 2], lazy1[maxn << 2], lazy2[maxn << 2];ll a[maxn];ll qpow(ll x,ll n) { ll res = 1; while(n)原创 2020-10-14 17:00:46 · 118 阅读 · 0 评论 -
Codeforces 1401E. Divide Square (扫描线 + 线段树)
DescriptionThere is a square of size 106×106 on the coordinate plane with four points (0,0), (0,106), (106,0), and (106,106) as its vertices.You are going to draw segments on the plane. All segments are either horizontal or vertical and intersect with at原创 2020-09-03 07:21:06 · 233 阅读 · 0 评论 -
Codeforces 446C. DZY Loves Fibonacci Numbers (Fibonacci + 线段树)
DescriptionIn mathematical terms, the sequence F n of Fibonacci numbers is defined by the recurrence relationF 1 = 1; F 2 = 1; F n = F n - 1 + F n - 2 (n > 2).DZY loves Fibonacci numbers very much. Today DZY gives you an array consisting of n integer原创 2020-08-07 21:10:16 · 380 阅读 · 0 评论 -
2020牛客多校(第二场) H. Happy Triangle (权值线段树)
DescriptionGiven a multiset MSMSMS and qqq operations. MSMSMS is empty initailly, and operations are in three types, which are as follows:insert an element xxx into MSMSMSerase an element xxx from MSMSMSgiven an integer xxx, determine whether you can原创 2020-07-14 16:39:40 · 417 阅读 · 0 评论 -
Gym - 102174G 神圣的 F2 连接着我们 (线段树优化建图 + 多源最短路)
Description小白非常喜欢玩 “县际争霸” 这款游戏,虽然他的技术并不容乐观。“县际争霸” 的地图共有两个县,每个县里各有 nnn 个据点。同一个县之间的据点是互不连通的,两个县之间的据点也是互不连通的。小白的 ppp 个战斗单位在第一个县的第 x1,x2,⋯,xpx_1,x_2,⋯,x_px1,x2,⋯,xp 个据点中,而对手的 qqq 个建筑单位在第二个县第 y1,y2,⋯,yqy_1,y_2,⋯,y_qy1,y2,⋯,yq 个据点中。为了发起进攻,小白建造了很多的 “折跃棱镜”原创 2020-07-13 10:37:31 · 324 阅读 · 0 评论 -
BZOJ 3083 遥远的国度 (树链剖分 + 换根讨论)
Descriptionzcwwzdjn 在追杀 zhx ,而 zhx 逃入了一个遥远的国度。当 zcwwzdjn 准备进入遥远的国度继续追杀时,守护神 RapiD 阻拦了 zcwwzdjn 的去路,他需要 zcwwzdjn 完成任务后才能进入遥远的国度继续追杀。问题是这样的:遥远的国度有 nnn 个城市,这些城市之间由一些路连接且这些城市构成了一颗树。这个国度有一个首都,我们可以把这个首都看做整棵树的根,但遥远的国度比较奇怪,首都是随时有可能变为另外一个城市的。遥远的国度的每个城市有一个防御值,第 ii原创 2020-07-10 17:01:15 · 248 阅读 · 1 评论 -
BZOJ 2243 [SDOI2011] 染色(树剖 + 线段树)
Description给定一棵有nnn个节点的无根树和mmm个操作,操作有2类:1、将节点aaa到节点bbb路径上所有点都染成颜色ccc;2、询问节点aaa到节点bbb路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221112221112221”由3段组成:“111111”、“222222222”和“111”。请你写一个程序依次完成这mmm个操作。Input第一行包含2个整数nnn和mmm,分别表示节点数和操作数;第二行包含nnn个正整数表示nnn个节点的初始颜色下面 行每行原创 2020-07-09 16:05:45 · 144 阅读 · 0 评论 -
2019 南昌网络赛 J. Distance on the tree (树链剖分 + 离线 + 线段树)
DescriptionDSM(Data Structure Master) once learned about tree when he was preparing for NOIP(National Olympiad in Informatics in Provinces) in Senior High School. So when in Data Structure Class in College, he is always absent-minded about what the teache原创 2020-07-09 11:38:20 · 163 阅读 · 0 评论 -
Codeforces 343D. Water Tree (树链剖分 + 区间染色)
DescriptionMad scientist Mike has constructed a rooted tree, which consists of n vertices. Each vertex is a reservoir which can be either empty or filled with water.The vertices of the tree are numbered from 1 to n with the root at vertex 1. For each ver原创 2020-07-08 21:31:42 · 221 阅读 · 0 评论 -
HDU 4719 Oh My Holy FFF (线段树+DP)
DescriptionN soldiers from the famous “* FFF *army” is standing in a line, from left to right.o o o o o o o o o o o o o o o o o o/F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F/ \ / \ / \ / \ / \原创 2020-07-04 19:35:45 · 174 阅读 · 0 评论 -
Gym - 101982F Rectangles (扫描线)
DescriptionYou are given several axis-aligned rectangles. Compute the sum of the area of the regions that arecovered by an odd number of rectangles.InputThe first line of input contains a single integer n(1≤n≤1e5)n (1 ≤ n ≤ 1e5)n(1≤n≤1e5), representing原创 2020-07-04 11:30:38 · 276 阅读 · 0 评论