分块
文章平均质量分 54
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
bzoj4542 [HNOI2016]大数(莫队+离散化+数学)
首先有一个性质:如果A*10^k+B=B(mod p),且p和10^k互质,则A%p=0。那么,要判断一个s[l...r]是否是p的倍数,只要判断s[l...n]和s[r+1...n]在模n的意义下是否相等。于是,我们可以预处理出每一个后缀s[i...n]对p取模的结果a[i]。然后对于一个询问[l,r],就转化成了询问[l,r+1]中有多少对相同的a[i]。用莫队算法就可以解决了。当原创 2017-07-19 15:38:29 · 390 阅读 · 0 评论 -
bzoj2002 [Hnoi2010]Bounce 弹飞绵羊(lct/分块)
我们把x向跳到的位置建边(跳出去了就是n+1),可以发现一定是一棵树。那么x跳的次数就是x到n+1之间的边数。每次修改就先把原来的断开,连上新的,用lct维护即可。哈哈哈改对了开心~ update:也可以暴力分块搞。lct#include #include #include #include using namespace std;#define ll long long#d原创 2018-02-07 17:02:29 · 332 阅读 · 0 评论 -
CF13E Holes(分块)
和这题 弹飞绵羊 一模一样。 wa了半天,再见qaq 因为询问了跳出去之前最后在哪里,所以处理的时候最后一块注意不要跳出去,而是跳到即将跳出去的位置。cnt[i]表示的应该是从i跳到to[i]需要的步数。原创 2018-03-01 16:43:56 · 405 阅读 · 0 评论 -
CF785E Anton and Permutation(分块)
交换x,y位置的数以后,逆序对数改变的数量只由x与y之间有几个在v[x]和v[y]之间的数决定。 所以我们就是要求区间内权值在l,r的数的个数,可以分块排序+二分搞。每次交换后重构所在块。 复杂度O(nn√logn)O(n\sqrt n logn)。原创 2018-03-01 17:29:47 · 490 阅读 · 1 评论 -
CF455D Serega and Fun(分块+STL)
给定一个序列,两种操作 1.对l,r区间内的数循环移位 2.求l,r区间内有多少个k。 如qyjs巨佬所言,你分块+vector暴力不就好了!vector大法好呀!orz然后就过了orz 不过你可能需要优越的分块大小,比如sqrt(n)*log(n) 应该手写一个循环双端队列会更比较资瓷吧?原创 2018-03-01 23:02:00 · 1592 阅读 · 1 评论 -
CF348C Subset Sums(分块)
给定一个n个数的序列a,m个下标集合,记Sk={Sk,i}S_k=\{S_{k,i}\}。两种操作: 1. ? k 求集合k的和,即∑i=1|Sk|aSk,i\sum\limits_{i=1}^{|S_k|}a_{S_{k,i}} 2. + k w 给集合k的所有下标代表的数加w。 3. 记n=∑i=1m|Si|n=\sum\limits_{i=1}^{m}|S_i| 我们把集合大小大于n√原创 2018-03-02 09:41:35 · 388 阅读 · 0 评论 -
CF103D Time to Raid Cowavans(分块)
对于b>n√\sqrt n的,暴力跳即可。其他的可以O(n)先类似dp的求出sum[i],表示以i为a的答案,然后O(1)回答询问。于是我们先把所有询问按b排序即可。复杂度O(nn√)O(n\sqrt n)原创 2018-03-02 10:32:32 · 424 阅读 · 0 评论 -
CF342E Xenia and Tree(分块暴力)
每个点记一个dis[x],表示离他最近的红点的距离。每次把一个点染红就记下来这个点,当超过n−√\sqrt n个时就暴力bfs重新搜一遍,并清空数组。每次询问x,就是若干还没更新的红点与x的距离和dis[x]取min。复杂度O(nn−√)O(n\sqrt n)原创 2018-03-03 14:53:00 · 414 阅读 · 0 评论 -
CF436F Banners(分块+单调队列维护下凸壳)
首先把所有的用户按b升序排序,从小到大枚举c,每次广告的收入是可以直接计算出来的,我们只需要确定一个p,使得p∗(ai>=p的个数)p*(a_i>=p的个数)最大。不难发现,p一定可以等于某个aia_i时取得最优。因此我们按aia_i分块,每一块维护一个下凸壳,记块内的最优位置。每次求最优时就对所有块的最优位置算一个答案然后取max。记d[i]表示p=i时的答案,每次往里加一个点x时,对d的影响是:原创 2018-03-06 07:45:23 · 750 阅读 · 0 评论 -
CF616E Sum of Remainders(分块计算)
ANS=∑i=1mn%iANS=\sum\limits_{i=1}^mn\%i ANS=∑i=1mn−⌊n/i⌋∗iANS=\sum\limits_{i=1}^mn-\lfloor n/i\rfloor*i ANS=nm−∑i=1m⌊n/i⌋∗iANS=nm-\sum\limits_{i=1}^m\lfloor n/i\rfloor*i 后面这个东西我们像计算mobius时常用的分块技巧那样来原创 2018-03-06 10:51:19 · 285 阅读 · 0 评论 -
bzoj5186 [Usaco2018 Jan]Cow at Large(树+dfs序+分块+BIT/点分治)
首先处理出数组mn[x],表示x到离他最近的叶子的距离。如果给定起始位置u,我们以u为根,处理出dis[x]表示x到u的距离,则节点x对答案有贡献当且仅当mn[x]<=dis[x]&&mn[fa[x]]> dis[fa[x]]。我们发现所有满足mn[x]<=dis[x]的点x构成的集合S就是由若干颗子树构成的。(除非起点u为叶子,则集合S就是这棵树本身,只含有一棵...原创 2018-03-14 14:06:37 · 778 阅读 · 0 评论 -
bzoj3834 [Poi2014]Solar Panels(数论+分块)
求a<=x<=b,c<=y<=d,gcd(x,y)a<=x<=b,c<=y<=d,gcd(x,y)的最大值。 我们考虑枚举g=1~min(b,d),检验是否合法即是否满足 ⌊a−1g⌋<⌊bg⌋\lfloor\frac{a-1}{g}\rfloor<\lfloor\frac{b}{g}\rfloor&&⌊c−1g⌋<⌊dg⌋\lfloor\frac{c-1}{g}\rfloor<\lfloor\原创 2018-04-07 16:10:40 · 289 阅读 · 0 评论 -
bzoj3236 [Ahoi2013]作业(莫队+分块)
对查询莫队处理,查询区间和分块处理。 复杂度O((n+m)n−√)O((n+m)\sqrt n) 如果用莫队+BIT的话,复杂度是O(nn−√logn)O(n\sqrt nlogn) 其实也是树套树裸题?O(nlog2n)O(nlog^2n)原创 2018-04-22 19:34:20 · 221 阅读 · 0 评论 -
bzoj1086 [SCOI2005]王室联邦(树分块,dfs)
嗯,很好的向你证明了树上分块,每一块大小都可以控制在B~3B之间。原创 2018-04-06 21:38:47 · 153 阅读 · 0 评论 -
bzoj4035 [HAOI2015]数组游戏(博弈论sg函数+分块)
出题人kzf告诉我们,可以修改一下游戏的定义:每一步可以选择黑格子或白格子,最终能将所有格子都翻成黑色的人赢。由于每次翻转黑格子的操作都不可能直接带来胜利,而任何一步选取黑格子进行的有利操作都能由对方通过再翻一次这个格子抵消掉,根据假设“两个人都是足够聪明的”,我们知道游戏中一定不会有人选择黑格子。这就保证了这种转换的正确性。 因此我们可以把每个黑色的位置都看成偶数个白格子叠加起来得到...原创 2018-06-12 17:26:28 · 448 阅读 · 0 评论 -
CIA11 毒瘤题(七维偏序,分块+bitset)
首先bitset很强呀x,我们针对每一维,对于每一个点预处理出比他小的集合。然后他的答案就是这k个集合的交。但是O(n^2k)的空间很gg。我们可以分块,对于每一维,只预处理出若干块集合,然后查询的时候找到离他最近的块,用这个块的答案暴力得出正确的集合。应该是O(nn−√+n2∗7/32)O(n\sqrt n+n^2*7/32)原创 2018-01-16 23:21:51 · 1167 阅读 · 0 评论 -
bzoj4358 permu(莫队+线段树||莫队+并查集+分块||K-D tree)
很久以前的坑=,= 题意:给你一个排列序列,每次询问问l,r区间内最长的值域连续段长度。范围50000,长得就像莫队-,-。怎么转移呢,首先有一个比较明显的做法,用数值建一棵线段树,维护最大子段和。这样的复杂度是(nn−√logn)(n\sqrt nlogn)的,但是常数巨大,不太好卡过去。。。按堆建树,从下往上推,蜜汁分块大小,居然卡过去了。欣慰,附上代码。然而正解是这样的:我们对每一个数都记一原创 2017-08-03 11:55:50 · 1055 阅读 · 0 评论 -
bzoj2301 [HAOI2011]Problem b(求gcd==k的个数)(莫比乌斯反演+容斥原理)
首先我们搞掉下界,怎么搞呢,用容斥原理即可。(看做矩形区间),然后我们需要求∑x=1n∑y=1ngcd(x,y)==k\sum\limits_{x=1}^n\sum\limits_{y=1}^ngcd(x,y)==k。 ∑x=1⌊n/k⌋∑y=1⌊m/k⌋gcd(x,y)==1\sum\limits_{x=1}^{\lfloor{n/k}\rfloor}\sum\limits_{y=1}^{\lf原创 2017-10-10 14:39:41 · 1371 阅读 · 1 评论 -
spoj D-query (莫队)
查一段区间出现的不同数字个数,赤裸裸的莫队。网上那些spoj的题号都是哪来的。。我怎么找不到题号呢。。#include #include #include #include #define ll long long#define M 200005using namespace std;int n,m,f[1000005],a[30005],ANS[M],block,ans;原创 2017-07-19 16:07:32 · 306 阅读 · 0 评论 -
bzoj2120 数颜色(莫队)
带修改的莫队板子。听说按n^ 2/3分块更快??其实无非就是多了个修改,我们为每一个询问打上一个时间戳。然后照做无误就好了。只是在每一次做之前,先看看时间戳对不对。。不对的就给他暴力改对。所以对每一个修改我们要记该位置改之前和改之后是什么样子的。。#include #include #include #include #define ll long long#define N 200原创 2017-07-19 16:34:47 · 326 阅读 · 0 评论 -
bzoj3289 Mato的文件管理(树状数组求逆序对+莫队+离散化)
首先明确,求交换次数最小其实就是求逆序对的个数。可以用树状数组方便地进行求解。然后题目没说文件大小的范围,我们就赶紧怕怕的采取了离散化。我们还发现这题可以O(logn)的由[l,r]=>[l-1,r]等等。。所以,莫队,就是你啦!具体细节见代码。#include #include #include #include #include using namespace std;#def原创 2017-07-19 16:41:11 · 404 阅读 · 0 评论 -
spoj_cot2 Count on a tree II(树上莫队+离散化)
题意:给两个点u,v,询问两点路径上有多少种不同的权值。树上莫队。然后权值要离散化。树上区间转移呢,基本就是这样的:记上次询问的两点为lastu,lastv,现在询问的两点为u,v,那么对于路径(lastu,u)上的所有点的存在性取反(就是原来答案里有就删掉,没有就加上),对于(lastv,v)同理。但是因为还有讨厌的lca的存在,所以我们一直都没把lca放在答案里。最后记答案时单独处理lca。具原创 2017-07-20 15:30:12 · 490 阅读 · 0 评论 -
bzoj3781 小B的询问(莫队)
赤裸裸的莫队。#include #include #include #include #define N 50005using namespace std;int n,m,k,a[N],f[N],ans=0,block=0,ANS[N];inline int read(){ int x=0,f=1;char ch=getchar(); while(ch'9'){if(ch==原创 2017-07-20 16:53:39 · 281 阅读 · 0 评论 -
CF 700D Huffman Coding on Segment(huffman编码分块+莫队)
题意:给定一段序列a,q个询问l,r, 求a[l]..a[r]的huffman编码长度。首先huffman编码长度怎么算呢。。其实就是以每种字符出现的次数为点权,建一棵huffman树,边权为1,它的WPL其实就是这段字符huffman编码的长度。所以我们就用莫队维护一下每个字符出现的次数啦,然后模拟建huffman树求WPL啦(可以用优先队列)。结果就TLE了。想想怎么可能这么简单吗!!我们对于原创 2017-07-20 16:12:47 · 569 阅读 · 0 评论 -
CF 375D Tree and Queries(子树询问,转化为序列莫队)
题意:给定一棵树,每个点有颜色,m个询问vi,ki,问以vi为根的子树中有多少种颜色出现的次数>=ki。首先我们可以通过dfn把子树询问变成序列询问。(不会看代码,一颗子树中的顶点的dfn一定是连续的,画画就知道了)然后就是经典的莫队了,至于ans怎么更新,见代码啦~原创 2017-07-20 16:02:15 · 386 阅读 · 0 评论 -
bzoj3052 [wc2013]糖果公园(树上莫队,带修改)
树上莫队参见spoj_cot2,带修改莫队参见bzoj2120.这道题就是把这俩和在一起了╭(╯^╰)╮。bzoj上时间很宽松。。大家如果没把握还是不要去爆oj了的好。给大家推荐个好地方UOJ,这题的题号是58。可以先在那过了再说。。uoj的评测机好好的说。。顺便我树上莫队也是从建了uoj的vfk那里学来的。。大家可以去搜一下他的博客。我在这里放链接是不是算侵权??不懂。。只能orz神犇。(因为打原创 2017-07-21 21:19:46 · 614 阅读 · 0 评论 -
bzoj3809 Gty的二逼妹子序列(莫队+分块)
很显然的做法是莫队+树状数组,但是我T了。。是我姿势不对么。。。可能常数起飞了吧。。比较好的方法是莫队+分块。对权值分块。那么每个询问就变成了求区间和,可以在O(sqrt(N))解决,而每次莫队的转移则变成了O(1),那么总的复杂度就是O((N+M)*sqrt(N))了,可以过。至于分块大小,我试了试sqrt(n),sqrt(n/2),sqrt(n*2/3),运行时间都差不多。。。#inclu原创 2017-07-23 13:10:44 · 318 阅读 · 0 评论 -
bzoj3342 教主的魔法(分块+二分查找)
题意:维护一段序列,两种操作:A.询问[l,r]大于等于v的有多少个。M.[l,r]都加上v分块练习。。对于区间加法,区间内的整块直接O(1)标记,对于剩下的两头的部分暴力更新。对于查询:每一块我们都保证是有序的(暴力更新后的块要重构),那么对于区间内的整块,我们直接二分查找,剩下的两头的部分我们暴力统计即可。#include #include #include #include原创 2017-07-20 18:02:58 · 357 阅读 · 0 评论 -
bzoj2038[2009国家集训队]小Z的袜子(hose)(莫队板子)
给定序列a[1]~a[n],a[i]表示i的颜色,多次询问区间L~R中选出两个位置颜色相同的概率N,Q若我们已知L~R区间出现的颜色为c1~ck,次数cnt1~cntk概率表达式?若我们已知[L,R]的信息(cnt,P),我们可以O(1)将它更新为[L+1,R]/[L-1,R]/[L,R-1]/[L,R+1].此即为莫队算法。我们将询问以[(l-1)/sqr原创 2017-07-11 14:47:23 · 423 阅读 · 0 评论 -
CF 86D Powerful array(莫队)
挺裸的莫队,然而我用lld输出T掉了???改成I64d输出就过了???有毒。#include #include #include #include #define ll long long#define N 200010int n,m,a[N],f[1000005],block;bool vis[N];ll ans=0,ANS[N];inline int read(){ i原创 2017-07-26 12:37:03 · 362 阅读 · 0 评论 -
CIA3 Sometimes Naive(莫比乌斯反演+积性函数前缀和)
题意:求∑x=1n∑y=1mφ(gcd(x,y))\sum\limits_{x=1}^n\sum\limits_{y=1}^m\varphi(gcd(x,y)) 根据各种老套路化简得 ∑i=1n⌊n/i⌋⌊m/i⌋∑d|iφ(i/d)∗μ(d)\sum\limits_{i=1}^n\lfloor n/i\rfloor \lfloor m/i\rfloor\sum\limits_{d|i}\varp原创 2017-10-18 21:23:54 · 870 阅读 · 0 评论 -
bzoj2154 Crash的数字表格(莫比乌斯反演)
求lcm(i,j)的和. 这个题解写的挺详细的呢:传送门。 算答案时分块套路复杂度O(sqrt(n)),算f[x][y]时利用了莫比乌斯反演,分块计算,复杂度也是O(sqrt(n)),所以总的复杂度是O(n) tips:注意因为取模带来的负数问题。。。原创 2017-10-10 22:49:52 · 326 阅读 · 0 评论 -
bzoj4765 普通计算姬(分块+树状数组)
分块大法好啊qaq 我们按编号分块,预处理出f[x][i]表示改动x节点对第i块的影响有几个点 然后dfs序+BIT维护一下子树和。 复杂度O(m(n−−√+logn+n−−√logn))O(m(n+logn+nlogn))O(m(\sqrt n+log n+\sqrt n logn))#include <bits/stdc++.h>using namespace std;...原创 2018-06-16 21:52:55 · 311 阅读 · 0 评论