
数据结构
zijiang.yang
没什么意思的人!
展开
-
生产者-消费者模型
考研例题:生产者-消费者例题桌子上有一个盘中,每次只能向其中放入一个水果。爸爸专门向盘子里放苹果,妈妈专门向盘子里放橘子。儿子专门拿苹果。女儿专门拿橘子。仅当盘子里有自己要拿的水果,才去拿。实现代码:#include <semaphore.h>#include <iostream>#include <mutex>#include <thread>using namespace std;/*共享资源*/sem_t PlateEmpty, P原创 2022-01-20 22:56:09 · 374 阅读 · 0 评论 -
Peterson‘s Algorithm模拟 实现两个线程互斥
具体参照王道考研操作系统77页实现代码,环境c++11及以上#include <iostream>#include <thread>using namespace std;/*实现两个线程竞争时互斥*/int flag[2], trun;void pr(char ch, int i) { flag[i] = 1; trun = i ^ 1; while (flag[i ^ 1] && trun == (i ^ 1)) ; co原创 2022-01-20 10:47:35 · 416 阅读 · 0 评论 -
C++手动实现HashTable
思路都写代码注释上了头文件:#ifndef _HASHTABLE_H_#define _HASHTABLE_H_#include <iostream>#include <list>#include <memory>#include <queue>/*元素节点类*/class Node { public: Node(int key = 0, int val = 0, bool isexit = false) : _key(k原创 2021-10-28 09:52:59 · 323 阅读 · 0 评论 -
HDU 3966 + 树链剖分复习 + 视频讲解
树链剖分学习 参考代码:#include <cstdio>#include <algorithm>#include <iostream>#include <vector>#include <map>#include <queue>#include <set>#include <cti...原创 2020-07-15 13:01:11 · 1914 阅读 · 4 评论 -
洛谷P3369(范浩强Treap)知识回顾+视频讲解
在考试完的一个多月里面,基本上 没有学习新的算法,之前学的算法忘的也差不多了,今天回顾一下,之前学的(范浩强 Treap),并录制了视频,有些地方有些不足,请见谅。 Fhq Treap 入门 参考代码:#include <cstdio>#include <algorithm>#include <iostream>#include <vec原创 2020-07-14 15:11:33 · 416 阅读 · 0 评论 -
leetcode 739 每日温度(单调栈)
请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。思路:用栈的栈顶坐标来表示最大值的坐标,从而得原创 2020-06-12 12:09:51 · 307 阅读 · 0 评论 -
洛谷 P4309 最长上升子序列(平衡树维护)
传送门:题目描述给定一个序列,初始为空。现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置。每插入一个数字,我们都想知道此时最长上升子序列长度是多少?输入格式第一行一个整数N,表示我们要将1到N插入序列中。接下是N个数字,第k个数字Xk,表示我们将k插入到位置Xk。(0<=Xk<=k-1,1<=k<=N)输出格式N行,第i行表示i插入Xi位置后序列的最长上升子序列的长度是多少。输入输出样例输入#1:30 0 2输出#1:112思原创 2020-05-16 10:29:26 · 436 阅读 · 0 评论 -
文艺平衡树(Fhq Treap)
传送门:文艺平衡树首先要阐述一点,Fhq Treap的按大小分裂是支持区间操作的,而按值分裂是不支持区间操作的。Fhq Treap的分裂方式:按权值分裂按大小分裂按权值分裂:根据插入点的权值,将树按w为边界,分裂为两颗树,一颗树的权值大于w,一棵树的权值小于等于w,这样再把新节点合并进去,就可以维护树的平衡按大小分裂:根据插入点的节点大小,将树按big为边界,分裂为两颗树...原创 2020-05-07 22:07:35 · 1563 阅读 · 2 评论 -
SPOJ DQUERY(主席树)
传送门题意:给长度为n的序列,询问区间中的元素个数(去重后的元素个数),m次询问,n在[1,3∗104],m在[1,2∗105]n在[1,3*10^4], m在[1,2*10^5]n在[1,3∗104],m在[1,2∗105]。思路:用主席树去写,每颗树存从[1,i][1,i][1,i]区间的信息,我们把这颗树中出现多次的数去重,只保留最每个数在最右边出现的位置信息,其余位置的sum为0,...原创 2020-05-03 19:17:18 · 256 阅读 · 0 评论 -
Fhq Treap 实现(二叉堆)优先队列
经验证:Fhq Treap根据二叉堆性质实现的优先队列,是没有问题的 (因为我已经试过了一些题)我们如想要更改出队优先级,其实很简单,我们只需要改变递归的方向即可,一直向左递归到最终的叶子节点,是最小,同理向右是最大封装优先队列函数:struct queue{ const int base = 131; int su = 1; int ran() {...原创 2020-05-03 11:13:21 · 206 阅读 · 0 评论 -
Fhq treap P3369 【模板】普通平衡树
传送门:学了Fhq Treap之后,我深深的了解到 Fhq Treap的牛逼,因为上一张学了替罪羊平衡树,码量很大,操作繁琐,不支持提取区间信息,虽然简单理解,但是Fhq也很好理解呀,而且码量不大,能快速维护一颗平衡树,支持提取区间信息Fhq Treap 的骚操作:分裂合并分裂:分裂操作其实很简单理解,把一颗平衡树按照插入的值为界限,分裂成两棵树,记录两个树的根节点即可合...原创 2020-05-02 17:59:50 · 240 阅读 · 0 评论 -
替罪羊树
替罪羊树入门:以洛谷模板题为例:普通平衡树这题正解是替罪羊树,呢么什么是替罪羊树?替罪羊树其实就是一颗平衡树,但是我们要如何去维护树的平衡呢?俗话说,暴力即优雅,替罪羊树,是通过重新构造不平衡的子树来进行维护树的平衡的替罪羊树的部分:插入操作:插入节点((检查树的平衡(不平衡,则重构树(中序遍历,分治重构树,),更新树的节点信息)))删除操作:删除节点((检查树的平衡(不平衡...原创 2020-05-02 08:45:39 · 361 阅读 · 0 评论 -
ACwing 826单链表:
数组模拟实现链表操作:链表:实质上是含有数据信息和前驱的节点组成的链,通过改变前驱来对链表进行增加,删除和插入,和链式前向星原理相同参考代码:#include<bits/stdc++.h>using namespace std;int head=-1,cnt,q[100005],nex[100005];void add(int x){ q[cnt]=x; ...原创 2020-04-07 13:03:22 · 227 阅读 · 0 评论 -
2020NYIST个人积分赛第一场 C(动态开点线段树)
题意:晚上有n个亮着的灯泡,标号从1到n。现在存在2种操作,如下:操作1,关掉标号 [l,r] 区间的灯 操作2,打开标号 [l,r] 区间的灯下面有q次询问,每次询问执行其中一种操作,询问格式,l,r,k,k为执行操作种类。对于每次询问回答当前开着的灯的数量。思路:普通线段树会炸,需要用动态开点线段树来写,离散化感觉不太好写。我们用动态开点线段树,求询问区间内的关灯数量,然后用...原创 2020-05-03 19:20:03 · 344 阅读 · 2 评论 -
Bzoj: 2243: [SDOI2011]染色 (树链剖分+线段树合并)
题目连接1:题目连接2:题目:题解:这题其实主要问题是线段树合并,当我们写出线段树合并的代码后,往树链剖分的板子上一套,然后因为树链的查询是分不同的链来写的,所以我们需要在查询答案时候,判断接下的点,与之前连接在一起的点之间的关系,来进行合并,如果颜色相同,合并的数量等于两条链之和-1,反则为两条链之和。主要步骤是写出线段树合并的代码。AC代码:#include<bits...原创 2020-03-24 10:29:11 · 160 阅读 · 0 评论 -
ACwing:1228. 油漆面积 (扫描线:线段树魔改(非离散化))
ACwing:1228. 油漆面积扫描线:对于扫描线,我们可以将线段树改进成真的线段树,进行操作,这样即可避免离散化,还可以避免在找区间的时候找到单点,这样就会很容易了,所以我们可以对线段树进行一波改进例如数据:31 5 10 103 1 20 202 7 15 17我们可以通过一条平行于y轴的线对y坐标进行扫描,首先我们需要对x坐标进行结构体排序,让x坐标分好块,然后对y...原创 2020-03-16 21:36:54 · 349 阅读 · 0 评论 -
ACwing:135. 最大子序和 (单调队列解法)
ACwing:135.最大子序列和题意:给长度为n的序列,从中找出连续长度小于m的最大子序列和题解:我们可以用单调队列去维护可行区间内的最最小前缀和,然后枚举a[i]-a[q[head]]的最大值AC代码:#include<bits/stdc++.h>using namespace std;#define ll long longconst ll maxn=1...原创 2020-04-01 10:00:09 · 347 阅读 · 0 评论 -
牛客:矩阵 (二维hash + 二分)
矩阵题解:这题一看题解就豁然了,首先我们处理出字符串矩阵的hash值,然后二分枚举距离,距离的最大范围是 [1,min(n,m)],然后这题数据比较强,好像专门来卡数组取模映射的情况,但是不碍事,我们有 map ,虽然map对于这种 O(n^2)的时间复杂来说有点慢,但是这题显然没有卡,我用取模时,显然重复几率很大。AC代码:#include<bits/stdc++.h>...原创 2020-02-28 20:25:33 · 327 阅读 · 1 评论 -
bzoj 2462 矩阵模板 (二维hash)
二维hash用于一般解决字符串矩阵问题,我们可以定义两个 进制数,求出mn字符串矩阵影视的数求大小位 rc的子矩阵,可以由推得 :ans[i][j]=hash[i][j]-hash[i][j-r]*p1[r]+hash[i-c][j]*p2[c]]+hash[i-1][j-1]*p1[r]*p2[c];矩阵模板题解:我们先求出整体矩阵的hash[ ][ ]: 在根据上面公式求...原创 2020-02-28 16:45:00 · 238 阅读 · 0 评论 -
ACwing 哈希算法入门:
哈希算法:将字符串映射为数字形式,十分巧妙,一般运用为进制数,进制据前人经验,一般为131,1331时重复率很低,由于字符串的数字和会很大,所以一般为了方便,一般定义为unsigned long long,爆掉时,即为对 2^64 取模,可以对于任意子序列的值进行映射为数字进而进行判断入门题目链接:AC代码:#include<bits/stdc++.h>using na...原创 2020-02-21 17:36:23 · 368 阅读 · 0 评论 -
HYSBZ 1036(树的统计) 树链剖分
传送门:树的统计题意:维护树上区间最值和区间和,加上单点修改题解:树链剖分的题,我们只要把线段树部分的操作写好,这题也就那回事,毕竟树链剖分是个模板,而且好理解,注意不要用cin和cout 会 TLEAC代码:#include<bits/stdc++.h>using namespace std;#define ll long longconst ll max...原创 2020-02-12 18:18:32 · 157 阅读 · 1 评论 -
HDU 3966 Aragorn's Story(树链剖分+线段树区间更改+单点查询)
由于hdu的oj在维修,我的代码提交不了,所以很遗憾,我现在写的代码不能确认其正确性,有点难受。其实这个题是一个简单的树剖板题,但是我敲完代码后,准备交,但是由于以上原因,交不了,我就去搜了题解,看了正解和我的代码的懒标部分不太一样,所以我不知道我的代码的正确性,我也测了一些样例感觉没什么问题,所以就先放着再说正确性待定代码:#include<cstdio>#include&...原创 2020-01-30 23:03:51 · 157 阅读 · 0 评论 -
树链剖分板题入门:P3384重链剖分
题目连接:重链剖分思路:把树剖剖分出来,然后就线段树上修改,注意每次先修改当前节点所在链的头的深度大的,然后让它为链的头的父亲即可,直道两个点,成为一条链上即可老子搞了你这么多天,滚吧毒瘤题,hhhAC代码:#include<bits/stdc++.h>using namespace std;//树链剖分#define ll long longll n,m,r...原创 2020-01-29 14:27:15 · 189 阅读 · 0 评论 -
树链剖分:洛谷P3128 最大流Max Flow
题目连接:最大流Max Flow题解:这道题可以用树上点差分解决,也可以用树链剖分写,上一篇博客使用树上点差分写的,这次因为我刚学树剖,所以用树剖将这到题写了树剖的写法:第一遍dfs()将重儿子,每个点的父亲,每个点的深度标记出来,第二遍dfs()按照重儿子的顺序进行有优先dfs()得到当前的dfs序,此时树已经被剖分好了,然后我们就写一个线段树求区间最大值,因为是区间修改,所以需要...原创 2020-01-29 14:09:39 · 209 阅读 · 0 评论 -
Poj 3321 AppleTree dfs序+树状数组
题目链接:AppleTree题解:树上线段树的入门题:感觉没什么可说的,维护区间和我没用线段树,数状数组更方便,但是我还是wa了几发,因为用了vector,TLE了,我比赛再也不用vector了,注意如果建双边的话,数组开两倍,还有时间戳代表区间位置,把dfs序求出来即可TLE代码:#include<cstdio>#include<algorithm>#in...原创 2020-01-21 22:10:36 · 184 阅读 · 0 评论 -
HDU 5692 Snacks 好题:dfs序+线段树维护区间最值
题目链接:Snacks最近想学树链剖分,但无奈,前置技能还不会,dfs序还没搞懂是什么玩意,就上B站学习了一波,无奈太菜了,也没听太懂,就了解了个大概,想着去刷道题,练一练,这不,找到了这道 HDU 2692 Snacks,这题真的是好题,费了我不少时间,才搞定, 可能是在家效率太低,可能最近对头发的保养很重视,一天到晚坐在电脑面前学习对目前的我来说是不太可能了。WA了20来发:上干...原创 2020-01-21 18:11:13 · 976 阅读 · 0 评论 -
洛谷:P3258树上点差分
题目链接题解:难点在于根据访问顺序推出差分方式,前置知识:LCA+树上点差分AC代码:#include<bits/stdc++.h>using namespace std ;const int maxn=3e5+5;struct node{ int to,nex;} tr[maxn*4];int pre[maxn][32],depth[maxn],he...原创 2020-01-20 00:19:43 · 295 阅读 · 0 评论 -
树上主席树:洛谷P2636
上厕所的时候想通了,果然厕所是一个思考的好地方普通区间主席树和树上主席树的区别:这两个其实只有建树方式不同而已,普通主席树在for循环里面建树,for循环就相当于线性的区间建树,而树上主席树是在树形结构上建主席树,建出来的主席树有树的性质,所以我们要求任意两点之间最短路径上的第k小,就需要用到lca,这里其实用到了树上点差分的思路,在树上建树其实就是在dfs()遍历树的时候我们将当前版本...原创 2020-01-17 13:08:37 · 435 阅读 · 1 评论 -
树上差分:点差分(P3128 [USACO15DEC]最大流Max Flow)
吐槽:昨天学习了差分数组感觉很不错,通过差分递推答案,很节省时间,昨天晚上睡觉前学习了一波树上差分,没学懂,今天临走前补上,挺好树上差分点差分:我们要对树上一条链的权值进行修改,我们可以利用树上差分,比一个一个点修改快很多,如果一个一个点修改dfs()时间复杂度爆炸啊!树上如何进行点差分:先把两端点加上权值,然后把lca和它的父亲的权值减去,dfs一遍就把一条链上的权值给修改了...原创 2020-01-14 11:19:18 · 206 阅读 · 0 评论 -
差分数组:理解
差分数组:差分数组的思路其实是通过差分,递推出经过部分区间修改后的原数组,例如我们要对区间进行加减操作,最终求某个区间的值举个栗子:a[ ]12345差分p[ ]11111修改区间:| [1 5] +2 | [2,3] -1| [1 3] +3 |修改后的差分p[ ]601-11修改后的a[ ]6676...原创 2020-01-13 17:43:32 · 206 阅读 · 0 评论 -
可持久化数组再理解
吐槽:今天是集训的最后一天,也不知道该学什么,就再复习一下可持久化的思想,又鞭尸了一遍可持久化数组。可持久化思想:对于每次修改的数组我们建立一个新版本,因为我们是动态开点式,对于可以利用的点进行利用,所以空间方面会节省很大。我们将上一版本的树复制一遍,将没有利用到的点省去重新开这个点所多出的空间,用图表示也就是将新开的一条链连上上一个没有用到的点,形成的一颗新树对于多版本root[...原创 2020-01-13 14:52:23 · 191 阅读 · 0 评论 -
可持久化并查集:洛谷p 3402
题目:可持久化并查集模板:洛谷P3402吐槽:板子稳点,心里总是会比较放心的,这题我wa了十几发后成功对着别人的代码找到了问题,并查集按秩合并里面我把rank[x]++写错了 modify(int l,int r,rootrank[ver-1],root[ver],x,depx+1),本来应该这样写,我把下标给弄错了,真难受题解:可持久化并查集需要用到按秩合并的方法写,不能用路径压缩...原创 2020-01-04 15:18:38 · 375 阅读 · 0 评论 -
并查集之按秩合并
最近在学可持久化数据结构,看了看可持久化并查集,无奈本人很菜,只会路径压缩实现并查集,不会其他方法,但是可持久化并查集用路径压缩会炸内存,所以我们需要用到按秩合并的方法去维护树形集合按秩合并的特点,秩低的向秩高的进行合并看下代码:int findx(int x){ if(x!=pre[x]) { pre[x]=findx(pre[x]); } ...原创 2020-01-04 10:49:12 · 1032 阅读 · 2 评论 -
可持久化数组:洛谷3919
最近一直在搞数据结构,主席树,理解也不算特别深刻,还没有对动态开点和可持久化思想理解特别深刻,所以,今天我就准备写一篇可持久化数组来通一通脑子新手入门题目:洛谷:可持久化数组就题论题:给一个数组a[ ]:我们可以对其进行修改,然后询问不同版本的值,最初的版本为:0,修改一次就产生一个新版本朴素做法:写一个二维数组ver[i][j] i 代表版本,然后寻问 第 i 个版本第pos...原创 2020-01-04 08:47:27 · 228 阅读 · 0 评论 -
树的直径模板题:poj1985
题目链接:树的直径题解:树的直径:max(bfs(1),bfs(pp)),证明就不证明了,结论是从树上任意一点,到距离它最远的另一点pp,再从pp到距离它最远的一点p,当前p的距离就是树的直径AC代码:#include<cstdio>#include<algorithm>#include<cstring>#include<vector&g...原创 2020-01-03 10:21:09 · 439 阅读 · 0 评论 -
D.Restore Permutation
题目链接题意:给你一个序列s:s代表的是p[i]前小于p[i]的数组加起来的和,比如 3 2 1 的s:0 0 0题解:我们每次一定可以确定的是最后一位的数,因为最后一位前面一定有所有小于它的数,所以我们可以确定最后一位的数,我们确定最后一位后,把他从数组中删去,然后在在接下来的数组中求最后一位的值,因为是最后一位对前面的值并不造成影响所以二分查找答案即可AC代码:#inclu...原创 2020-01-03 09:17:58 · 201 阅读 · 0 评论 -
等差子数列:rmq+分块思想
题目链接:等差子数列题解:看到这一题,我的想法是利用分块去写,将等差数列分为一块,但是由于等差数列有连续性,故利用分块思想,将解答案分为三步,两边角的,最大等差数列长度,再求中间部分的最大序列长度,中间部分可以利用rmq去求,因为是数列,所以求区间最值用rmq就很方便了AC代码:#include<cstdio>#include<algorithm>#inc...原创 2020-01-02 14:50:40 · 245 阅读 · 2 评论 -
树上倍增:求LCA(u,v)
求LCA(u,v)的三种方法:1:rmq+dfs()序2:并查集+dfs()3:树上倍增然而听说1,2两种方法不怎么火热,3是目前最受欢迎的,故我就跟随大众潮流,学了树上倍增求LCA(u,v)的方法树上倍增:利用了rmq的思想,首先定义一个pre[i][j]数组,pre[i][j] 表示 i 往上走 2^j 层所表示的父辈,根据倍增关系,我们可以得到:pre[i][j]=pre[pr...原创 2020-01-01 17:16:01 · 268 阅读 · 0 评论 -
rmq查询区间最值
rmq:时间复杂度:O(nlogn)的时间复杂度,利用动态规划进行预处理,dp[i][j], i:代表以i为起点,j:代表 i+(1<<j)-1 的长度,dp[i][j]代表:[i,i+(1<<j)-1]区间的最大值,由于区间的合并性质,可以写出所有以 i 为起点 i+(1<<j)-1长度的区间最大值查询操作:查询区间[l,r],由于log2(r-l+1)...原创 2020-01-01 11:38:44 · 178 阅读 · 0 评论 -
Hysbz 回转寿司 权值线段树+动态开点
Hysbz: 动态开点+权值线段树避免炸空间的离线做法和在线做法对于操作权值线段树,避免炸内存,有在线做法和离线做法,离散化是离线做法,但是离散化需要的是,我们对数据大小不做考虑,仅考虑数据数量,而且数据数量比较少,方可离散化,而在线做法的动态开点则显得更加有优势,他既能考虑数据大小,又能不炸空间普通线段树和动态开点线段树比较普通的线段树,先把要的所有空间开出来,而动态开点线段树,是...原创 2019-12-18 14:26:54 · 339 阅读 · 0 评论