数据结构
HumveeA6
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
tyvj 1305(单调队列模板题)
首先,把数都弄成前缀和sum[i],节约时间; 枚举右端点i,当i固定的时候,问题就变成了,寻找一个左端点j,j在区间 [i-m,i-1]内,并且sum[j]最小; 使用一个单调队列来完成此题,我们从左往右扫一遍右端点,对每个i: 1.判断当前队头的数与i的距离是否大于m,大于就把队头干掉 2.此时队头就是右端点为i时的最佳答案(因为,不是最佳的答案在每次第三步更新sum[i]进队的时候...原创 2018-02-11 19:59:35 · 377 阅读 · 0 评论 -
(模板)Splay 平衡树
不会讲解,直接上板子,按照洛谷P3369的要求 #include<iostream> #include<cstring> #include<cstdio> using namespace std; const int MAXN=1000000; int ch[MAXN][2],f[MAXN],size[MAXN],cnt[MAXN],key[MAXN]; ...原创 2018-07-10 20:34:58 · 299 阅读 · 0 评论 -
2018 Spring Training 数据结构
这次的题目不少难度还是挺大的,对萌新挺不友好哇233…只会做一部分了2333 基本上就是,要么不会做,要么会做不想写贼复杂那种… A.BZOJ1007 可以观察到,我们要求的是一个凹形的图形。 首先,我们先按k升序为第一关键字,b降序为第二关键字,然后用一个单调栈(单调队列)来维护这些直线。 若当前直线i能完全覆盖栈顶直线s[top],也就是上一条加进去的直线(不一定是第一条直线哦),则...原创 2018-06-05 16:20:38 · 281 阅读 · 0 评论 -
(模板)Trie树(字典树)
模板按照的是洛谷P2580的要求写的,query函数返回3种状态:不存在此单词,存在且第一次查询,存在且多次查询 指针版: #include&lt;cstdio&gt; #include&lt;iostream&gt; #include&lt;vector&gt; #include&lt;cstring&gt; #include&lt;algorithm&a原创 2018-03-28 22:45:24 · 463 阅读 · 0 评论 -
洛谷P1160
很明显是要用链表的,主要写写用指针的链表,然后要注意一个技巧就是如何快速地查找某个学生的位置。在这道题中,所有的数据均为整数,所以我们可以让同学们的号码和que一 一对应。也就是说,如果需要寻找i号同学,直接使用que[i]即可,这么做不仅使我们的代码更为简单易懂,更重要的是节约了大量的宝贵时间。然后,用指针写的链表也有两种选择,即你是用一个指向数据类型的指针数组还是直接一个保存数据类型的数组。感...原创 2018-03-26 17:44:16 · 442 阅读 · 0 评论 -
(模板)树状数组 (区间修改,单点查询)
引入一个叫做查分数组的东西,感觉思想有点像lazytab。区间[l,r]所有值+k改成”位置l加上k,位置r+1减去k” 查询的时候直接查询sum(x)就行;(参考题目:洛谷P3386) #include<cstdio> #include<iostream> using namespace std; typedef long long ll; const int max...原创 2018-03-13 18:07:00 · 205 阅读 · 0 评论 -
(模板)树状数组 (单点更新,区间求和)
小心爆int,注意位运算的方式即可; int bit[500005],n,m; typedef long long ll; ll sum(int i) { ll s=0; while(i){ s+=bit[i]; i-=i&-i; } return s; } void add(int i,int x) { whi...原创 2018-03-13 17:19:35 · 441 阅读 · 0 评论 -
POJ3368
变形的线段树; 这一类区间查询的问题很容易想到用线段树来做。显然我们首先要明确线段树的节点中维护各区间的最大次数。但这样是不够的,如果一个查询区间跨越了两个区间,那查询区间的最大次数怎么取呢?取较大值?加和?显然不是那么简单。(类似样例中,连续的4个1二分时会被分开左右两区间,那么如果查询区间1,10时就要考虑中间4个1这种情况了); 仔细观察题目条件,数组本身是升序的。这表示,两个区间连接之...原创 2018-03-13 16:50:02 · 403 阅读 · 0 评论 -
(模板)线段树(单点更新,单点求值)
最主要的区别就是不用lazytab了,所以不需要pushdown了,不过还是跟复杂版的有所区别的…小心对待 (原题是洛谷P1198,数据加强以后要记得特判数列为空的情形) #include<cstdio> #include<iostream> #include<algorithm> using namespace std; typedef long long...原创 2018-03-12 23:00:47 · 266 阅读 · 0 评论 -
(模板)线段树(区间双重更新,区间求和)
题目可参见洛谷P3373 已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和 首先先说明本题的思路。题目要求有三种操作,两种是不同的在线修改,还有一种是在查询取模后的结果。而这两种操作又是区间乘法和区间加法,我们可以惊喜的发现这两种操作对于取模运算来说都是自由的!但是面对非常大的数据,我们必须思考怎么样用线段树优雅的...原创 2018-03-12 20:25:19 · 626 阅读 · 0 评论 -
(模板)线段树 (区间更新,区间求和)
已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和(参见洛谷P3372) 后面query和update的部分一定要小心begin,end和left,right不要弄混了。 可以认为left和right在整个程序中都是在代表一个范围 #include<cstdio> #include<iostream> #include&...原创 2018-03-12 19:01:02 · 540 阅读 · 0 评论 -
(模板)Splay维护区间序列(洛谷P3391)
题目: 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 输入格式: 第一行为n,m n表示初始序列有n个数,这个序列依次是1,2,3,……,n, m表示翻转操作次数 接下来m行每行两个数 [l,r][l,r] 数据保证 1≤l≤r≤...原创 2018-07-11 17:18:48 · 617 阅读 · 0 评论
分享