数据结构
如题
Yuhan の Blog
这个作者很懒,什么都没留下…
展开
-
蓝桥杯 PREV-31 小朋友排队(树状数组)
题目链接:PREV-31 小朋友排队思路:分析题意不难理解出某个人的移动次数为(排在他前面比他高的人数+排在他后面比他矮的人数);使用树状数组可以高效地计算得到上面两项数据(使用时注意将每个人的身高加1,因为有0身高的存在);每个人的不高兴程度就是ai(ai+1)2\frac{a_i(a_i+1)}{2}2ai(ai+1),其中aia_iai代表此人的移动次数;代码:...原创 2020-02-25 15:36:32 · 190 阅读 · 0 评论 -
蓝桥杯 PREV-54 合根植物(并查集)
题目链接:PREV-54 合根植物思路:并查集裸题代码:#include<bits/stdc++.h>using namespace std;const int maxn = 1000 * 1000;int par[maxn], rk[maxn], tot;void init_set(int n) { tot = n; for(int i = 1; i &...原创 2020-02-09 15:05:14 · 138 阅读 · 0 评论 -
团体程序设计天梯赛 L3-017 森森快递 (30分)(线段树区间更新)
题目链接:L3-017 森森快递 (30分)思路:题意可以理解为按一定顺序选取这些线段,每选取一个线段,求出该区间最小值,然后区间内都减去这个最小值,依次取下一个线段,我们需要求减去值的总和的最大值;想象一下,每次选取完一段有效线段后,总区间内将会出现1或多个0值,这将导致其它覆盖这些端点的且未选取线段会失效(即选取了区间最小值为0,即不能运输货物);我们采用贪心的思想,使这些0值...原创 2020-02-03 21:35:53 · 692 阅读 · 0 评论 -
团体程序设计天梯赛 L3-003 社交集群 (30分)(并查集)
题目链接:L3-003 社交集群 (30分)思路:对于每个爱好我们存一个代表人物进去,然后遇到其它有这个爱好的人就使用并查集将它们合并起来;代码:#include<bits/stdc++.h>using namespace std;const int maxn = 1005;int n, par[maxn], a[maxn];inline void ini...原创 2020-01-28 16:48:52 · 273 阅读 · 0 评论 -
团体程序设计天梯赛 L3-002 特殊堆栈 (30分)(树状数组+二分)
题目链接:L3-002 特殊堆栈 (30分)思路:用stack容器模拟栈的入栈和出栈;用树状数组bit[i]维护前缀和;查找中值时二分树状数组的sum()即可;代码:#include<bits/stdc++.h>using namespace std;const int maxn = 1e5 + 5;int n, bit[maxn];inline vo...原创 2020-01-28 16:23:33 · 293 阅读 · 0 评论 -
Codeforces 1294F Three Paths on a Tree
题目链接:Codeforces 1294F Three Paths on a Tree思路:首先三个点中有两个点一定是该树的直径之一的两个端点,我们设为a,b;(不会证明orz)还剩一个点c,设len(a,b)len(a,b)len(a,b)是a到b的距离,则答案即为len(a,b)+len(b,c)+len(a,c)2\frac{len(a,b)+len(b,c)+len(a,c)...原创 2020-01-23 18:35:09 · 368 阅读 · 0 评论 -
团体程序设计天梯赛 L2-010 排座位 (25分)(并查集)
题目链接:L2-010 排座位 (25分)思路:两个人有敌对也有共同的朋友就输出OK but...;朋友的朋友也是朋友;两个人不可能同时是朋友和敌人;缓缓打出一个?言归正传,虽然题意有点迷,但是不要想太多按部就班做就可以;对于一个朋友集体我们用并查集来维护就好;代码:#include<bits/stdc++.h>using namespace std;...原创 2020-01-20 17:11:07 · 313 阅读 · 0 评论 -
Codeforces 1288E Messenger Simulator(BIT)
题目链接:Codeforces 1288E Messenger Simulator思路:1.对于每个数,它的最小要么是被移到最左边是1,要么就是初始位置;2.至于计算最大,贪心的思想是:如果一个数要被移动,我们在移动之前计算一下这个数左边有多少个;同时所有移动结束后也应该计算一下;最大取所有历史计算值的最大值;3.如何快速的计算左边有多少个数呢?这种动态前缀和当然是用树状数组,如何...原创 2020-01-15 20:25:48 · 478 阅读 · 0 评论 -
PAT顶级 1014 Circles of Friends (35分)(并查集+BFS)
欢迎大家访问我的PAT TOP解题目录~https://blog.csdn.net/qq_45228537/article/details/103671868题目链接:1014 Circles of Friends (35分)思路:首先使用并查集就能很快求出集合个数;然后再对每个点BFS即可,虽然O(n2)O(n^2)O(n2),但是毕竟n不大;代码:#include...原创 2020-01-07 14:08:51 · 266 阅读 · 0 评论 -
PAT顶级 1027 Larry and Inversions (35分)(树状数组)
题目链接:1027 Larry and Inversions (35分)思路:首先计算出原数组逆序数的对数;然后依次考虑翻转的情况,我们注意到翻转是有规律的:假设我们已经计算得出了从i翻转到j的逆序数对数,则计算i翻转到j+1的逆序数对数,我们只需知道i到j的数中比第j+1个数小的数的个数,我们记为sm,则比j+1个数大的数的数量自然就是j-i-sm,记为gt,那此次翻转我们新获得...原创 2020-01-02 21:05:54 · 321 阅读 · 1 评论 -
PAT顶级 1009 Triple Inversions (35分)(树状数组)
题目链接:1009 Triple Inversions (35分)思路:1.如果是两个数字的情况,那就是逆序数问题,一个树状数组即可解决,可以参考顶级1010题;2.本地是计算三个数组构成的逆序数对数;我们在计算两个数构成的逆序数时,采用从后往前遍历,每次查询、然后加入的操作,目的是看有多少数排在自己后面却比自己小;同样的我们在计算本题时,需要多维护一个树状数组:从后往前遍历,设su...原创 2019-12-31 20:16:43 · 283 阅读 · 0 评论 -
HDU 3948 The Number of Palindromes(后缀数组+RMQ)
题目链接:3948 The Number of Palindromes思路:我们使用后缀数组+RMQ可以实现查找回文的功能,这题的重点的去重过程;为了方便去重,我们不按字符串的下标来遍历,而按以及排好的rk[]的顺序去遍历;维护一个变量cnt记录上次的回文串长度和此次高度数组两者的最小值,如果此次RMQ查询结果大于cnt,说明有新的回文串,否则就是重复的。代码:#includ...原创 2019-12-27 19:43:26 · 118 阅读 · 0 评论 -
PAT 甲级 1107 Social Clusters (30分)(并查集)
思路:1.先用并查集算出所有交友圈集合;2.再挨个遍历每个用户,查询他在哪个集合,相应集合数量++,最后数量倒序输出即可;代码:#include<bits/stdc++.h>using namespace std;const int maxn=1005;int n,par[maxn],rnk[maxn],tag[maxn],peo[maxn];void init_(...原创 2019-12-05 12:55:50 · 189 阅读 · 0 评论 -
POJ 2352 Stars(树状数组)
思路:(刚开始想歪了,想着先离散然后用二维BIT来做,结果内存根本hold不住QAQ)这道题既然是按y升序给我们的序列,我们在遍历到这个序列时,查一下有多少x小于我们当前的x就ok了,区间求和、单点修改自然用树状数组最方便了~代码:#include<iostream>using namespace std;const int maxn=15000+5;const in...原创 2019-12-04 18:07:36 · 164 阅读 · 0 评论 -
POJ 2155 Matrix(二维BIT维护差分数组)
思路:1.这道题的要求是让我们在二维的情况下进行区间修改、单点查询;2.我们首先转变一下思维,将取反变成+1,如果该点是奇数,则说明该点值为1,否则为0;3.我们考虑一下在一维的情况下如何进行区间取反,单点查询;这里我们需要有差分的思想,我们设差分数组为d[],原数组为a[],我们需要做的就是对于每个i,有d[1]+d[2]+...+d[i]=a[i],即原数组a[i]是d[i]的前缀和数...原创 2019-12-04 10:33:49 · 217 阅读 · 0 评论 -
Codeforces 1263E Editor(前缀和数组基于线段树的RMQ)
思路:1.在文本中,我们让(值为1,)值为-1,其它值为0,将该文本看成一个int数组,我们就可以得到这个数组的前缀和数组;2.这个前缀和数组的最大值就是最多嵌套的层数;而最小值如果小于0则说明在从最左侧往右的某一段文本中,有)的数量多于(的情况,这是非法的;3.同时我们在执行指令的过程中,用一个变量ans来记录第一条里面提到的int数组的总和(其实就是前缀和数组的最后一个有效值),如果a...原创 2019-12-02 16:07:45 · 165 阅读 · 0 评论 -
HDU 3015 Disharmony Trees(树状数组)
思路:1.我们首先hashhashhash一下,计算出每棵树它的xxx和hhh的排名,用pair<int,int>类型的数组存储每颗树,然后按hhh的排名降序排列;2.我们用降序排列好的数组,来一个个进行遍历;遍历之前我们应该先建好两个BITBITBIT,两个树状数组的计算函数(cal(i,1)和cal(i,0),其中i代表位置,1代表第一个树状数组,0代表第二个树状数组)的意思...原创 2019-11-30 17:01:22 · 256 阅读 · 0 评论 -
Codeforces 1263D Secret Passwords(并查集)
思路:这题思考一下就可以知道是对二十六个字母使用并查集进行合并;但是要注意区分没有出现过的字母;代码:#include<bits/stdc++.h>using namespace std;const int MAX_N=26;int par[MAX_N],rank_u[MAX_N];void init_union(int n){ for(int i=0;i<...原创 2019-11-30 03:43:46 · 313 阅读 · 0 评论 -
HDU 1754 I Hate It(线段树解决RMQ问题)
思路:这是线段树的裸题,可以解决区间最大/最小值查询、点修改问题;如果涉及区间修改,那就需要采用lazy方法了~代码:#include<iostream>#include<algorithm>using namespace std;const int MAX_N=2e5+5; int n,m,N;int dat[MAX_N<<2];voi...原创 2019-11-29 18:35:18 · 120 阅读 · 0 评论 -
HDU 2795 Billboard(线段树查询区间最大值)
思路:1.采用线段树存储区间最大值;2.左子树和右子树均满足条件时优先选择左子树;3.区间长度取min(h,n)即可,直接取h数组开不到那么大;4.注意边界情况,即区间长度为1,此时线段树只有第0个值,在查询到的下标>h-1时不可直接返回,应该判断该点是不是真的大于(等于)我们要查询的值;代码:#include<iostream>#include<algo...原创 2019-11-27 18:57:57 · 240 阅读 · 0 评论 -
HDU 1698 Just a Hook(线段树的区间修改)
思路:这题考察线段树的区间修改,如果不做优化会使复杂度非常糟糕,优化的办法就是用lazy-tag方法。当修改的区间覆盖当前遍历到的区间时,只对当前结点做出修改,不继续深入,并给它做标记,在代码中体现在rcd[]数组中。当需要继续深入时,采用push_down方法去更新它的子节点;代码:#include<iostream>using namespace std;templa...原创 2019-11-27 16:06:39 · 134 阅读 · 0 评论 -
Codeforces 1261B2 Optimal Subsequences (Hard Version)(树状数组)
思路:1.听说这题可以用主席树orz,本菜鸟学了一天主席树,发现主席树可以很方便的求任意区间的第k小/大,但是这题区间里的数是动态的,然后就束手无策了QAQ;2.这题先把数据都保存下来,然后离线求每个询问;对于每个数,我们用pair存储,值大的排在前面,值相同的序号小的排在前面(用贪心思想迎合题意);对于每个查询,我们按它的k分类存储,存在一个vector<pair<int,in...原创 2019-11-26 21:41:44 · 225 阅读 · 0 评论 -
HDU 1394 Minimum Inversion Number(树状数组)
思路:1.有一道求逆序数的问题,用树状数组可以解决;2.将最前面的数(a[i])移到最后面时,掌握inversion number之间递推关系就可以了:ans=ans+n−1−2∗a[i]ans=ans+n-1-2*a[i]ans=ans+n−1−2∗a[i]代码:#include<iostream>#include<algorithm>using nam...原创 2019-11-26 14:54:05 · 108 阅读 · 0 评论 -
PAT 甲级 1118 Birds in Forest (25 分)
之前看柳婼学姐PAT经验集,觉得她讲输出的时候一定要注意,特别是大小写,我还不以为意,觉得这个没什么,今天就踩雷了…一直答案错误,还好最后看出来大小写的问题。所以大家在刷题和考试的时候千万注意啊…思路:1.由于鸟的index是连续的,因此我们记录遇到的最大的编号,就是鸟的数量;2.使用并查集算法,遍历数组,记录最后编号和自己一样的鸟的数量,即树的数量;3.每遇到两个鸟,去寻找他们的上级,直...原创 2019-09-02 20:15:26 · 272 阅读 · 0 评论 -
CCF CSP 201812-4 数据中心
思路:这题直接抄并查集和Kruskal模板就行;(做题前:为什么要用板子,我可以自己写。做题后:板子真香啊。)代码:#define IOS ios::sync_with_stdio(false);cin.tie(0)#include<bits/stdc++.h>using namespace std;const int MAX_N=50005;const int M...原创 2019-11-14 17:44:27 · 169 阅读 · 0 评论 -
CCF CSP 201809-3 元素选择器
这题考验思路的清晰和对细节的把握;刚开始不会写的时候翻了很多大佬们的代码,他们都说简单,萌新瑟瑟发抖…在参考其它大佬们的代码时也发现了他们的一些bug,例如按题目中的样例,用h1 h2去测试的时候,有些博主的代码会输出1 8,但实际上这是一个树状结构,理应输出0,希望大家在参考其它大佬的代码时不要产生和我一样的疑惑^ _ ^题目:题目略长直接放链接了~201809-3 元素选择器思路:...原创 2019-10-19 14:49:29 · 255 阅读 · 0 评论 -
PAT 顶级 1010 Lehmer Code (35 分)
思路:1.这道题实际上就是计算逆序数,而计算逆序数有两种方法:(1)运用树状数组(Binary Indexed Tree)计算;(2)通过分治思想利用归并排序计算;这里的代码仅展示第一种,虽然后一种也很简单;2.注意直接使用BIT是不可取的,因为题目并没有说明Ai的范围,不可以直接将a[i]加入到BIT中,此时我们需要计算每一个a[i]的排名,将a[i]的排名加入进去就好了~代码:#...原创 2019-11-09 14:16:16 · 252 阅读 · 0 评论 -
Codeforces 1249B2 Books Exchange (hard version)
思路:1.用并查集的思想,将每个cycle认为成一个集合;2.对于某个人来说,book回到他手上的次数就是他所属集合的人数;代码:#include<bits/stdc++.h>#define N 200010using namespace std;int kds[N];bool vis[N];map<int,int> mp;vector<vecto...原创 2019-10-23 20:48:46 · 345 阅读 · 0 评论