*******数据结构*******
文章平均质量分 52
hqwhqwhq
有梦想就不累
展开
-
HDU_5249(百度之星D题)
因为之前没写过平衡树的题,所以很自然地只会用set来写。。。然后,很蠢地想直接找set容器中间位置的那个值,结果iterator没有重载+唉。。。翻了一下AC的代码(果然有跟我一样用set来写的),然后发现是两个set容器解决了这个问题。。。其实很容易想到,一个set容器放前一半的数,一个set容器放后一半的数,就行了。。。 #include #include #include #incl原创 2015-05-31 23:47:22 · 429 阅读 · 0 评论 -
HDU 2222 Keywords Search (AC自动机)
AC自动机上学期看过,看是一直没有写过,今天把这道模板题写完了。 附上学习博客的地址:AC自动机 代码风格是模仿的bin神博客的。分析:理解了KMP以后AC自动机并不是很难理解。KMP是对于一个串找公共前后缀,而AC自动机是对于一颗Trie树找公共前后缀。要点:如果匹配失败了,那么要转到fail指针后面的进行匹配。 代码中预处理出所有的ch值,这样扫匹配串:ch[now][str[i]-‘a’原创 2015-11-06 18:24:23 · 756 阅读 · 0 评论 -
HDU 5517 Triple (2015沈阳站I题&&二维树状数组)
题意:给一个nn个二元组:<a,b><a,b>,给mm个三元组:<c,d,e><c,d,e>。如果b=eb=e那么可以合并二元组,三元组,得到一个新的三元组:<a,c,d><a,c,d>。设所有的二元组,三元组组合后得到的新的三元组的集合是CC。 求CC集合中满足条件的三元组的个数。条件:设这个三元组为uu,在这个集合中找不到任何一个元素,使得改元素中每一个数都大于等于uu中对应的成员。分析:学习原创 2015-11-09 09:24:29 · 1585 阅读 · 0 评论 -
HDU 4676 Sum Of Gcd(莫队+莫比乌斯反演)
来看答案怎么求? ∑i=LR∑j=i+1Rgcd(a[i],a[j])=∑i=LR∑j=i+1R∑d|gcd(a[i],a[j])ϕ(d)=∑dϕ(d)∑i=L,d|a[i]R∑j=i+1,d|a[j]R1\sum_{i=L}^R\sum_{j=i+1}^Rgcd(a[i],a[j]) =\sum_{i=L}^R\sum_{j=i+1}^R\sum_{d|gcd(a[i],a[j])}\p原创 2015-10-28 00:02:28 · 899 阅读 · 0 评论 -
HDU 5458 2015沈阳站网赛1009 (边的双连通+树链剖分+线段树)
题意:给你n个点,m条边,两种操作: 1 u v 把u v之间的边删掉一个 2 u v 如果删除一条边就能使u,v不连通,那么找出所有满足这个条件的这些边的个数。注意:每一个时刻都保证图是一个连通图,可能有重边,可能有自环(u-u这种边) 删边这种东西太难处理,所以我们离线做,找出终图,然后加边,加边这种东西用并查集就可以维护,关键我们怎么求操作2? 1:很明显,我们要把所有的边的双连通分量缩成一原创 2015-09-22 18:24:49 · 790 阅读 · 0 评论 -
POJ 1987 Distance Statistics (树的分治)
这次整理模板整理到分治,然后就补了一道分治的题目: 这题和POJ 1741一样的题。 上次写树的分治,感觉是一种很厉害的数据结构,现在看来,其实是很简单的一种分治思想而已。 为什么每次都要找重心?因为这样每一个小子树的节点数<=n/2<=n/2所以递归计算的层数最多是o(logn),每一层计算合法点对个数,需要dfs一当前子树的所有结点o(n),计算所有节点到根的距离,然后按距离长度排序o(n原创 2015-10-13 21:24:16 · 580 阅读 · 0 评论 -
Hihocoder 挑战赛17 String Problem I (字符串HASH)
分析:第一次写字符串hash,学习的AC代码的写法。其实就是把字符串变成一个p1进制的数(Mod1),由于有冲突:所以用两种方法表示:p2进制的数。此题需要注意的点:原串中扫一遍去掉一个点时,如果相邻的两个点一样,那么去掉以后效果是一样的,这种情况只要算一遍。代码:#include <bits/stdc++.h>using namespace std;#define FOR(i,x,y) for(原创 2016-01-01 22:35:36 · 487 阅读 · 0 评论 -
CodeForces 605D Board Game(树状数组)
分析:找所有比(a,b)(a,b)小的数,可以先以找第一个数aa比小的所有集合中,第二个数比bb小的集合,肯定不能两次sortsort,可以用线段树+setset来搞定这件事情,线段树的坐标为aa的值,每个节点存的东西为一个setset集合,所有第一个数比aa小的集合,然后要找第二个数比bb小的集合,只需要在setset里面找就好了,这个时候时间复杂度:o(nlognlogn)o(nlognlogn原创 2015-12-19 23:58:26 · 1065 阅读 · 0 评论 -
CodeForces 601B Lipshitz Sequence (单调队列)
分析:很容易想到,区间斜率绝对值的最大值一定是所有相邻的斜率中的最大值。 然后把序列处理成后一个数减前一个数的绝对值。由于qq非常小,所以每一次询问支持o(n)o(n)的暴力。找区间s[l..r]s[l..r]序列所有子序列的值的和,从左向右枚举每一个数,找这个数对多少个不同区间有贡献,即找出这个数左边离他最近比它大的数的位置,找出右边离他最近的比它大的数的位置。这个时候发现有些区间被重复计算了,原创 2015-12-07 23:55:10 · 679 阅读 · 0 评论 -
CodeForces 594D REQ(树状数组)
分析:第一反应是用莫队来写,这样每次查询的复杂度是o(n∗n−−√)o(n*\sqrt{n}),设MM是a[i]a[i]中最大的数,那么每一次修改的复杂度是o(logM)o(logM),那么总的复杂度是o(n∗n−−√∗logM)o(n*\sqrt{n}*logM),这样的复杂度给人的感觉应该是要TT了,交上去确实也T了,如果nn是10410^4级别应该就没什么问题了。感觉这个可以作为莫队算法在一类原创 2015-11-27 12:38:53 · 826 阅读 · 0 评论 -
HDU 5603 the soldier of love (线段树)
分析:很经典的区间覆盖问题,给nn个线段,问mm个区间[L,R][L,R],共完全覆盖多少条不同的线段?如果要完全覆盖,那么l>=L,r<=Rl>=L,r<=R,如果这个时候我们把区间加入线段的序列,按照右端点rr来排序,用一颗线段树来维护所有的左端点,那么就是一个线段树的插入+查询操作。此题离线做就可以了。代码:#include <bits/stdc++.h>using namespace std原创 2015-12-26 23:34:13 · 471 阅读 · 0 评论 -
HDU 5692 Snacks (百度之星2A)
分析:题意就是根节点到ii子树上所有点的最大值,并且这棵树上的点权可修改。 那么维护所有点到根的和,如果修改一个uu节点,只会改变根到uu子树上点的和。把树用dfsdfs序遍历一下,把树变成一个序列,修改节点就变成了序列的区间修改,找最大值也变成了区间找最值。一棵线段树搞定了。 复杂度:o(mlogn)o(mlogn)代码:#pragma comment(linker, "/STACK:1024原创 2016-05-24 22:30:50 · 618 阅读 · 0 评论 -
hihocoder 1291 : Building in Sandbox (离线并查集)
分析:主要是第二个条件,题目的意思是,如果我再外面再包一圈(x=0,y=0,x=101,y=101,z=101x=0,y=0,x=101,y=101,z=101)这55个面上的点能够不经过正方体到达指定位置xx,我们设这55个面的所在的连通图是pp。换种问法就是,指定位置xx是不是在连通图pp中。判断一个点在不在连通块中:并查集就行了。每一次加一个正方体,相当于图的删边,这个比较困难,如果倒着删除正原创 2016-04-23 10:57:25 · 732 阅读 · 0 评论 -
CodeForces 715C Digit Tree (树的分治)
分析:求所有满足情况的链的个数,这个时候很容易想到树的分治,每次求经过rt的所有满足条件的链的个数。由于从rt开始的链可以进行合并。所有直接暴力所有子树就可以了。复杂度就是o(nlogn)o(nlogn)。代码:#include <bits/stdc++.h>#define LL long long #define FOR(i,x,y) for(int i = x;i < y;i ++) #def原创 2016-09-22 23:48:40 · 956 阅读 · 0 评论 -
HDU4417(主席树)
前言:今天刚学的主席树,附上博客:主席树 个人觉得这篇文章写的非常好。认识:主席树就是对于序列1...n1...n的每一个前缀都构造一颗线段树来维护所要求的值。也就是说主席树实际上就是nn棵线段树。那么为什么不会MLEMLE?这个下面再说。先说一个经典的问题:静态区间第kk大?(求区间[l,r][l,r]之间第kk大的元素。无修改) 那么对于序列的前缀,需要知道[1,l−1][1,l-1]和[1,原创 2016-03-28 23:24:38 · 2998 阅读 · 0 评论 -
HDU 5919 Sequence II(主席树)
题意:有长度为nn的序列,强制在线询问[l,r][l,r]这段区间中所有不同数出现的第一个位置,按照位置从小到大排完序以后的中间(向上取整)的那个位置是多少?分析: 如果可以离线做,那么按照ll排个序以后,从右想左逐个添加新的位置,删除前一个位置。 但是这个强制在线怎么搞, 那就把以[l,n][l,n]序列形成的线段树都存下来,然后在对应的线段树上面搞一下,就行了。这个时候用主席树来存就好了。 代码原创 2016-10-05 01:00:09 · 580 阅读 · 0 评论 -
BNUOJ 24253 (弱校联盟第7天E题)
这道题比赛的时候并没有AC,赛后看别人博客学会的,其实我一开始的思路还是比较像的,这道题看到的第一眼想到了网络赛的那个单点修改的,因为Mod不是质数,但是题目说了单点除的数在前面一定会出现一个乘这个数,所以连线搞就好了,然后这题并不能这样做。然后我就想着把Mod质因数分解,如果Mod = p1 * p2 * … Pn这种,所有质数的指数都是1的话,这个时候直接维护每一个质数的模的乘积,然后最后答案用原创 2015-10-08 11:53:09 · 426 阅读 · 0 评论 -
HDU 2896 病毒侵袭(AC自动机)
分析:这也是一道很裸的AC自动机,单词结尾的节点不在是1,而是id,即这个单词的序号,然后用vector把所有序号存在来,一遍去重,然后输出答案就好了。总的复杂度为o(m*l)代码:#include <bits/stdc++.h> #define LL long long #define uLL long long #define FOR(i,x,y) for(int i = x;i < y;++原创 2015-11-07 00:03:23 · 449 阅读 · 0 评论 -
HDU 5536 Chip Factory (2015长春J题&&Trie树)
比赛的时候这道题想了好久,最后还是没想到正解,一直提醒队友不要暴力,暴力一定不过,最后看那么多人都过了,我们还没想到正解,于是就暴力了,n3n^3过了。。。分析:把所有数2进制分解,建一颗Trie树,然后暴力n2n^2找出所有(i,j)(i,j)在Trie树里面招出xorxor最大值。因为要保证i,j,ki,j,k不相等,所以扫(i,j)(i,j)的时候,不妨先删除i,ji,j串,查询完了再插入。t原创 2015-11-04 23:48:12 · 657 阅读 · 0 评论 -
POJ 3580 SPLAY树
最近补基础数据结构的最后一题,说实话,这题比上一题简单多了。这里面有一个右移T次的操作,其实就是把数列分成[l,r-T],[r-T+1,r]然后把前一段插到后一段后面。这题我写傻逼了,wa了5发,发现我把右移写成了左移。。。 明天回家了,待会买点东西,回来写个Splay树小结!!! 下面附上这道题的AC代码: #include #include #include #include #原创 2015-08-22 18:29:19 · 426 阅读 · 0 评论 -
HDU 1890(Splay树)
这个礼拜准备把Splay树补完,这道题被认为是一道Splay的水题,(然而像我这种入门级学习后还是搞了好久,毕竟算是第一次接触吧)。 感觉Splay树必须要明确的一点:该树的中序遍历就是现在的序列 这里面有一个区间翻转的操作,涉及到区间问题,Splay树的核心就是RotateTo(l-1,0),Rotate(r+1,root),就是把该区间的前一个数转到根节点,后一个数转到根节点的右节点,这是原创 2015-08-18 11:54:09 · 440 阅读 · 0 评论 -
SPOJ 375 树链剖分学习
学习树链剖分的第一题,第二个dfs忘记递归了(太蠢),re了两发,改过来以后就1A了。 学习树链剖分可以参考这篇博客:http://blog.sina.com.cn/s/blog_7a1746820100wp67.html 个人感觉写得非常好!!! 树链剖分听起来很吊,其实就是把数边扔到线段树上,然后搞出一点事情来。主要就是一个重儿子,重链,从而使复杂度降到了(logn)。这个非常关键。关于初原创 2015-09-01 23:07:56 · 362 阅读 · 0 评论 -
POJ 3237 树链剖分学习(&&树链剖分小结)
一个地方wa了3发,找了一组数组发现的错误,太蠢,就是两个人数作交换写成了 a=b ,b=a。最近智商真是感人。这道题是由spoj375这题改编的,多了一个取反的操作,这个操作只需要多维护一个最小值就行了。然后就是简单的树链剖分+线段树的区间操作。没什么好说的,直接上代码(过几天把LCT学习了,可能回头再来补这题)。 #include #include #include #include原创 2015-09-02 23:24:08 · 383 阅读 · 0 评论 -
HDU 4010 动态树LCT学习
入门LCT的题目,这几天把LCT学习了一下,上手真是好难。这是写的LCT的第一道题,改掉了BUG以后交上去,PE,加了一行空格以后就过了,真是太开心了!!! 写一点刚开始学习的一点感想,等我把题目补完了再来做一个小结。 刚开始看http://wenku.baidu.com/view/75906f160b4e767f5acfcedb 这篇论文的时候真是感觉好烦,看了好几遍以后感觉写得确实太优秀原创 2015-09-08 22:14:16 · 836 阅读 · 0 评论 -
HDU 3966 树链剖分学习
这道题不难,看出是树链剖分就很简单,其实奇异也很明显就是一个树链剖分,不过这次不是把树链扔到线段树上,是把节点扔到线段树上。这个时候注意一下w[1] = 1就行了,其他就是线段树的一个区间覆盖的问题了。 #include #include #include #include #include #include #define LL long long #define FOR(i,x,原创 2015-09-03 23:06:53 · 264 阅读 · 0 评论 -
HNOI 2002 营业额统计
最近开始重新学习Splay树写的第一题,基本就是照着别人博客改的一道题,关于Splay树的模板,感觉大牛已经把代码改得很短!!!这道题没什么难度,一个插入操作,一个找前驱,一个找后驱的操作。(话说这题有个数据有个bug的地方,可以看连接的discuss)。因为没有Push_Down,Push_Up的操作,感觉这题应该算是Splay树里面最水的一道了吧。 下面附上代码:(因为是第一题写Splay树原创 2015-08-19 15:56:37 · 444 阅读 · 0 评论 -
ZJOI2008 树的统计 树链剖分学习
水题,这次都没有给我傻逼的机会了,1A过了。直接上代码了 #include #include #include #include #include #define LL long long #define INF 0x3fffffff #define FOR(i,x,y) for(int i = x;i < y;i ++) #define IFOR(i,x,y) for(int i原创 2015-09-04 22:59:31 · 379 阅读 · 0 评论 -
SPOJ 375 LCT学习
今天把这题的LCT补了一下: 下面是用树链剖分写的,上面使用LCT写的,树链剖分确实比LCT快,据说是LCT多一个常数的关系,但是这道题由于数据比较小的关系吧,树链剖分并没有比LCT快多少。 这道题的关键是一个边权转换成点权来写(话说如果这个不知道,那么树链剖分也写不出来了吧,但是我感觉是不是可以用map,int>来直接存边,然后做,好像这个样子又会多一个logn,没有尝试写过。。。)原创 2015-09-10 23:07:35 · 418 阅读 · 0 评论 -
NOI2005 维修数列
昨天A掉的这题,然后伸展树还有最后一题没敲。很BT的一题,但是感觉学习伸展树不做这道题不算真正学过吧。 这道题多了一个操作,求子序列和的最大值。这个东西怎么维护?其实和学习线段树的时候很经典的那个Hotel基本一样,维护一个最左端的和的最大值,维护一个最右端和的最大值,维护一个最大值,维护一个区间和。然后区间合并的操作就好写了,不过写的时候细节的地方要特别注意一下,例如,没有左节点的情况。(当然每原创 2015-08-21 20:42:06 · 601 阅读 · 0 评论 -
HYSBZ 2243 染色 LCT学习
这道题感觉非常简单,(其实用树链剖分写的话肯定快多了),一个区间染色问题,需要记录一下最左段,最右端的颜色,还有就是有几段,这样才能维护起来,在一个傻逼地方wa了好多遍,翻转的时候,左端的颜色变成了右端的颜色,右端的颜色变成了左端的颜色。下面是代码: #include #include #include #include #include #define LL long long #d原创 2015-09-11 21:30:13 · 583 阅读 · 0 评论 -
HYSBZ 2049 Cave 洞穴勘测
比较简单的LCT,就一个link,Cut操作(就是HDU那道题中的两个),直接上代码: #include #include #include #include #include #define LL long long #define INF 0x3fffffff #define FOR(i,x,y) for(int i = x;i < y;i ++) #define IFOR(i,原创 2015-09-11 21:25:06 · 515 阅读 · 0 评论 -
Splay树小结
http://blog.csdn.net/acm_cxlove/article/details/7815019 附上cxlove大神的博客链接,最近是跟着上面的题目做的。 刚学的时候感觉好难,显示照着大白皮上面敲的模板,然后网上各种看论文,感觉指针写还是太繁琐,还是直接数组写的精炼。感觉Splay树确实强大,可以解决好多序列问题。感觉Splay树的核心是Key_Tree = ch[ch[root原创 2015-08-22 21:37:55 · 352 阅读 · 0 评论 -
HDU 5441 2015长春站online1005(并查集)
这场比赛其实打的还是比较傻逼的,赛后做总结,感觉麟哥和真珍姐讲的还是蛮有道理的,现在如果再做专题的话没有什么意义了,这段时间准备多做点套题。 比赛的时候并不是我写的这题,赛后补了一下,写离线并查集的话,不断插满足条件的边,如果是u,v在两棵不同子树的话,那么这次查找的答案就是ans += 2*cnt[findset(u)]*cnt[findset(v)];这里应该比较好理解。 #include原创 2015-09-14 12:57:43 · 407 阅读 · 0 评论 -
HYSBZ 2002 Bounce 弹飞绵羊(分块)
今天原来打算做ZOJ月赛的,等到中午的时候感觉太困了,就睡了一觉,然后就没有然后了。。。 这题正版写法应该是LCT,但是分块也能过,而且写起来特别简单,LCT写的话应该是一个Cut,Link操作,维护的就是答案的值(没写)。 下面附上代码: #include #include #include #include #include #define LL long long #defi原创 2015-09-12 16:43:54 · 422 阅读 · 0 评论 -
弱校联盟国庆第二天 D题
据说是一道很裸的树链剖分,但是我感觉树链剖分并不是很好写。。。然后就行LCT写了,很裸的LCT,但是这道题居然RE, dfs爆栈了,然后我把vector存边换成结构体居然就过了!!!大家好像是dfs的时候把根换点就能过了。 本题题意:有两个操作,1:把u->v的链上的点全部变成w。2:找出u->v这条链上最大非空区间和,这个就是把左右两段合起来。 附上ac代码:#include <cstring原创 2015-10-03 22:55:44 · 372 阅读 · 0 评论 -
CSU 1811 Tree Intersection
题意:一棵树,每个节点有一种颜色,现在删去一条边,求这个树分成两部分,这两部分的共有颜色个数。分析:枚举每一棵子树所有存在的颜色的节点个数,看看有没有超过这种颜色再整个树中的个数,就是答案。 就是一个子树的合并操作,合并并不需要每一个子树都建立一个节点,只需要找出不同颜色最多的那个子树,在这个子树上进行合并就可以了。这个样子每一次最多暴力了u.size()/2u.size()/2,那么总的复杂度就原创 2016-09-07 12:42:34 · 731 阅读 · 0 评论