随笔分类 -  数据结构 - 分块

摘要:看到这道题时没有什么思路,只会打暴力,而且数据范围比较有迷惑性,那基本就是分块了. 现在有两个暴力: 1.每次 $O(1)$ 更新边权,然后 $O(m)$ 暴力查询一个点的答案.2.每次将所有边排序,然后 $O(1)/O(\log n)$ 查询点权 上述两种做法中查询与更新的时间复杂度很不平衡,所以 阅读全文
posted @ 2020-08-12 20:30 EM-LGH 阅读(153) 评论(0) 推荐(0)
摘要:只会 80pts. 最裸的暴力(40pts) 令 $f[i][j]$ 表示当前 DP 到 $i$,划分成了 $j$ 段的最小值. 时间复杂度 $O(n^2)$ 一点优化(60 ~ 80pts) 有几个测点 $a[i]$ 很小,那么可以直接开一个桶 $s[i][j]$ 表示前缀异或和为 $i$,且划分 阅读全文
posted @ 2020-08-12 15:21 EM-LGH 阅读(268) 评论(0) 推荐(0)
摘要:比较有趣的交互题. subtask1: 由于每次调用这个函数可以返回值域中的最大值和最小值,所以可以每次查询出两个元素. 那么每次查到 $x,y$ 后就将查询区间缩小为 $[x+1,y-1]$,这样可以在规定操作次数内解决问题. subtask2: 这个 subtask 比较困难. 首先,我们发现答 阅读全文
posted @ 2020-08-04 09:38 EM-LGH 阅读(151) 评论(0) 推荐(0)
摘要:怎么想都没想出来 $\log n$ 做法,那么这道题基本就是根号分治了. 题目描述中保证 $\sum k \leqslant 10^5$,然后 $k$ 在每次询问中又是相同的,那么就考虑对 $k$ 根号分治. 先对 $s$ 建立后缀自动机,然后把倍增数组求出来. 我们设块的大小为 $B$,那么当 $ 阅读全文
posted @ 2020-07-20 18:41 EM-LGH 阅读(184) 评论(0) 推荐(0)
摘要:对于一类带修改问题可以采用对时间(操作)分块,然后定期重构的方式来维护. 设块的大小为 $B$,则重构 $\frac{Q}{B}$ 次,每次查询的复杂度为 $O(B \log n)$. 计算一下 $B$ 的大小来平衡重构和查询的复杂度即可. 这种纯数据结构题都挺好写的. 时间复杂度要计算好,块的大小 阅读全文
posted @ 2020-06-29 10:07 EM-LGH 阅读(141) 评论(0) 推荐(0)
摘要:往届学长的一场比赛. 总结:三道水题 haha! Task 1 省选 jloi.cpp/in/out 给你一个字符串,你每次只能删除一个回文串,问你最少需要几步将字符串删完,或输出无解. 题解:显然,答案最多为 2,而如果这个串本身就不是回文串答案就是 1,所以难点就是判断无解的情况. 手画几组发现 阅读全文
posted @ 2020-06-16 14:20 EM-LGH 阅读(154) 评论(0) 推荐(0)
摘要:求 $,\sum_{x=0}^{\infty} get(l,r,x)get(l_{2},r_{2},x),q$ 组询问. 由于这里的 $get$ 会涉及到两个区间,所以十分不好处理. 那么我们就要想办法把这个式子转化成只和一个区间有关的东西. 考虑拆成前缀和,即 $(s[r]-s[l-1])\tim 阅读全文
posted @ 2020-06-09 16:54 EM-LGH 阅读(164) 评论(0) 推荐(0)
摘要:好神仙的数据结构题呀! code: #include <cstdio> #include <cstring> #include <vector> #include <cmath> #include <algorithm> #define BL 250 #define N 100006 #define 阅读全文
posted @ 2020-03-06 15:47 EM-LGH 阅读(144) 评论(0) 推荐(0)
摘要:开一个桶记录一下前缀异或值的个数即可. 注意要把询问从 $(l,r)$ 变成 $(l-1,r)$,这样做的话会方便很多. code: #include <cstdio> #include <cmath> #include <algorithm> #define N 1000005 #define l 阅读全文
posted @ 2020-02-01 16:09 EM-LGH 阅读(112) 评论(0) 推荐(0)
摘要:题意:支持两种操作:$1.$ 查询 $[l,r]$ 每个数字出现次数的 $mex$,$2.$ 单点修改某一位置的值. 这里复习一下带修改莫队. 普通的莫队中,以左端点所在块编号为第一关键字,右端点大小为第二关键字,在带修改莫队中每一个操作都有一个时间戳,那时间戳就是第三关键字. 可以将数字先离散化, 阅读全文
posted @ 2019-10-09 19:04 EM-LGH 阅读(154) 评论(0) 推荐(0)
摘要:十分玄学的数据结构~ code: #include <bits/stdc++.h> #define N 1000006 #define setIO(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std 阅读全文
posted @ 2019-10-08 20:25 EM-LGH 阅读(147) 评论(0) 推荐(0)
摘要:题目描述:求区间众数最小编号,要求强制在线 题解: 讲道理,关于区间众数问题应该第一个就想到分块,可毒瘤出题人说是线段树......qaq考虑查询的区间 $[l,r]$ 答案的来源只有 2 中情况:1.中间整块区间的 max 2.不完整块加中间完整区间的贡献 第一种情况,我们可以考前缀和以及递推来进 阅读全文
posted @ 2018-11-01 00:58 EM-LGH 阅读(292) 评论(0) 推荐(0)
摘要:Code: 阅读全文
posted @ 2018-10-21 22:37 EM-LGH 阅读(181) 评论(0) 推荐(1)
摘要:Code: 阅读全文
posted @ 2018-10-16 23:37 EM-LGH 阅读(140) 评论(0) 推荐(0)
摘要:我们只需将序列分成 n\sqrt{n}n​ 块,对于每一个点维护一个 val[i]val[i]val[i],to[i]to[i]to[i],分别代表该点跳到下一个块所需要的代价以及会跳到的节点编号。在查询时,我们最多会跳 n\sqrt{n}n​ 块,修改的时候将节点所在区间暴力修改即可。 Code: 阅读全文
posted @ 2018-10-16 20:08 EM-LGH 阅读(169) 评论(0) 推荐(0)
摘要:分块真的是很暴力呀… 暴力查询左端,暴力查询又端点,中间整体部分直接 $O(1)$ 求出。 注意编程细节:belong[i]=(i−1)/block+1,这样可以保证序列被分成这样的: Code: 阅读全文
posted @ 2018-10-16 19:10 EM-LGH 阅读(587) 评论(2) 推荐(1)