数据结构
AndrewMe8211
no more threads
展开
-
普通平衡树的2种stl实现方法
以luogu上普通平衡树一题为例vector#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#define anti_loop(i,start,end) for(register int i=start;i&g...原创 2019-08-11 10:58:42 · 986 阅读 · 0 评论 -
luogu P3038 [USACO11DEC]牧草种植Grass Planting
analysis关键是对边权的处理在边上的值可以转化到某条边的底端(即深度大的那个)点,显而易见,这样做,一个点是必定对应一条边的。因此:对路径求和时就可以根据点的连续性,只需要query(seg[y]+1,seg[x],1,seg[0],1),就可以将LCA去掉了(LCA我们不需要)对子树求和时同理,只需要query(seg[x]+1,seg[x]+siz[x]-1,1,seg[0]...原创 2019-04-27 15:07:39 · 141 阅读 · 0 评论 -
luogu P2574 XOR的艺术 P3870 [TJOI2009]开关
analysis首先不难看出来这是一道线段树的题,然后由于这道题要维护的操作和一般的线段树不同,所以考虑修改pushdown函数和lazy标记考虑修改函数,若将区间中每个数取反,那么其中的1的个数=区间元素个数-原区间1的个数。此时容易想到让lazy标记代表此区间被XOR情况,1代表被XOR,0代表没有被XOR由于A^ 1 ^1=A,一段区间如果被XOR两次,就相当于没有被XOR,即la...原创 2019-05-03 10:20:04 · 225 阅读 · 0 评论 -
luogu P2184 贪婪大陆
anayisis线段树对于每一个询问,若我们查询到这个询问的右界的左边[0,R]有x个地雷区间的开头,左界的左边[0,L-1]有y个地雷区间的结束,由于一个区间的结尾必定对应一个在其前面的开头,故区间[L,R]中颜色的个数就等于x-y,类似于差分的思想code#include<bits/stdc++.h>using namespace std;#define loop(i...原创 2019-05-04 17:02:17 · 224 阅读 · 0 评论 -
luoguP3384 树链剖分模版
analysis既然是模版题,按照模版打就行,只是注意开long long树链剖分可以理解为降维,将二维的树压成一维的数组比如下面这个树和对应的数组如下:我们不难得到:重链上的点在数组中连续对于节点x,其子树中的节点所在区间为[seg[x],seg[x]+siz[x]-1]利用这些性质即可完成本题所需操作code#include<bits/stdc++.h>...原创 2019-04-20 12:08:14 · 164 阅读 · 0 评论 -
luogu P3387 【模板】缩点
analysis这题太毒瘤了留坑待补code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#define anti_loop(i,start,end) for(register int i=start;...原创 2019-05-18 10:39:48 · 241 阅读 · 0 评论 -
luogu P1486 [NOI2004]郁闷的出纳员
anayisisSplay,难点在于对删除操作的理解由于这里的S操作可能涉及到批量的删除点,我们可以仿造模板里的delete函数来写一个批量删点的操作:当要删除值小于W的点的时候,可以将W的后继或其本身旋转到根上去,然后将根的左子树设为空就可以做到删除了还有一点,就是对于员工工资变化量的维护,我们可以开一个detla变量,来保存当前每位员工的工资已经少了多少(为正即为减少,反之增加),对于...原创 2019-07-11 11:15:32 · 125 阅读 · 0 评论 -
luogu P2234 [HNOI2002]营业额统计
analysissplay裸题对吧只需要一直插入,然后不断的找前驱和后继,然后不断的累加就可以了对吧确实不难,但是就是调了蒟蒻一晚上code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#define...原创 2019-07-16 20:11:25 · 212 阅读 · 0 评论 -
luogu P2023 [AHOI2009]维护序列
analysis关键是优先级我是真的看不懂题解里面那个自定义优先级是个什么鬼按照我的理解,优先级只能先乘后加如:∑i=1n(a[i]+k)=∑i=1na[i]+k×n\sum_{i=1}^{n}(a[i]+k)=\sum_{i=1}^{n}a[i]+k\times n∑i=1n(a[i]+k)=∑i=1na[i]+k×n意思就是一个区间同时乘上一个数的时候,相当于把其原数列乘上一个...原创 2019-07-23 19:15:04 · 132 阅读 · 0 评论 -
luogu P2286 [HNOI2004]宠物收养场
analysis显然嘛,建两颗平衡树,一颗对人来操作,一颗对动物来操作其实建两颗平衡树真的不想我原来想象的那么麻烦(要复制粘贴一次??),其实只需要写一个类(class)封装一下就好了(结构体也可以,只是low了一点),只需要打一棵树的板子,然后命名两个类变量就好了,不然的话,建n颗树不是要复制粘贴n次??这次打Splay打的比较顺利,交上去一遍过,可能是因为在提交前对拍了一下吧不拍不知...原创 2019-07-17 11:14:55 · 126 阅读 · 0 评论 -
UVA10587 Mayor's posters【线段树】
translate按照顺序向一面墙上贴n张海报,海报会互相覆盖,求最后可以看得到的海报张数analysis别样的线段树要维护的是某个区间颜色的种类数但这个题是所有操作完后才进行询问,所有可以只维护区间左边的颜色种类和右边的颜色种类,在最后的时候对于每一个长度为1的区间进行一次询问,询问其颜色种类即可由于大区间的l,r和小区间的l,r有关系,所以可以维护(其实区间颜色个数好像也可以维...原创 2019-07-21 20:25:13 · 137 阅读 · 0 评论 -
「雅礼集训 2018 Day10」贪玩蓝月
大渣好,我四渣渣辉,点一下,玩一年,装备不花一分钱,说话战斗,罩杯回收,找一基友,极限到手。0 元 VIP,3 天满级,一秒一刀 999,装备全爆 666,广告做得再牛,不如进服遛一遛!古天乐绿了,古天乐绿了,惊喜不断,月入上万!不花钱还赚钱的绿色游戏,等级能提现,装备换点钱!《贪玩蓝月》是目前最火爆的网页游戏。在游戏中每个角色都有若干装备,每件装备有一个特征值w和一个战斗力v 。在每种...原创 2019-09-25 17:11:40 · 546 阅读 · 0 评论 -
acwing135. 最大子序和
analysis单调队列code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#define clean(arry,num) memset(arry,num,sizeof(arry))#define a...原创 2019-09-25 20:56:06 · 152 阅读 · 0 评论 -
luogu P1440 求m区间内的最小值
analysis单调队列code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#define clean(arry,num) memset(arry,num,sizeof(arry))#define a...原创 2019-09-25 21:33:42 · 157 阅读 · 0 评论 -
单调队列-从入门到入门到无边界递归入门
前置博客解决的问题静态区间最值模版class dandiaoqueue{ public: struct node{ int pos; int w; }; node que[maxn]; int l,r; void init(){clean(que,0);l=1;r=0;} void push_back(int pos,int w){ qu...原创 2019-09-25 21:44:45 · 156 阅读 · 0 评论 -
POJ 1821 Fence
analysis先把工匠按照s排序,然后DP方程:设f[i][j]为前i个工匠刷前j块木板的最大收益:f[i][j]=max{f[i−1][j]f[i][j−1]f[i−1][k]+p[i]×(j−k),k∈[s[i]−l[i],s[i]−1],j∈[s[i],n],j−k<=Lf[i][j]=max\begin{cases}f[i-1][j]\\f[i][j-1]\\f[i-...原创 2019-09-27 09:20:06 · 163 阅读 · 0 评论 -
luogu P2824 [HEOI2016/TJOI2016]排序
analysis这题思路很巧妙啊关键点是能够想到对一个01序列的排序可以用log级别的线段树来操作想到这点后,我们可以二分q位置上的数字,将原序列大于等于这个值的数字都写成1,其他的写成0,然后用线段树模拟排序就行能够这样做的原因:假设我们二分的值是mid,这里的数字本来是x,那么当x>mid时,最后排序后的q处的数就等于1,反之等于0实现的时候注意初始化和lazy函数的初值#...原创 2019-10-07 21:15:47 · 148 阅读 · 0 评论 -
luogu P2827 [NOIP 2016] 蚯蚓
analysis这题的关键妙处在单调性三个字上能够O1处理出单调性,我们就不需要用nlogn的优先队列等来维护这个单调性了能够处理出单调性,我们就能够O(1)的找出最长的那个蚯蚓从而快速的模拟了但为什么有单调性呢?(我太懒了,借用wqu大佬的ppt一用)code#include<bits/stdc++.h>using namespace std;#define l...原创 2019-10-07 21:43:48 · 203 阅读 · 0 评论 -
luogu P3950 部落冲突
analysis分析可知,用树剖关键在于将边权转化为点权我们可以将边权向下压,压到两边的点中深度较大的的那个点,然后通过求路径上的点权值和是否为0来判断是否可通过(注意要权值和要减去LCA的权值,因为路径并不会经过LCA和它上面那个点之间的连边)真的真的不要把线段树和树剖打爆了啊啊啊啊啊啊啊啊啊code#include<bits/stdc++.h>using names...原创 2019-04-26 16:08:17 · 124 阅读 · 0 评论 -
P3258 [JLOI2014]松鼠的新家
analysis问题其实就是,当维尼熊走过一段路径时,将这些点的权值加1,统计完所有路径后输出每个点的权值维护路径权值和,树剖code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#define ant...原创 2019-04-21 12:36:53 · 190 阅读 · 0 评论 -
luogu P3833 [SHOI2012]魔法树
analysis看到关键词:路径加,查询子树权值和,就知道这是道树剖了这题的读入很诡异,直接scanf("%c",&op)好像还不行,表示对字符串输入的花招无能为力code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i&l...原创 2019-04-21 11:05:12 · 169 阅读 · 2 评论 -
noip2017 Day2 T1——cheese
说一道题水,要么是它真的水,要么是你还没有用代码实现过它----Jerry题目:分析:把其抽象为一个图,则这个图起点应该是那个可能存在的与h=0平面有交点的点,终点应该就是那个可能存在的和奶酪上表面有相交的那个点。于是,方式一的思路就是,建图+染色爆搜但其实我们发现,如果我们知道所有与上表面相交的圆的标号和与下表面相交的圆的标号,那么我们只需要判断这两种圆是否存在相连关系即可。涉及...原创 2019-01-22 16:05:31 · 246 阅读 · 2 评论 -
单调队列(luogu P1886 滑动窗口)
有时间再来更,先来code#include&amp;amp;lt;bits/stdc++.h&amp;amp;gt;using namespace std;#define loop(i,start,end) for(int i=start;i&amp;amp;lt;=end;i++)#define anti_loop(i,start,end) for(int i=start;i&amp;amp;gt;=end;i--)#de原创 2019-01-26 20:33:57 · 248 阅读 · 0 评论 -
浅析树状数组+模版题 luogu P3374+模版题 luogu P3368
功能维护区间[1,r]的数字和实现lowbit(x):返回x在二进制下的最后一位一的十进制如:lowbit(01001100)=00000100#define lowbit(x) (x&amp;amp;amp;amp;(-x))我只能说,这种实现取最后一位的方式真的巧妙引入lowbit后,我们就可以引入树状数组的概念了树状数组的核心仅是一个数组,我们不妨叫其数组c,在阐明树状数组实现方式前,先看...原创 2019-01-27 20:12:50 · 145 阅读 · 0 评论 -
Luogu P1197 [JSOI2008]星球大战
题面分析并查集即可,注意由于并查集只能维护集合求并,不能维护集合“相减”,故需要按照摧毁顺序倒着运行,变减为加,这基本上算是并查集的一个较高级的用法了code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(int i=start;i<=end;i++)#define ...原创 2019-02-05 19:55:19 · 219 阅读 · 1 评论 -
浅谈 线段树 luoguP3372
概念和原理线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界其实就是可以在O(nlogn)的时间复杂度内实现区间修改和区间查询实现首先定义某节点rt的左儿子节点编号为rt&amp;amp;...原创 2019-01-29 17:30:52 · 234 阅读 · 0 评论 -
noip 2012 提高组 Day2 T2 LuoguP1083 借教室
题面分析由于本题涉及区间,我们可以将天数看做数组的下标,每一个请求都是在对一个区间的值进行修改,于是可以将本题看做一个区间修改的题目,而支持区间修改的数据结构无非就线段树和树状数组这里使用线段树的做法维护区间最小值,当最小值为负时返回false,输出申请人编号code#include<bits/stdc++.h>using namespace std;#define ...原创 2019-01-30 10:34:55 · 145 阅读 · 0 评论 -
luogu P5097 [USACO2004OPEN]Cave Cows 2 洞穴里的牛之二
题面分析很简单,求区间[l,r]的最小值线段树首选(只会线段树)code#include&lt;bits/stdc++.h&gt;using namespace std;#define loop(i,start,end) for(int i=start;i&lt;=end;i++)#define clean(arry,num); memset(arry,num,sizeof(ar...原创 2019-01-30 13:41:40 · 175 阅读 · 1 评论 -
luogu P1438 无聊的数列
题面分析等差数列!等差数列!等差数列!等差!等差!等差!差分!差分!差分!就这样喽假设有一数列a1,a2,a3,a4…a10,对其加上等差数列t,t+d,t+2d…t+6d,(L=2,R=8)将其构造成差分数组,如中间部分所示,很明显可以看到差分数组的绿色部分只需要全部加上d,第L项加上t,第R+1项加上(−t−(R−L)×d)(-t-(R-L)\times d)(−t−(R−...原创 2019-01-30 20:51:40 · 199 阅读 · 1 评论 -
史上第二详细的平衡树模板讲解
留坑待补#include&amp;amp;lt;bits/stdc++.h&amp;amp;gt;using namespace std;#define loop(i,start,end) for(register int i=start;i&amp;amp;lt;=end;++i)#define clean(arry,num); memset(arry,num,sizeof(arry));const int maxn=100000+...原创 2019-02-16 22:05:23 · 1087 阅读 · 0 评论 -
luogu P3834 【模板】可持久化线段树 1(主席树)
code#include&lt;bits/stdc++.h&gt;using namespace std;#define loop(i,start,end) for(int i=start;i&lt;=end;i++)#define clean(arry,num); memset(arry,num,sizeof(arry));const int maxn=2e5+10;int n,m,...原创 2019-02-12 11:42:30 · 156 阅读 · 0 评论 -
主席树模版--- Luogu P1533 可怜的狗狗
code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(int i=start;i<=end;i++)#define clean(arry,num); memset(arry,num,sizeof(arry));const int maxn=3e5+100;int n,m...原创 2019-02-12 11:46:30 · 97 阅读 · 1 评论 -
luogu P1198 [JSOI2008]最大数
分析其实不难想到这道题用线段树可以A掉首先,有多少次操作就最多有多少个数据,于是我们将线段树数组大小开到操作次数的4倍,然后就可以解决往数列后面插入数字的问题了然后每次查询,只需查询区间[len-L+1,len] (len是当前数组长度)的最大值即可尝试分析一下时间和空间复杂度,时间:一次查询和修改都是logn,然后有m次操作,即O(mlogn),此题m&lt;=200000,n&lt...原创 2019-02-20 17:05:08 · 189 阅读 · 1 评论 -
【hash表】MZOJ P1420 ABCDEF
analysis学到一个新东西:哈希表(用map实现)散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。其实就是一个映射那么本题,将式子变化一下就得到:a×b+c=d×(e+f)a\times b+c=d...原创 2019-03-16 15:42:34 · 180 阅读 · 1 评论 -
【单调栈】mzojP1419 浇水
analysis又学到一个新东西:单调栈话说今天的题怎么全都是新东西,说好的学过的算法呢单调递增或单调减的栈,跟单调队列差不多,但是只用到它的一端,利用它可以用来解决一些ACM/ICPC和OI的题目,如RQNOJ 的诺诺的队列等。这个栈本身其实很好说,就是栈里面的元素满足单调递增或单调递减利用单调栈,我们可以用O(N)的时间复杂度来求解类似下面的问题:在数组a中,求出所有的L[i...原创 2019-03-16 17:50:07 · 195 阅读 · 0 评论 -
luogu P1481 魔族密码
analysis表示不想再写DP了,用trie树干掉建好trie树,dfs求一下树中的每一条链上最多的标记数res便是结果了code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#define anri...原创 2019-03-23 16:32:36 · 228 阅读 · 0 评论 -
luogu P3178 [HAOI2015]树上操作
analysis一看题,修改点和链查询子树点集的权值和,就是树链剖分了!code#include<bits/stdc++.h>using namespace std;#define loop(i,start,end) for(register int i=start;i<=end;++i)#define anti_loop(i,start,end) for(regi...原创 2019-04-20 17:43:08 · 185 阅读 · 0 评论 -
后缀表达式和中缀表达式的转换
何为后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *很好理解,就是一个符号只对其前面两个数作用后缀表达式和中缀表达式的转换如A+B*(C−D)−E/F这是怎么搞出来的呢??选最靠中的那个优先级最低的符号开始(±),把算数式分为2个部分,若符号数大于二,...原创 2018-12-22 21:48:44 · 3181 阅读 · 0 评论