![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 52
数据结构体算法题
张小生的先生
你要觉得我博客还行,就点赞加个关注,有意深聊的可以私信,随时欢迎,当然有女性想深聊的我更欢迎,要是男性的话不建议私聊,我跟一大老爷们真聊不起来。我人品五五开,胆小不好色,对女性要求不高但要识大体,样貌看得过去就行,其它的也就那样了。我不仅把这个当作学习博客也当作一个招友的圣地,希望在这里遇见更好的你。
展开
-
[“深圳计算科研院杯“E起来编程暨第三届湖北省赛] D.WA (优先队列)
题目链接:D.WA题解维护出相邻a之间的长度以及左右下标,按照长度从小到大放入优先队列,显然队首出队的永远是长度最小的,我们就将该区间内的字母全部变为a即可。注意第一次出现a往前的区间以及最后一次出现a往后的区间没有考虑。所以如果k有剩余就考虑这两个区间,不断变a即可。代码#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<bits原创 2021-05-06 19:10:00 · 291 阅读 · 0 评论 -
[2021年度训练联盟热身训练赛第一场] E. Early Orders (单调栈)
题目链接:E. Early Orders题解题目大意是给一个长度为n的序列,要求找到一个字典序最小的子序列只包含1~k一次。本题可以用单调栈解决,每当我们遍历到一个数ai{a_i}ai,如果当前数小于栈顶的元素并且存在aj(j>i){a_j (j>i)}aj(j>i)等于栈顶元素,那么我们就可以删除当前栈顶的元素,不断删除直到不符合条件为止,然后将当前元素入栈。再用一个vis标记元素是否已经在栈里,如果当前元素已经在栈里,就不再需要入栈。代码#include<iost原创 2021-05-06 17:02:54 · 85 阅读 · 0 评论 -
[Acwing ] 238. 银河英雄传说 (边带权并查集)
题目链接:238.银河英雄传说题解本题的难点在于查询同一集合的两艘战舰间隔多少战舰的问题。我们可以利用前缀和的思想维护一个d[x]:x到f[x](x所属集合终结点)的距离。维护一个集合大小sz[x]:集合x的点数。每当我们要将a集合合并到b集合上时,很明显b集合上的d[x]值是不会发生改变的,影响的是a集合上的值,需要在a集合上每个点的d[x]+sz[b],也就是集合a的点到b集合终结点的距离。但注意其实我们在路径压缩时,会不断的访问父节点、父节点的父节点以至于找到集合最终结点,所以可以得到一原创 2021-04-25 22:43:15 · 131 阅读 · 0 评论 -
[2019 icpc徐州] H.Yuuki and a problem 带修改的主席树(主席树+树状数组)
#include<bits/stdc++.h>typedef long long ll;#define mid (l+r>>1)#define min(a,b) (a<b?a:b)using namespace std;const int N = 2e5 + 10;ll sum[N * 100];int Lc[N * 100], Rc[N * 100], tot;void insert(int& rt, int l, int r, int val, int原创 2021-04-23 22:50:49 · 173 阅读 · 0 评论 -
[Codeforces Round #716 (Div. 2)] D. Cut and Stick 主席树
题目链接:D. Cut and Stick题意给你一个长度为n的序列,有q次查询,每次查询有一个区间范围[l,r],问如何划分a[l]~a[r],使得各个子序列每个数出现次数不超过⌈len2⌉{ \lceil \frac{len}{2} \rceil}⌈2len⌉,len为划分后的区间长度。注意子序列不一定连续。题解首先这道题我们需要知道任意一个区间内出现次数超过⌈len2⌉{ \lceil \frac{len}{2} \rceil}⌈2len⌉的x是谁。如果出现次数都没有超过说明没有必要划原创 2021-04-20 10:12:35 · 143 阅读 · 1 评论 -
[2020 ccpc 长春] F. Strange Memory (树上启发式合并)
题目链接:F. Strange Memory题意给定一个有n个结点以1为根的树,每个结点有个权值ai{a_i}ai,问存在多少u、v对满足au⊕av=alca{a_u \oplus a_v=a_{lca}}au⊕av=alca,统计所有u⊕v{u \oplus v}u⊕v和。题解首先由于结点权值不为0,所以不存在a[u]⊕a[v]==a[u]{a[u] \oplus a[v]==a[u]}a[u]⊕a[v]==a[u]的情况。因此满足条件的点对一定在lca结点下的两个不同子树上。我们可以通过原创 2021-04-19 16:48:22 · 198 阅读 · 0 评论 -
[CF600] E. Lomsat gelral ( 经典树上启发式合并 dus on tree )
题目链接:E. Lomsat gelral题解经典树上启发式合并的题目,按照正常暴力求时间复杂度为O(n2){O(n^2)}O(n2),很明显是有问题的。那么树上启发式合并是如何做的呢。先说一些前导知识重儿子/轻儿子求出每棵子树的大小,节点数最多的一个子树的根节点就是这个节点父节点的重儿子。轻儿子即是节点个数最少的子树的根节点。重边/轻边重边即是连接重儿子与其父亲的边。轻边即是连接轻儿子与其父亲的边。设轻儿子v、父亲节点f,由定义可推2*size(v)<size(f),易得从一原创 2021-04-07 21:46:59 · 224 阅读 · 0 评论 -
Acwing 2154. 梦幻布丁(启发式合并)
题目链接: 2154. 梦幻布丁题解启发式合并入门,将颜色种类少的合并到多的那一类,pla统计每种颜色的各个位置。有时候会出现要将颜色个数多的合并到小的,所以要交换颜色,因此本题用col来统计每个颜色的真实颜色。代码#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<bitset>#include<cassert>原创 2021-03-15 11:55:22 · 227 阅读 · 1 评论 -
P3379 【模板】最近公共祖先(LCA)
题目链接:最近公共祖先(LCA)题解有很多种解法法一:dfs序+ST算法dfs序就是用深搜遍历整棵树得到的序列。两个点的LCA一定是两个点在dfs序中出现位置之间的深度最小的点。int deep[maxn<<1],pos[maxn<<1],cnt=0,seq[maxn<<1];int dp[maxn<<1][20],n,m,s;;vector<int> g[maxn];void dfs(int u,int f,int step)原创 2020-11-24 21:11:23 · 97 阅读 · 0 评论 -
[NWERC 2019] F. Firetrucks Are Red 并差集
并查集问题,认为难点在于建图以及用map去标记。#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<bitset>#include<cassert>#include<cctype>#include<cmath>#include<cstdlib>#include<ctime原创 2020-11-24 17:22:14 · 329 阅读 · 4 评论 -
第十一届蓝桥杯A组省赛第二场-填空题四
第十一届蓝桥杯A组省赛第二场-填空题四题意小蓝要用七段码数码管来表示一种特殊的文字。上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二极管,分别标记为 a, b, c, d, e, f, g。小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。例如:b 发光,其他二极管不发光可以用来表达一种字符。例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。原创 2020-11-02 22:14:40 · 272 阅读 · 0 评论 -
最小生成树 (kruskal)
最小生成树 (kruskal)#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<bitset>#include<cassert>#include<cctype>#include<cmath>#include<cstdlib>#include<ctime>#inc原创 2020-10-16 22:18:39 · 76 阅读 · 0 评论 -
[超级码力在线编程大赛初赛(二)] 3.区间异或 RMQ经典问题
题目链接:区间异或题意给你一个数组num,现在定义一个区间和:左区间的的最大值+右区间的最小值,现在有多组区间,每组区间包含左区间的L1和R1,以及右区间的L2和R2。问各个区间和的异或值是多少。题解经典的RMQ问题,一开始看本题的难度是一星,一直以为有什么巧妙的方法能避免用线段树或者ST表解决,思前想后没搞出来,写了一个权值线段树没有记忆化超时了,脑子一直没转过弯来。最后发现还是得用线段树或者ST表的方法解出。本题其实用线段树维护一个最大值和最小值即可或者维护一个最大值和一个最小值的ST表也行。原创 2020-08-30 17:25:21 · 163 阅读 · 0 评论 -
[超级码力在线编程大赛初赛(一)] 3.大楼间穿梭 dp入门+单调栈
题目链接:大楼间穿梭题意给你一个长度为n的序列,你现在处在下标为1的点,你现在有两个操作向右边行走。花费x点体力,移动到右侧k幢建筑中第一栋大于等于当前位置值的点。花费y点体力,向右移动一步或者两步。问最少花费多少体力才能才能到达最后一个位置上的点。题解本题很明显不存在贪心策略使得答案最优,所以这时就需要优雅的暴力dp来帮助我们解决此类问题了。本题的状态定义和转移很容易定义。dp[i]:移动到位置i时最少需要多少体力。那么转态转移由题意得:dp[i]=min(dp[i],min(d原创 2020-08-29 22:22:49 · 260 阅读 · 0 评论 -
[2020牛客算法竞赛入门课第九节习题] 珂朵莉的数列 离散化+树状数组
题目链接:珂朵莉的数列题意有n×(n+1)2{\frac{n\times(n+1)}2}2n×(n+1) 个子区间,求出她们各自的逆序对个数,然后加起来输出。题解首先我们来看如何求一段序列中所有的逆序对数,求逆序对,我们可以转化为前i个数里,比a[i]大的有多少个。我们可以像桶排序一样,维护一个长度为max(ai){max(a_i)}max(ai)的树状数组,先统计树状数组内当前有多少个数比a[i]大,然后将a[i]更新即可。知道了如何求逆序对数,这道题我们已经解决了一半,但另一半的难点在于如原创 2020-08-07 13:03:30 · 243 阅读 · 0 评论 -
线段树区间修改板子
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<bitset>#include<cassert>#include<cctype>#include<cmath>#include<cstdlib>#include<ctime>#include<deque>原创 2020-08-05 21:22:34 · 181 阅读 · 0 评论 -
[HDU - 1166] 敌兵布阵 线段树/树状数组板子题
题目链接:敌兵布阵题意中文题意,我就不多说了题解线段树点修改的板子/树状数组板子代码线段树#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<bitset>#include<cassert>#include<cctype>#include<cmath>#include<cs原创 2020-08-04 19:46:08 · 111 阅读 · 0 评论 -
智算之道 T3.情报站(并查集)
题目链接:情报站题意给你n个数, 获取m条情报,情报分为两种:1.知道了数列中第 x 个数的值。2.知道了数列中第 x 个数和第 y 个数的和。每得知一条情报,输出得知了前 i 条情报之后数列中已经能够确定的数的数量题解一种解法为并查集。情报一:如果这个数的终极父结点是未被访问的,那么将该数的终极父结点标记,并将这个终极父结点的权值加在答案上。(权值代表该终极父结点所在连通分支里的结点总数。)情报二:你会遇到四种情况,这两个数你都知道、你只知道其中一个(2)以及都不知道这四种情况。如果你都原创 2020-07-22 16:08:44 · 192 阅读 · 0 评论 -
[2020牛客暑期多校训练营第二场] F题 Fake Maxpooling (单调队列)
题目连接:Fake Maxpooling题意:给你n*m的矩阵,矩阵每个值Ai,j=lcm(i,j){A_{i,j}}=lcm(i,j)Ai,j=lcm(i,j),问n*m矩阵下,所有k*k子矩阵里的最大值之和是多少?题解:这题一开始以为是数论,找规律啥的,最后才发现就是个单调队列,先维护行这一维的最大值,会形成一个矩阵,然后再维护列这一维的最大值,最后就得出了所有子矩阵最大值之和。代码:#include<iostream>#include<algorithm>#i原创 2020-07-14 12:59:01 · 185 阅读 · 0 评论 -
牛客-食物链 (扩展域并查集 / 带权并查集)
食物链题目: problem题解:由题可知,A吃B,B吃C,C吃A那么当一个人说出X吃Y时,那么X和Y是同类或者Y吃X时都是谎言。由于“吃”的关系已经确定,那么当我们确定1个后,剩下的也将确定,所以我们只要将这一条“吃的链条”归位一类即可。言外之意,如果X吃Y不是谎言,那么X和Y会被归位一类。A->B->C->A…B->C->A->B…C->A->B->C…当一个人说出X和Y同类时,那么X为A类时,Y也为A类;X为B类时,Y也为B原创 2020-06-01 23:55:18 · 199 阅读 · 0 评论 -
Bad Hair Day单调队列(C解法)
Bad Hair Dayquestion:Farmer John的奶牛在风中凌乱了它们的发型……每只奶牛都有一个身高hi(1 ≤ hi ≤ 1,000,000,000),现在在这里有一排全部面向右方的奶牛,一共有N只(1 ≤ N ≤ 80,000)。对于奶牛i来说,如果奶牛i+1,i+2,……,N这些奶牛的身高严格小于奶牛i,则奶牛i可以看到它们凌乱的发型。比如下面这个例子:* * * * ...原创 2019-02-14 11:19:28 · 639 阅读 · 1 评论