-------数据结构-------
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 · 377 阅读 · 0 评论 -
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 · 301 阅读 · 0 评论 -
bzoj2120 数颜色(莫队)
带修改的莫队板子。听说按n^ 2/3分块更快??其实无非就是多了个修改,我们为每一个询问打上一个时间戳。然后照做无误就好了。只是在每一次做之前,先看看时间戳对不对。。不对的就给他暴力改对。所以对每一个修改我们要记该位置改之前和改之后是什么样子的。。#include #include #include #include #define ll long long#define N 200原创 2017-07-19 16:34:47 · 309 阅读 · 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 · 389 阅读 · 0 评论 -
tyvj1463 智商问题
本来想找到分块写的,看到了这道题,然而正解应该是二分,结果我写了stl???看到一些oier的回忆录,有些感伤。对自己的前途感到一丝彷徨,就随便水了一道题。#include #include #include #define inf 0x7fffffffusing namespace std;int const N=1000005;int n,a[N];inline int re原创 2017-07-19 22:14:54 · 339 阅读 · 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 · 477 阅读 · 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 · 279 阅读 · 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 · 567 阅读 · 0 评论 -
CF 375D Tree and Queries(子树询问,转化为序列莫队)
题意:给定一棵树,每个点有颜色,m个询问vi,ki,问以vi为根的子树中有多少种颜色出现的次数>=ki。首先我们可以通过dfn把子树询问变成序列询问。(不会看代码,一颗子树中的顶点的dfn一定是连续的,画画就知道了)然后就是经典的莫队了,至于ans怎么更新,见代码啦~原创 2017-07-20 16:02:15 · 383 阅读 · 0 评论 -
bzoj3052 [wc2013]糖果公园(树上莫队,带修改)
树上莫队参见spoj_cot2,带修改莫队参见bzoj2120.这道题就是把这俩和在一起了╭(╯^╰)╮。bzoj上时间很宽松。。大家如果没把握还是不要去爆oj了的好。给大家推荐个好地方UOJ,这题的题号是58。可以先在那过了再说。。uoj的评测机好好的说。。顺便我树上莫队也是从建了uoj的vfk那里学来的。。大家可以去搜一下他的博客。我在这里放链接是不是算侵权??不懂。。只能orz神犇。(因为打原创 2017-07-21 21:19:46 · 593 阅读 · 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 · 315 阅读 · 0 评论 -
bzoj3342 教主的魔法(分块+二分查找)
题意:维护一段序列,两种操作:A.询问[l,r]大于等于v的有多少个。M.[l,r]都加上v分块练习。。对于区间加法,区间内的整块直接O(1)标记,对于剩下的两头的部分暴力更新。对于查询:每一块我们都保证是有序的(暴力更新后的块要重构),那么对于区间内的整块,我们直接二分查找,剩下的两头的部分我们暴力统计即可。#include #include #include #include原创 2017-07-20 18:02:58 · 331 阅读 · 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 · 403 阅读 · 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 · 349 阅读 · 0 评论 -
bzoj2028 [SHOI2009]会场预约(set)
STL就是好之set 用set直接水过。。每次看看离自己最近的那个区间有没有重叠。。有就删了它。。注意一下iterator在有erase,insert的情况下不要乱++,–,乖乖循环。。还有< 的重载啊。要const 和引用。。原创 2017-08-11 20:38:50 · 507 阅读 · 0 评论 -
CF527C Glass Carving(模拟+线段树)
用1和0 表示每一条可被切割的线是否被切割,然后用两棵线段树分别统计长和宽的最长连续零的个数。最大矩阵面积即为最长的长*最长的宽,即(长的最长连续零+1)∗(宽的最长连续零+1)(长的最长连续零+1)*(宽的最长连续零+1) 时间复杂度O(n* max( log2(w) , log2(h))) 求线段树最大连续子段和,最大连续0的个数等,为了满足区间加法,需另记附加信息lsum,rsum,即左起原创 2017-08-11 22:08:04 · 628 阅读 · 0 评论 -
bzoj1012 [JSOI2008]最大数(单调栈+二分/线段树)
线段树维护区间最大值或者单调栈权值递减,二分查位置。。。单调栈显然更快一些。。。线段树版原创 2017-08-11 22:34:41 · 338 阅读 · 0 评论 -
poj2777 色板游戏(线段树)
区间修改,绝对标记col,询问区间不同颜色数。原创 2017-08-11 22:55:20 · 447 阅读 · 0 评论 -
ural1846 GCD2010(线段树+gcd+离散化)
单点修改,相同的数给一个位置,记录出现次数,删为0就改这个点的值为0,第一次出现就改这个点的值为val,因此要离散化,变成单点修改即可。 tips:unique返回值为重复元素的首地址,即不同的数的个数+1原创 2017-08-12 11:31:03 · 406 阅读 · 0 评论 -
bzoj1798 [AHOI2009]维护序列(线段树)
区间修改+区间查询+双lazy标记 维护两个懒标记,注意优先级。没啥难度,就是细节要注意。原创 2017-08-12 12:26:31 · 306 阅读 · 0 评论 -
bzoj1230[Usaco2008 Nov]&&[TJOI2009]开关灯(线段树)
TJ的省选题居然是USACO月赛原题。。。我果然是在弱省,给跪了。 线段树维护区间修改和区间查询。原创 2017-08-12 12:08:47 · 406 阅读 · 0 评论 -
poj3667 Hotel(线段树)
维护最大连续0的个数+区间修改打标记+查询最左连续0个数为k。原创 2017-08-11 23:11:17 · 225 阅读 · 0 评论 -
bzoj3211 花神游历各国(线段树)
同bzoj3038(戳这里查看),双倍经验。原创 2017-08-12 17:21:33 · 405 阅读 · 0 评论 -
bzoj3038 上帝造题的七分钟2(线段树区间开方统计和)
线段树维护区间和,修改操作是区间开方,不满足区间加法。。咋办呢。。暴力呗,还能咋办。。还好每个数开不了几次方就变成1了,而变成1以后再开方就不需要更改了。所以我们再记一个最大值,最大值<=1时就不再修改了。改不了几次就都是1了。。原创 2017-08-12 17:03:41 · 450 阅读 · 0 评论 -
CF413E Maze 2D(线段树)
一个节点代表一个矩阵(1,l,2,r)。维护四个信息:四个角之间的最小距离,到不了就是inf,使得这四个信息具有可加性。即可用线段树进行维护。原创 2017-08-13 13:37:04 · 587 阅读 · 0 评论 -
poj2559 Largest Rectangle in a Histogram (单调栈)
用单调栈维护高度,使得栈内高度递增,每次一个高度h出栈时说明以h为高的这个矩阵不可能再延伸了,我们就计算出这个矩阵的大小,更新ans。还要注意维护宽度,比如进来的是高度h,为此删掉了3个点,则这3个点一定都比h高,第四个点就没有h高了,也就不能再向左延伸,则h向左延伸的最大长度也就是这3个点的宽度和了,而向右延伸的最大宽度则是在这个点出栈时已经删掉的点的宽度和(这个点出栈,说明遇到了比他小的高度,不原创 2017-08-13 23:04:40 · 454 阅读 · 0 评论 -
bzoj3039 玉蟾宫(单调栈)
给定一个01矩阵,求最大1矩阵面积。类似poj2559,只不过是没有给定那条底线。我们可以枚举以第x行为底,得出每一列的高,始终更新答案。复杂度是O(n2)O(n^2),详见poj2559.原创 2017-08-13 23:32:00 · 489 阅读 · 0 评论 -
bzoj1370 [Baltic2003]Gang团伙(并查集)
对于朋友,我们直接合并两人所在的集合。对于敌人,我们分别合并一人与另一人的敌人。我们只需再记下每个人的一个敌人即可。最后统计有多少个连通块便是答案原创 2017-09-04 11:12:00 · 373 阅读 · 0 评论 -
poj2236 wireless network(并查集)
每次修好一台,暴力O(n)扫一遍,把能和他直接通讯的合并起来。复杂度O(nm)吧原创 2017-09-04 11:31:40 · 320 阅读 · 0 评论 -
poj1611 the suspects(并查集)
并查集裸题。原创 2017-09-04 12:29:04 · 251 阅读 · 0 评论 -
bzoj1050 [HAOI2006]旅行comf(并查集)
要求路径上最大边与最小边比值的最小值。我们知道,如果固定最小值,最大值越接近最小值,他们的比值越小。因此我们可以采用类似bzoj3454的方法,把所有边从小到大排序,枚举最小值,再枚举最大值,用并查集维护,当s和t连通时,便是此最小值的最优答案。复杂度O(m2)O(m^2)原创 2017-09-05 13:56:22 · 277 阅读 · 0 评论 -
bzoj1529 [POI2005]ska Piggy banks(并查集)
水题一道。原创 2017-09-05 14:03:28 · 333 阅读 · 0 评论 -
luogu1196 [noi2002]galaxy银河英雄传说(带权并查集)
挺裸的带权并查集。。。注意一下N应该是300000,而不是30000原创 2017-09-05 14:50:50 · 375 阅读 · 0 评论 -
bzoj3362[Usaco2004 Feb]Navigation Nightmare 导航噩梦(带权并查集)
把询问离线了,按时间顺序排序,做好询问时间以前的。用带权并查集维护,因为要求曼哈顿距离,所以我们记录dx[i]数组表示x[fa[i]]-x[i],注意是有方向的。dy[i]同理。合并时处理好方向问题。还是那句话,画向量图来帮助你思维。 有没有哪位神犇能告诉我usaco green是个什么分级么。。跟gold pt不一样?原创 2017-09-05 16:25:19 · 452 阅读 · 0 评论 -
bzoj3454 家族(并查集)
首先按频率从小到大排序,然后枚举区间左端点,再枚举区间右端点,往右枚举右端点时可以用并查集维护答案。O(n^2)原创 2017-09-05 13:15:26 · 410 阅读 · 0 评论 -
poj1151 Atlantis(线段树+扫描线+离散化,求矩形面积并)
写过的裸题,还敲了半天。。。太蒻原创 2017-09-23 19:31:01 · 333 阅读 · 0 评论 -
bzoj4034 [HAOI2015]树上操作(树链剖分)
子树修改,通过dfn序可以变成区间修改。然后就是裸题了。原创 2017-09-08 09:55:28 · 335 阅读 · 0 评论 -
bzoj3999 [TJOI2015]旅游(树链剖分,有向的合并区间)
树链剖分,难点在于怎样维护答案区间。首先,这个题目啊。。。为了强行加上一个修改操作,害得我题都读不明白了。那个涨价就是顺带让你维护一个lazy。 最优解显然就是最大值-最小值啦,但是要有方向的。必须是在前面以最小值买,在后面以最大值卖。也就是一定是x->y的顺序。但是对应到线段树上,也许方向就反了,(毕竟x不一定编号小于y),因此我们在维护答案时,要注意方向。线段树每个区间只好记两个data了,分别原创 2017-09-08 11:28:42 · 603 阅读 · 0 评论 -
bzoj3339 Rmq Problem(离线+线段树)
首先mex(minimum excluded),是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。是SG函数中的一个东西。我们这道题是要多次询问这个东西。怎么搞呢?首先,1-i的mex我们是可以O(n)求出来的,记作mex[i],就像前缀一样。然后我们考虑把询问离线,按左端点排序。现在需要解决的问题就是如何从[l,原创 2017-09-16 16:16:47 · 404 阅读 · 0 评论 -
bzoj2243 [SDOI2011]染色(树链剖分,线段树求颜色段数)
树链剖分映射到线段树上,点与点的左右关系,大小关系都是不同的。因此维护ls,rs时要小心。合并答案时看的是top[x]和fa[top[x]]的颜色是否相等,看好是ls还是rs原创 2017-09-08 15:05:41 · 375 阅读 · 0 评论