![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
大白书-第3章-实用数据结构
文章平均质量分 69
冷月残星
这个作者很懒,什么都没留下…
展开
-
线段树,分治法(动态最大连续和,LA 3938)
长代码找手误真的难= =。很容易脑补成对的,然后就混过去了。其实不应该贪快嫌麻烦,一定要想清楚。 线段树维护:区间左坐标,区间右坐标,区间和,最大连续和,最大连续和左坐标,最大连续和右坐标,最大前缀和,最大前缀和右坐标,最大后缀和,最大后缀和左坐标。 如果区间和相等,都是在保证左坐标最小的情况下,右坐标最小。 可以证明当区间和相等时,选择右边>左+右>选择左边。原创 2016-12-11 14:40:56 · 644 阅读 · 0 评论 -
树状数组(乒乓比赛,LA 4329)
这道题不禁让我想起了 【2016-大连赛区网络赛-J】线段树,dfs(Weak Pair,hdu 5877) 那道题是一边dfs,一边计算,一边维护线段树。 这道题是一边循环,一边计算,一边维护树状数组。 题目要求只要裁判在中间就好了,我理解成升序。。。WA 很多时候如果找不到错误数据,就要好好想想是不是有些地方想当然,然后理解错了。 看代码理原创 2016-12-09 14:44:14 · 464 阅读 · 0 评论 -
RMQ,ST表(频繁出现的数值,UVA 11235)
有时候递归里面的特殊情况讨论了,然而入口忘记讨论了,就会导致WA。。。 思路就是说,还是ST表嘛,其中ST[i][0]=1,只不过不能直接ST[i][j]=max(ST[i][j-1],ST[i+(1 先 int ans=1; 然后 if(a[L+(1 最后 ans=max(ans,ST[L][k]); ans=max(ans,ST[R-(1原创 2016-12-09 16:04:08 · 344 阅读 · 0 评论 -
AC自动机,概率,递推(子串,UVA 11468)
一是记忆化搜索时数组开小了。 二是忘写getfail毁一生,竟然还能过样例。 本来昨天晚上就可以过掉的题目搞到今天中午。。。 感觉自己空手debug能力好差,很多逗比的错误都发现不了。真的要一步一步仔细做好了。 代码 #include #define maxn 500 #define size 62 using namespace std; int ch[maxn][siz原创 2016-12-15 12:54:33 · 269 阅读 · 0 评论 -
AC自动机(Matrix Matcher,UVA 11019)
看到二维的,还以为有什么二维字典树,什么字典树套字典树之类的鬼东西。其实就是建立一个字典树,然后对每行进行匹配,然后再把匹配结果刷表在一个二维数组里。 最后看看二维数组的状况就好了。 具体来讲,就是说如果在i行j列处完成了第k个字符串的匹配,那就在cnt[i-k][j-Y+1]处++。最后遍历一下cnt数组,如果cnt[i][j]==X就说明是一个匹配点。 然后要判重,所以一次匹配成原创 2016-12-15 15:03:55 · 253 阅读 · 0 评论 -
后缀数组,LCP(生命的形式,UVA 11107)
看了别人的代码才过的。 http://blog.csdn.net/scut_pein/article/details/19786707 果然抄别人的代码就会一点都不理解,很多细节都没注意到的。自己搞了好多发RE,TLE,WA才过。 就是char最大为127,最小为-128,而字符种类数必然大于这个值(主要是有100个各不相同的分隔符),所以需要用int形数组来保存合并后的串。 vi原创 2017-01-18 11:42:08 · 1416 阅读 · 0 评论 -
后缀数组,LCP(Stammering Aliens,LA 4513)
WA了好多发,简直想卒。 跟上一题一样原理啦,输出时有些极端数据要特判一下,比如长度刚好为n和"none"的情况。 还是自己太弱了,太浮躁太心急,有时候自己写的一些代码可以通过大部分数据,但是由于细节实现得不好或者有些极端数据本来就应该特判输出,而自己却没考虑到,导致WA。所以以后要做好各种极端情况的数据测试。 代码 #include #define maxn 10原创 2017-01-18 15:11:16 · 515 阅读 · 0 评论 -
STL,双重有序(优势人群,UVA 11020)
看来双重有序这个东西你是忘得一干二净。 其实就是自己经验不够丰富了。 一个人有两个属性,都是正数,一个人比另一个人有优势当且仅当两个属性都不比对手大,而且至少有一个属性比对手小。那么如果把一个属性看做x轴,另一个属性看做y轴,那么一个人不就是平面直角坐标系第一象限上的一个点吗?一个人比另一个人有优势不就是一个人在另一个人的右上方吗。n个人互不占优不就是连线类似反比例函数吗?只能说自己建模的思想原创 2017-01-18 19:23:56 · 228 阅读 · 0 评论 -
伸展树(排列变换,uva 11922)
数据结构日常RE。 多自己带数据测就是王道吧。 解题思路: 一开始不会嘛,只好想办法套大白书上给的splay,split和merge代码。但要注意的是splay函数里的那个cmp和前面treap里的cmp不一样。splay的是比序号(也就是第几个的意思),treap的是比大小(BST的查找嘛)。所以要自己重写。然后想该怎么套咧?题目要求复制后逆序粘贴到后面,那么显然树上的节点不能同时原创 2017-01-27 23:28:28 · 481 阅读 · 0 评论 -
并查集(合作网络,LA 3027)
并查集不就是插入时简单的合并两棵树,然后查找时让沿途所有节点都指向根节点吗?而题目又只问节点到根节点的距离,那就在并查集执行的过程中多维护一个量d[i]表示i节点到其父节点的距离。查找时只要跑一下并查集(即维护一下d[i]),然后直接输出结果就好了。插入时就修改一下父指针以及其到父节点的距离就好了。 说明自己对并查集只是一知半解,没能理解到其中的不变式,才会弄了那么久。 只能多原创 2016-12-09 12:16:09 · 294 阅读 · 0 评论 -
并查集(易爆物,LA 3644)
看清题啊大哥。。。人家说存在k个,正好包含k种。你看成了刚好k个,刚好k种,然后在那用什么set搞来搞去,还出了bug然后刚好过了样例,神逗。 先验证解法的正确性,再去编写代码,别浪呀,万一没想清楚甚至读错题就爆炸啦。 好吧,其实中文题目还是有点没说清楚的吧。以后还是看英文原题好了。 英文原题就是说如果将N个不同的化合物放在一起恰好有N种元素,就会爆炸,还用成环解释了一波。这不就原创 2016-12-08 21:06:01 · 373 阅读 · 0 评论 -
AC自动机(出现次数最多的子串,LA 4670)
#include #define maxn 20010 #define maxsize 26 using namespace std; int ans; int sum[maxn]; /////////////////////////////////////// //字典树 int ch[maxn][maxsize]; int val[maxn],sz; void init() { mem原创 2016-12-14 17:11:49 · 504 阅读 · 0 评论 -
线段树(Fast Matrix Operations,UVA 11992)
我真的是写线段树写懵逼了。 开始出现成吨低级错误。 代码 #include #define m ((l+r)>>1) #define ls (now<<1) #define rs (ls|1) #define maxn 1000010 #define mem(a) memset(a,0,sizeof(a)) using namespace std; int R,C,M; int o原创 2016-12-12 17:15:31 · 240 阅读 · 0 评论 -
字典树(背单词,LA 3942)
一直WA,找不到错,十分烦躁。 事实上是模板写错了,int ch[][]写成了char ch[][],直接爆炸。 说明看了一遍代码后再自己写一遍是绝对不会动脑子的,不仅不理解,还以为自己懂了。 所以说写代码这种东西,只有自己创造出来的才不会忘,以后再写也才不会错。一旦沾上任何一点背默的成分,就跟不会一个样。 模板还是要的,毕竟你需要在比赛中快速的打出一份正确的代码。 但是平时的练习中,尽原创 2016-12-12 21:20:10 · 519 阅读 · 0 评论 -
字典树(strcmp()函数,uva 11732)
有点类似树形dp,fa[u]代表u节点的父节点,说val[u]表示u这个节点有多少个字符串走过,因此在这个节点的比较总次数=val[u]*(val[u]-1)+val[u]*(val[fa[u]]-val[u])。 值得注意的是,在其他节点中val[u]*(val[u]-1)并不会重复计算,而val[u]*(val[fa[u]]-val[u])却被再计算一次。 所以最后答案就是ans=∑val原创 2016-12-13 15:08:36 · 405 阅读 · 0 评论 -
水题(I Can Guess the Data Structure!,UVA 11995)
#include using namespace std; int n; stacks; queueq; priority_queuep; bool a,b,c; int main() { while(~scanf("%d",&n)) { while(!s.empty()) s.pop(); while(!q.empty()) q.pop();原创 2016-12-08 16:36:52 · 253 阅读 · 0 评论 -
水题(Easy Problem from Rujia Liu?,UVA 11991)
#include #define maxn 1000010 using namespace std; int n,m; vectorvec[maxn]; int main() { while(scanf("%d %d",&n,&m)==2) { int x,y; for(int i=0;i<maxn;i++) vec[i].clear();原创 2016-12-08 16:50:55 · 233 阅读 · 0 评论 -
思路题,多路归并(K Smallest Sums,UVA 11997)
最简单的多路归并就是归并排序,只需要将两个有序表合成为1个有序表即可。首先表只有2个,其次限制条件也只有挑一个最小的。所以非常简单。实现方法往往是弄两个指针,然后看哪个指针指向的值小,就把哪个值放进来,然后指针++。 但是有时我们会遇到更为复杂的问题,比如说有多个有序表,而且限制条件又比较复杂的情况,有时甚至连我们该归并什么,有序表里该放什么都不知道。 这时我们就最好要有一原创 2016-12-08 20:10:17 · 456 阅读 · 0 评论 -
水题(阿格斯,LA 3135)
#include using namespace std; typedef pair pii; mapMAP; char str[110]; int main() { priority_queue,greater >q; while(1) { scanf("%s",str); if(str[0]=='#') break;原创 2016-12-08 17:55:22 · 296 阅读 · 0 评论 -
伸展树,LCP(uva,11996)
讲道理,基于哈希值的字符串算法真的很不错。因为unsigned long long高达1e19,而算法竞赛中字符串长度不可能大于1e6,毕竟如果再大,那就连经典字符串算法都无法在短时间求得结果了O(nlongn)。所以重复的概率为1e6*1e6/1e19=1e-7,即只有0.00001%的概率会重复。 在本题中HASH值取3是可以的,而2是不可以的。因为2是unsigned long long最原创 2017-01-28 15:49:04 · 540 阅读 · 0 评论