![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
Zolrk
这个作者很懒,什么都没留下…
展开
-
树状数组
不理解就背吧,反正树状数组的代码整洁又优美void update(int k,int num) { while(k<=n) { tree[k]+=num; k += k&(-k); } } int getsum(int k) { int sum=0; while(k) { sum+=原创 2017-08-02 20:45:19 · 226 阅读 · 0 评论 -
P2887 [USACO07NOV]防晒霜Sunscreen - 贪心
貌似这种区间贪心题多数是排序加堆来做。。。使尽量多的奶牛被抹,需要用最贴近他下限的防晒霜去抹,考虑完他的下限是否可行之后,还要考虑那些要使用相同防晒霜的奶牛,应该优先分配给上限最低的 奶牛按下限,防晒霜按低排序后,对于每一款防晒霜,把下限符合奶牛的都放到堆里,找出上限最低的,抹上就好了这道题我一开始没贪全,因为只考虑了左端点,连右端点是否可行都没考虑。。。而考虑到了右端点可行后又没考虑多...原创 2018-09-16 21:40:15 · 404 阅读 · 0 评论 -
P4879 ycz的妹子 - 线段树
对于D操作,我当时开了个sep数组,sep为0(初始值)表示没分,为1表示分了,但这样严重不对!!! 原因是这道题城市数不是n,而只有一开始的n个妹子都喜欢ycz,所以若未来有一个n+5城市的妹子喜欢ycz,如果用0(初始值)来判断的话,n+1~n+4都被算上了 所以要先读题,然后解释样例,然后想算法,然后写代码,不然容易误解题意,而若后来修正了题意之后,原先根据错误题意写的代码可能有许多错误...原创 2018-09-10 08:14:44 · 339 阅读 · 0 评论 -
分块 学习笔记
分块是一种通用的暴力算法,可以用暴力的思想维护一些值,但复杂度却不是很高 把区间每n−−√n\sqrt{n}个分成一个块,最后不足的也算一个块 分块的思想大体是“大段维护,局部朴素” 对于小区间朴素修改,对于大区间结合懒标记进行维护 因为可能询问和修改的区间十分大,l,r之间会有许多块,这个时候把l和r不足一整个块的部分直接暴力(朴素)遍历一遍,对于那些一整个块都被包含在l,r之间的可以进...原创 2018-09-13 16:59:50 · 227 阅读 · 0 评论 -
树链剖分模板
注意 求子树时,要用子树dfs序连续这个特性,但是不能用如下方法(sub表示x的子树中最大的dfs序):void dfs2(int x, int t) { top[x] = t; dfn[x] = ++cnt; subcnt = max(subcnt, cnt); rnk[cnt] = x; sub[x] = cnt; if(!son[x]) ...原创 2018-09-14 07:13:12 · 130 阅读 · 0 评论 -
P4427 [BJOI2018]求和 - 预处理 - 树上前缀和/树剖
因为k是动态的所以难以维护,但是发现每个点的权值是深度,但是发现了又如何。。。还是难以动态维护。 但是发现k太小了。。。时限又比较大,直接预处理出来1~50次方和,线段树搞一下就行了#include &amp;amp;amp;amp;lt;algorithm&amp;amp;amp;amp;gt;#include &amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp;gt;#include &a原创 2018-09-14 08:25:00 · 353 阅读 · 0 评论 -
P1169 [ZJOI2007]棋盘制作 - 单调栈
这题真是难想。。。按奇偶性分类其实是套路。。。 把坐标和为奇数的^=1一下,然后满足要求的棋盘要么全1要么全0,然后求解答案,把矩阵全^=1一遍再求一次答案就好了,两次求解总有一次棋盘是全0 对每个点预处理以下他往右最多有几个0,枚举一下矩形左边界所在的列,然后枚举矩形下边界的行,用预处理的东西往上跑一下取个可行的,但是这样有点慢,可以用单调栈维护一下每个点的预处理值。。。因为当栈里进了个小于...原创 2018-09-15 07:24:41 · 273 阅读 · 0 评论 -
P2596 [ZJOI2006]书架 - 无旋treap
fhq treap多么强劲。。。当用无旋treap解决区间/序列问题时,其实每个点所存的值不再对树的形态产生影响,复杂度由随机优先级和堆结构来保证。这棵树不是以点的值为关键字,而是以点的值在序列中的位置为关键字但是需要一个操作,给出点的值,我们找他在序列中第几个位置似乎用原来的那些treap操作都难以实现,这个点的位置就是第k大,但是现在没有根据来找第k大,因为不是按点值排序而仅仅是靠位置。...原创 2018-09-21 17:06:41 · 286 阅读 · 0 评论 -
P3368【模板】树状数组 2 - 差分
建立两个差分数组,套公式就好了c[i]表示i元素的“增量”,下面的式子左边是序列从1 ~ x的前缀和整体增加的值∑i=1x∑j=1ic[j]=(x+1)∑i=1xc[i]−∑i=1xi∗c[i]\sum_{i=1}^x\sum_{j=1}^ic[j] = (x+1)\sum_{i=1}^xc[i] - \sum_{i=1}^xi*c[i] i=1∑xj=1∑ic[j]=(x+1)i=1∑x...原创 2018-10-05 17:11:20 · 224 阅读 · 0 评论 -
P1484 种树 - 堆 - 贪心
这题想得脑阔疼。。。我只想到可以选一个点,或者不选这个点选其左右两个点的和先来特殊情况,k=1, 然后k=2可以发现由1到2的过程中,可以是一个本来被选的点,替换为他左右两边的点,收益增加了a[pos+1] + a[pos-1] - a[pos]这个题是一个个选,直到选了k个,有种递推的感觉,先确定种了前面几个,再确定这一个该怎么种然后我不会处理若有别的点也选上,并且影响到这个pos+1和...原创 2018-10-06 19:49:53 · 240 阅读 · 0 评论 -
P2023 [AHOI2009]维护序列 - 线段树区间乘法加法
记得及时更新sum(每次修改都更新),写成一个update函数比较好,因为很多时候会忘了%还有懒标记是标记在这个点本身上的然后就是左儿子和右儿子一定要看清楚。。。一个是n * 2 ,一个是 n * 2 + 1 ,涉及到这部分的代码一定要专注乘法标记优先级大于加法,并且对加法标记也有作用若要增加加法标记,先让乘法标记作用一下加法标记,再增加加法标记然后注意乘法标记要初始化为乘法单位元,就...原创 2018-10-07 10:08:59 · 306 阅读 · 0 评论 -
P3224 [HNOI2012]永无乡 - 平衡树 - 并查集
开n棵平衡树,慢慢合并成一个,用并查集处理连通关系,平衡树处理第k大就好了因为重要度是不会有重复的,而且是从1到n的,可以开一个数组,表示重要度为k所对应的编号要善于把一个新问题转化为一个已解决过的问题我甚至想自己搞出一个新算法处理连通关系,但是用并查集不就好了吗思维定势:一个题只用一个学过的算法实际上用平衡树处理了第k大之后,现在只需要思考如何处理一些点的连通关系,那么并查集就是最适合...原创 2018-10-07 20:04:21 · 247 阅读 · 0 评论 -
P2161 [SHOI2009]会场预约 - 线段树染色
是真的染色,把不同预约看做不同颜色,现在问题就是一个区间内不同颜色的数量,这个分块线段树都能做吧(不考虑复杂度用莫队也行)注意,线段树的最大边界必须是定值,不能随输入改变(一开始懒得离线动态更新右端点然后节点的编号就串了)注意数组大小,因为same和tag数组都是针对线段树节点设置的,所以其数组大小也要开4倍#include &amp;lt;algorithm&amp;gt;#include &amp;lt;io...原创 2018-10-08 11:29:01 · 247 阅读 · 0 评论 -
set和multiset 找前驱后继
multiset适用于元素可重,set中的元素不会重复。 找x的前驱后继的时候,建议用lower_bound和upper_bound来找,而不是用find,因为x可能不是multiset中的元素。 set :: iterator it 找前驱:lower_bound(val)之后 it-- 我不知道为什么it--找到了前驱而不是和一个值也为val的元素 找后继:upper_bound之...原创 2018-09-12 17:02:51 · 3204 阅读 · 0 评论 -
洛谷P3396 哈希冲突 - 根号复杂度算法
我一开始打了个暴力,直接n^2枚举。。。看哪个同余x,但是有个办法能更快一点,复杂度取决于模数p。可以发现其实不用一个个去检验哪个同余x,因为是从1开始到n找出所有同余x的正整数,由题意x一定小于等于p,所以所有和x模p同余的整数就是x+k*p 从另一个角度来说,做题的时候一定要从原本描述中抽象出核心含义,这道题问x池内的综合,就是问所有模p同余的下标对应的数之和(抽象出题意有助于帮助我们想起以...原创 2018-09-12 10:47:59 · 347 阅读 · 0 评论 -
Noip 2016 蚯蚓 - 队列
AC需要O(M)O(M)算法 我们先想一个O(MlogN)O(MlogN)的算法,然后想办法优化掉logN需要做的就是不断地找最长蚯蚓,然后切一切,再给这次没有被切的蚯蚓加上一个长度q自然可以想到堆来动态维护最大值,然后需要考虑每次切割后蚯蚓的增长该怎么操作。不能去每切一次就扫一边数组,需要找到一种差分的方法,把区间操作改为端点操作。重点是差分,我们发现,如果一个蚯蚓被切,其他蚯蚓增长p,可以用一原创 2017-10-10 21:21:05 · 483 阅读 · 0 评论 -
并查集的按秩合并
今天发现了一种按秩合并的简单(省事)写法:void merge(int a, int b) { int aa = find(a); int bb = find(b); if(rk[aa] > rk[bb]) swap(aa,bb); fa[aa] = bb; if(rk[aa] == rk[bb]) rk[bb]++;原创 2017-10-15 15:01:27 · 892 阅读 · 0 评论 -
洛谷P1168 中位数 - 堆
这题本来应该是主席树模板的。。。因为只需要求中位数,并且数据不是特别大,我们可以考虑维护一个大根堆,一个小根堆。这两个堆总大小为当前区间长度,我们维护两个性质: 1.小根堆总比大根堆多一个元素 2.小根堆所有元素都大于大根堆元素这样小根堆的堆顶就是区间中位数。当需要加入一个新元素时,如果这个元素比小根堆堆顶要大,就加入小根堆中,反之则加入大根堆,这样可以维护性质2...原创 2017-10-25 14:57:10 · 352 阅读 · 0 评论 -
st表模板
两个比较麻烦的地方: 1.st[i][j] = max(st[i][j-1], st[i+(1&lt;&lt;j-1)][j-1]); 2.ans = max(st[l][k],st[r-(1&lt;&lt;k)+1][k]); 对于1,st[i][j]表示[i,i+2j−1][i,i+2j−1][i, i+2^j-1]区间上的最值,也就是包含iii的2j2j2^j个数 对于2,这是可能重...原创 2017-10-16 21:37:01 · 281 阅读 · 0 评论 -
区间最大子段和 - 线段树
#include <iostream>#include <algorithm>#include <cstdio>using namespace std;#define debug(x) cerr << #x << "=" << x << endl;const int MAXN = 10原创 2018-04-21 10:53:16 · 425 阅读 · 0 评论 -
区间修改线段树模板
#include <iostream>#include <algorithm>#include <cstdio>using namespace std;#define debug(x) cerr << #x << "=" << x << endl;const int MAXN = 10原创 2018-04-21 11:47:20 · 290 阅读 · 0 评论 -
POJ3171 Cleaning shifts - DP - 数据结构优化
#include <algorithm>#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define debug(x) cerr << #x << "=" << x <&原创 2018-06-30 11:19:32 · 202 阅读 · 0 评论 -
Treap模板 - 平衡树
#include <algorithm>#include <iostream>#include <cstdio>#include <cstdlib>using namespace std;#define debug(x) cerr << #x << "=" << x <&原创 2018-07-10 21:32:33 · 95 阅读 · 0 评论 -
洛谷P1886 滑动窗口 - 单调队列模板
1.单调队列保存的是下标,方便判断时效性 2.三步骤 1 判断队首时效性 2 新元素单调性 3 输出队首 3.手打队列一定要写l&amp;lt;=r!!!并且用while别用if来移动队首#include &amp;lt;algorithm&amp;gt;#include &amp;lt;iostream&amp;gt;#include &amp;lt;cstring&amp;gt;原创 2018-08-11 11:39:06 · 255 阅读 · 0 评论 -
洛谷P2709 小B的询问 - 莫队
首先双关键字排序,然后扫一遍 考虑每次移动指针后答案的改变#include &amp;amp;lt;algorithm&amp;amp;gt;#include &amp;amp;lt;iostream&amp;amp;gt;#include &amp;amp;lt;cstring&amp;amp;gt;#include &amp;amp;lt;cstdio&原创 2018-08-13 16:28:40 · 199 阅读 · 0 评论 -
fhq treap(无旋treap) 学习笔记
首先最好要会写treap(也先了解一下笛卡尔树是什么。。。) fhq treap和treap同样有一个随机分配的rnd值,用于平衡,但fhq treap不需要旋转操作来维持平衡,因为有两个神奇的操作merge和split在两种操作之前,要明确的一点是fhq treap依靠rnd值来维护平衡,把每个点按照小根堆的方式放置,即根rnd小于子rnd,并且在任何时候都要保证有二叉搜索树的性质,即左子...原创 2018-09-11 19:32:59 · 1833 阅读 · 1 评论 -
BZOJ1878 [SDOI2009]HH的项链 - 莫队
交到洛谷上只有80分。。。注意初始值 l = 1, r = 0然后就是修改的部分(revise)我套用了之前的习惯,直接传值进去,直接+=k然后判断是否为1或者0,但是我没有想到1可以是0+1得来也可以是2-1得来所以想安全一点就写if和else吧。。。有时候真的难以想到这种可能指针移动的时候注意,每次移动前,l和r所在的点已经被算入答案,如果l现在的点不是所在区间里的,直接移动如果...原创 2018-09-30 17:46:16 · 186 阅读 · 0 评论