
分块
文章平均质量分 62
TA201314
这个作者很懒,什么都没留下…
展开
-
[bzoj4025]二分图 解题报告
最近在学lct,拿这道题学了动态图。 法一: 很神的分块(用vector常数太大t了。。) 按时间分块,先将覆盖整个块的边缩起来,然后枚举每一个时间对于块内的边暴力;缩点和暴力都是O(边数目)的。这样的话每个边都会被扫O(T−−√)O(\sqrt T)遍,时间复杂度O(mT−−√)≈6.5∗107O(m\sqrt T)≈6.5*10^7,然后加上我用了vector,常数巨大。。 法二: 很原创 2016-03-25 17:42:07 · 1127 阅读 · 0 评论 -
[JSOI2009]面试的考验 解题报告
考虑将询问区间按右端点排序。考虑x会与它前面产生贡献的点对,显然,如果i<j<x,ai>aj>axi<j<x,a_i>a_j>a_x,那么(i,x)就是无用的。也就是说我们要求位置 < x且权值大于axa_x的点和小于axa_x的点的两个类似笛卡尔树的序列的东西,而这个在随机数据中显然是O(logn)O(\log n)的。 但是问题是怎么求这个东西呢?一个比较脑残的想法是线段树!就是我们存一棵权值原创 2016-04-05 14:41:55 · 1187 阅读 · 0 评论 -
[Ahoi2013]作业 解题报告
很久以前用奇葩做法搞的题。。现在补个解题报告。传统做法: 考虑莫队,就需要我们设计一个O(1)O(1)插入,O(n√)O(\sqrt n)查询的数据结构,显然就需要对权值分块,记每个数出现次数和每个块两问的答案(或者第一问另写个主席树也可以,我比较懒)。莫队的块就分成nm√n\over \sqrt m块。时间复杂度O(mn√+nm−−√)O(m\sqrt n+n\sqrt m)。非常好写,跑的飞快原创 2016-04-22 17:00:09 · 1188 阅读 · 0 评论 -
[spoj10707]Count on a tree II 解题报告
一开始不知道这是主席出的神题,不小心点开了。。结果做了1天(想了半天+写了半天)。 我是学莫队的时候在某大神的莫队课件里看到这道题的,他说可以用莫队做。(但这真的算莫队么?) 这道题非常奇怪,就是把 HH的项链 搬到了树上,但是这样就变得好难。。我一开始的想法跟po姐姐的做法差不多,就是把dfs序分成大小为S的块,然后就是O(N3S2+MS)O({N^3\over S^2}+MS),这样显然块越原创 2016-04-06 16:13:16 · 2556 阅读 · 0 评论 -
[scoi2005]王室联邦 解题报告
拿来学了一下树分块。 树分块的要求是把树分成⌈NB⌉\lceil {N\over B} \rceil 块,每一块的每个节点到这个块的lca的之间的节点数不超过3B3B. (好像在很久以前听谁讲过。。)做法是按dfs序出栈或bfs倒序考虑,把当前这个子树的剩余块加到它的父亲上,如果它的父亲上的块已经≥b\ge b就把这个块取出来。这样的话出来的就是若干大小在[b,2b)的块加上一个在[0,b)的块原创 2016-04-15 10:21:14 · 728 阅读 · 0 评论 -
[ONTAK2010]Highways
想学线段树合并找的一个题。。没想到是个傻逼题。这题题意好像有问题:额外的点对和查询的点对都不会是同一个点。设x的dfs序为dfn(x),x的子树中dfs序最大的节点的dfs序为dr(x)。将额外的边(u,v)看作点(dfn(u),dfn(v))(dfn(u)≤dfn(v))(dfn(u),dfn(v))(dfn(u)\le dfn(v))。对于一次查询(u,v)(dfn(u)≤dfn(v))(u,v原创 2016-04-27 14:52:16 · 691 阅读 · 0 评论 -
[bzoj4066]简单题 解题报告
也是很久以前奇葩做法搞的题,补个解题报告。大爷的做法:听说是把k-d树写成替罪的或是每n√\sqrt n重建。 傻逼的做法: 我们是理论计算机科学家(当时我弱不会k-d树。。),所以我们需要思考科学的做法。 分块! 考虑将横坐标分成n√\sqrt n份,纵坐标分成n√\sqrt n份,这样会有n个块。内存首先比较科学了。我们显然需要每插入n√\sqrt n个元素重建。我们对每一行维护前缀和,原创 2016-04-22 17:45:36 · 1653 阅读 · 0 评论 -
[bzoj3720]Gty的妹子树 解题报告
大概看了一眼网上的题解,跟块爷一样都写的会被卡的分块。(反正块爷出的题也不会卡自己。。) 这里说一种比较科学的做法。就是用块链维护dfs序。 维护每个节点按dfs序是在哪个块的哪个位置,对每个块维护块中节点的最浅深度、它的下一个块是哪个块,块中节点按dfs序排序的序列,按权值排序的序列。 一开始的时候每B个分一块,最后一块节点数≤B\le B。查询的时候在两边的块暴力,在中间的块里二分,时间复原创 2016-04-22 21:55:14 · 1513 阅读 · 0 评论 -
[bzoj3065]带插入区间K小值 解题报告
喜闻乐见的用的很麻烦很傻逼得搞法。。 先用一个块链维护序列,做到O(n√)O(\sqrt n)插入,O(1)O(1)比较两个点在序列中位置的大小。时间复杂度是O(nn√)O(n\sqrt n)。 再用一个块链维护权值,每个块维护按位置排序的序列。查询的时候从小到大枚举每个块,先在块里二分统计块内在查询区间中的个数,然后如果发现答案在这个块里,就直接暴力找到第k小的是哪个。取块大小等于O(nlog原创 2016-04-23 14:20:51 · 1584 阅读 · 0 评论 -
[bzoj3744]Gty的妹子序列 解题报告
比较显然的做法是用bit维护做到O(nlog−−−√n)O(n\sqrt \log n)。 但是。。作为一名理论计算机科学家傻逼,我们需要O(nn√)O(n\sqrt n)的做法,注意到如果我们把(i,ai)(i,a_i)看成点,实际上要求O(1)O(1)询问一个矩形内点的个数,这个显然可以用可持久化分块来搞,维护每个块内的前缀和和所有块的前缀和——但是空间复杂度是3nn√3n\sqrt n,ML原创 2016-04-26 07:22:08 · 902 阅读 · 0 评论 -
[hackerrank w25]DAG Queries 解题报告
又用bitset强上了一道题好开心啊~(然而这题标算似乎就是bitset?)如果暴力的话,可以用bitset,但是空间爆炸;所以我们先解决一下空间问题。 如果考虑对操作分块的话,我们可以只用处理所有节点能否由块内的操作节点抵达,这样首先就可以解决bitset的空间问题!然后一开始我是这样想的: 如果我们可以O(n)O(n)处理出每一个块的操作结束后的aia_i的话,那么就好办了!而这个似乎很容易原创 2016-11-08 21:32:44 · 1330 阅读 · 0 评论