数据结构
文章平均质量分 63
子在梦中曰
程序是蓝色的诗
展开
-
hdu 1856 More is better(并查集)
超时了好几遍,后来做了一点儿非常小的改动通过了,实际上我到现在还不知道这些小改动到底能提高多少运算速度,我觉得很有限,但是a了。跟之前两道题不一样,这个题目最后求的是最长路径的长度,所以运算过程中需要压缩路径。#include#define N 10000001int mark[N],rank[N];int sum;int find(int x){ while(x!=mark[原创 2013-03-24 13:59:17 · 495 阅读 · 0 评论 -
hdu 2874 Connections between cities(LCA离线算法)
因为手残,wa了很多遍。在tarjra函数中,第一次循环调用的是b数组,我写成了a数组,一直找不到哪儿错了,一直到刚才终于发现了。大概11A的样子?这道题让我非常困惑的一个问题是MLE,内存就差那么一点儿不够使。我原本的代码存边的时候是同时存起点和终点,为了解决这个问题,我用了short存的起点和终点。后来看了别人的代码才发现还可以不存起点。。。。。。用short存起点和终点AC的原创 2013-10-25 21:08:02 · 631 阅读 · 0 评论 -
数据结构实验 栈和队列
(1)采用链式存储实现栈的初始化、入栈、出栈操作。(2)采用顺序存储实现栈的初始化、入栈、出栈操作。(3)采用链式存储实现队列的初始化、入队、出队操作。(4)采用顺序存储实现循环队列的初始化、入队、出队操作。(5)在主函数中设计一个简单的菜单,分别测试上述算法。//用链表实现栈用的是头插法,用链表实现队列用的是尾插法。#include#include#define N 1原创 2013-06-12 11:29:37 · 1686 阅读 · 0 评论 -
数据结构实验 单链表
编写一个完整的程序,实现单链表的建立、插入、删除、输出等基本操作。(1)建立一个带头结点的单链表。(2)计算单链表的长度,然后输出单链表。(3)查找值为x的直接前驱结点q。(4)删除值为x的结点。(5)把单向链表中元素逆置(不允许申请新的结点空间)。(6)已知单链表中元素递增有序,请写出一个高效的算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素),原创 2013-06-06 14:11:50 · 2078 阅读 · 0 评论 -
数据结构实验 双向链表
实验三:双向链表的基本操作 1.利用尾插法建立一个双向链表。 2.遍历双向链表。 3.实现双向链表中删除一个指定元素。4.在非递减有序双向链表中实现插入元素e仍有序算法。 5.判断双向链表中元素是否对称若对称返回1否则返回0。6.设元素为正整型,实现算法把所有奇数排列在偶数之前。 7.在主函数中设计一个简单的菜单调试上述算法。//排序的原创 2013-06-11 20:44:34 · 1947 阅读 · 0 评论 -
hdu 1496 Equations(哈希表)
昨天才看到这个题的加强版,今天就又遇见了。这道题时间卡得很厉害,如果没有提前判断,对每一次输入都直接把mark数组赋值为0,会超时。其实我没学过哈希表,也不知道那是什么东西。但是别人都说是哈希表,我也就跟着哈希表吧。将一个四重循环分成两个二重循环。#include#include#define N 1000000int mark[2000005];int main()原创 2013-05-08 11:25:43 · 540 阅读 · 0 评论 -
poj 3461 Oulipo(KMP,喜闻乐见纯模板)
纯模板。#include#include#define N 1000005#define M 10005char s1[M],s2[N];int ln1,ln2;int next[N];void setNext(char *s){ int i,j; j=-1;i=0; next[i]=j; while(i<ln1) { if(j==-1||s[i]==s[j])原创 2013-08-01 00:03:04 · 554 阅读 · 0 评论 -
poj 2406 Power Strings(KMP轮回串)
挺直白的一道考KMP轮回串的题目,打完代码,测试了各种数据没有问题,提交wa。怎么想都想不明白,然后看discuss里面别人的代码,遇到“.“要直接跳出。最后一行这个”.“藏得也太深了……#include#include#define N 1000005char s[N];int next[N];int ln;void setNext(char *s){ int i,j;原创 2013-07-31 22:29:10 · 557 阅读 · 0 评论 -
hdu 1823 Luck and Love(二维线段树)
目测为了做这道题我可能写了近千行代码。刚开始的时候看出来这道题应该是一个二维的线段树,我没有做过二维的线段树,就在脑子里yy二维的线段树应该是什么样子。我当时想的情况是先对第一个关键字进行建树,结束之后再在第一个树的每一个叶节点中对第二个关键字建树。废了好大劲儿终于把代码敲出来,然后提交TLE。我想了一下,觉得这样的话查询效率会很低,对于第一个关键字的区间内的每一个值都要查询到叶节点,然后原创 2013-07-15 10:48:09 · 943 阅读 · 0 评论 -
poj 2823 Sliding Window(单调队列)
用C++5293msA掉了,用G++就超时。今天机房蚊子怎么这么多,咬死我了。#include#include#define N 1000005int a[N],Mi[N],Ma[N];int ans1[N],ans2[N];int main(){ int n,t; while(scanf("%d%d",&n,&t)!=EOF) { in原创 2013-09-03 16:32:08 · 488 阅读 · 0 评论 -
hdu 1325 Is It A Tree?(并查集)
因为题目中一句英语没看懂,白白浪费了半个多小时的时间。。。。不说了,说多了都是泪。题目中每一个节点只能有一个进入点。和那个小希的迷宫很像。#include#define N 1000000int a[2*N];struct node{ int x; int ans; int count;}mark[N];void value(){ int i; for(i=0;i<原创 2013-03-29 22:42:01 · 410 阅读 · 0 评论 -
hdu 1878 欧拉回路
刚开始一直不明白怎么判断欧拉回路,网上搜了一下,就是判断接入每一个点的度(他们称之为度)是不是偶数,如果全是偶数且图联通,就存在欧拉回路,否则不存在。至于判断图是不是联通,直接用并查集判断就行。#include#define N 1005int mark[N],rank[N],num[N];int n,m;void value(){ int i; for(i=0;i<=n;原创 2013-04-22 17:07:10 · 435 阅读 · 0 评论 -
单链表
好烦啊,这几天做题,碰见一道就不会,就算会的,也得给我wa几遍,让我慢悠悠地在那儿debug。单链表是数据结构课的内容,之前一直没上课,现在发现学很多东西要用到书上的东西,所以开始学了。写得不怎么规范,自娱自乐罢了。创建并输出一个单链表:#include#includestruct node{ int data; node* next;};node* creatlist(原创 2013-04-30 13:58:21 · 520 阅读 · 0 评论 -
hdu 1556 Color the ball(线段树)
我的第一道线段树!说出这句话的时候一阵心酸,之前一直说要学,看看又觉得好难啊,往后推。一直推到今天,咬咬牙,终于学了。虽然只是很简单的做了一道题,甚至线段树的思想还掌握不了,可毕竟是一个开端啊。#include#define N 1000005struct node{ int x,y; int count;}a[N*2];void CreatTree(int t,int原创 2013-05-04 15:15:17 · 595 阅读 · 0 评论 -
hdu 1166 敌兵布阵(线段树,励志了!)
同样是难度极低的线段树模板题,虽然据说难度很低,但是对我这个刚刚看了几个小时线段树的人来说,早已做好了wa到天昏地暗的准备。因为是刚学嘛,有些细节不知道怎么处理,我去看了下小boss的解题报告,看了下他是怎么把叶节点的值更新到叶子的根的。然后我自己动手写。bug是少不了的,悠哉游哉地把bug修改完,测试下数据,通过了!再提交,我嘞个去!A了!话说我都已经做好被wa之后重新修改代码最后修改不原创 2013-05-04 19:48:57 · 503 阅读 · 0 评论 -
hdu 1394 Minimum Inversion Number(线段树解法)
下节课不想逃的,所以很认真的debug,终于在快上课的时候找到bug了。为了避免出现0,我把序列中的值都加上了1,但是这样就可能出现map[i]+1比n要大的情况,开始我一直没想明白。这个题用线段树解决非常得巧妙,将数据有序的存入线段树中,对于x,序列中逆序的个数就是在他之前存入的,在线段树中在它后面的数据的数量。比如说对于一个长度为10的数列,在第i次存入5,这时候序列中对于5来说逆原创 2013-05-15 09:43:17 · 731 阅读 · 0 评论 -
hdu 2527 Safe Or Unsafe(优先队列+哈夫曼树)
感觉优先队列和哈夫曼树我学的都让人挺伤感的。看到有人直接用优先队列来模拟哈夫曼树的构造过程,太有创意了!#include#include#includeusing namespace std;struct node{ int t; friend bool operator<(node aa,node bb) { return aa.t>bb原创 2013-07-09 19:51:47 · 863 阅读 · 0 评论 -
hdu 4123 Bob’s Race(树形DP+单调队列)
昨天做虚拟赛的时候,gby做了一个树形DP,把这道题的数据处理出来,然后问我有没有什么比较快的方法能把计算出一个序列中的最大子区间,这个子区间内的最大值和最小值之差不能大于q。我当时想有没有什么好办法,想了好几种,什么线段树,ST算法之类,但是考虑到速度,感觉还是用单调队列最快。原创 2013-10-30 16:33:34 · 665 阅读 · 0 评论 -
hdu 2087 剪花布条(KMP)
以前做过的一道水题,今天用KMP做了一下。#include#include#define N 1005int next[N];void setNext(char *s){ int ln; int i,j; ln=strlen(s); i=0;j=-1; next[i]=j; while(i<ln) { if(j==-1||s[i]==s[j]) { i++原创 2013-07-31 20:34:26 · 535 阅读 · 0 评论 -
hdu 1711 Number Sequence(KMP模板题)
我的第一道KMP。把两个数列分别当成KMP算法中的模式串和目标串,这道题就变成了一个KMP算法模板题。#include#include#define N 1000005#define M 10005int a[N],b[M];int next[M];int n,m;void setNext(){ int i,j; i=0; j=-1; next[i]=j; whi原创 2013-07-26 12:24:55 · 706 阅读 · 0 评论 -
hdu 1247 Hat’s Words(字典树)
我以为像a、aa这样的输入应该是没有输出的,结果还是要输出aa。建树的时候就是常规建树,不过查找的时候要做一些变形:对于一个单词,从第一位检查有没有单词是它的前缀,如果有的话,再去检查它的后半部分是不是一个独立的单词,要满足这两次查找才能输出。老是从自己写的字典树里面闻出一种山寨的味道。#include#include#include#define N 50005char s[原创 2013-07-25 22:18:43 · 693 阅读 · 0 评论 -
hdu 3911 Black And White(线段树)
这道题很麻烦,比较烦的是题目其实没什么含金量,就是延迟标记加区间合并。昨天晚上一点半被蚊子咬得睡不着,就起来做这个题。从一点半做到快三点,提交wa。当时我就去睡了,早上来继续debug。做一个小修改之后,试探性地提交了一次,无悬念wa。后来又debug了半天,终于找到一个藏得很深的错误,提交后796msAC。题目麻烦的是我们求的是最长的1的连续序列,但是因为题目中的操作是一个异或操作,原创 2013-07-22 09:13:00 · 926 阅读 · 0 评论 -
poj 3667 Hotel(线段树)
昨天跟学弟做练习赛的题目,好长时间没有做题,看到题目不想写代码。 比赛结束后写的。 做这道题最大的收获应该是熟悉了xcode的debug方式吧,代码中出了一些bug,然后坚持用xcode调试,最后在熟悉了xcode的debug之后,终于找到了问题。 好长时间没做题,线段树的一些写法已经忘得差不多了,而且对bug不够敏感。在修改和查找的函数里,延迟标记都忘记了往下原创 2015-05-06 13:10:31 · 573 阅读 · 0 评论 -
hdu 2665 Kth number(划分树模板题)
题意:给定一个长度为n的序列,进行m次查询,求出区间[l,r]中的第k大值。思路:划分树模板题。上学的时候做过这道题,当时看了下划分树的讲解,看得很头大,然后就一直放着了。十一回家的时候在高铁上没什么事情,就重新学习了一遍划分树。划分树是通过模拟快速排序,记录快速排序的过程。因为快速排序本质上就是讲一个很大的序列划分成一段一段的小序列分别排序,所以可以将这个排序的过程给记录下来,然后根据排原创 2016-10-17 10:59:24 · 350 阅读 · 0 评论 -
hdu 3068 最长回文(manacher算法)
题意:给出一个字符串,求这个字符串的最长回文子串。关于manacher算法网上有很多讲解,我不再赘述。但是我看大部分讲解都没有解释为什么manacher算法的复杂度是O(n),我尝试着解释一下。代码的关键在这里:dp[i]=line>i?min(dp[mark*2-i],line-i):1;其中dp[i]表示以i为中心回文串向左右扩张的长度;line表示当前检索的回文串的最右边界(原创 2016-11-16 16:24:21 · 345 阅读 · 0 评论 -
hdu 4513 吉哥系列故事——完美队形II(最大回文子串-manacher算法)
题意:求序列最大回文子串,且子串左侧必须单调非递增。我就是看这道题需要O(n)的复杂度才能过,所以特意学习了一下manacher算法。跟hdu3068一样,扫描的时候比较一下值的大小即可。#include#include#define N 200010int q_in[N],q[N],dp[N];int mark,line;int ans;int min(int x,int原创 2016-11-16 17:24:20 · 407 阅读 · 0 评论 -
排序算法:堆排序
之前想把经典的排序算法都写一遍,最后没有写堆排序和希尔排序,现在给补一下。堆的概念:一个完全二叉树,只要任一节点都满足a[father]>=a[left_son]&&a[father]>=a[right_son],那么就称之为大顶堆,如果将>=改为堆排序的思想:对于一个长度为n的序列建堆,因为堆的顶部是最大或最小值,堆顶即为最大值,将改点取走,再对剩下的n-1个点建堆,堆顶则为次大值。逐次原创 2017-02-13 11:57:32 · 275 阅读 · 0 评论 -
排序算法:希尔排序
这应该是最后一篇写排序算法的博客吧。希尔排序:逐次分割序列,每次对其中一小段进行插入排序。在数组基本有序的情况下,插入排序可以有很好的效率,通过这种方式来提高排序效率。思路上跟归并排序挺像的,都是分割成较小的子序列,对子序列排序,再逐渐扩大子序列的长度,直至子序列长度等于原序列本身。不同的地方是,分割的时候归并排序的子序列是紧邻的,希尔排序的子序列是有一个间隔的;希尔排序通过缩小间隔值,一原创 2017-02-13 15:08:23 · 273 阅读 · 0 评论 -
hdu 3397 Sequence operation(线段树)
这道题当年在大学的时候就卡得我痛不欲生,我一直觉得自己思路是对的,我第一次提交是在2013-08-03 05:17:00,然后从凌晨五点开始做,当时一直做不对。我觉得我的思路没错啊。之后这道题一直是我的一个心病,后来有空就去看一眼,想想是哪儿错了,就刚才2017-03-03 17:14:23,过了快四年,我突然看到代码里的错误了,然后AC。 哈哈! 不知道csdn抽什么风,原创 2017-03-03 17:27:16 · 323 阅读 · 1 评论 -
hdu 3308 LCIS(线段树,测试数据好坑!)
线段树区间合并模板题。第一次写区间合并,花了我好久,按照惯例,我依旧是奔着1A去的。结果提交RE。各种修改,各种反思,就是找不到什么地方越界了。最后我想了许久,突然想起来我测试数据的时候直接复制粘贴题目给的数据的时候,数据后面有一个空格……我修改了一下,用字符串读入,A了!我就操了!这也行?!测试数据后面加空格?后面还是读取的字符!#include#include#define N原创 2013-07-20 20:41:48 · 1058 阅读 · 0 评论 -
排序算法:归并排序
归并排序:步骤一、对序列按照坐标中间值划分为左半部分和有半部分(这点和快速排序不同,归并排序按照坐标选择,与元素本身无关),对两边分别重复此操作,知道每个细分的小序列长度为1。步骤二、将细分的已经有序的序列合并。简单来说就是一个递归加合并的操作,跟线段树非常相似(完全一模一样有没有?)。相对于快速排序来说,实现起来倒是很方便。#include#include#define N原创 2014-03-21 09:24:42 · 560 阅读 · 0 评论 -
hdu 2846 Repository(字典树,内存限制的好厉害)
下午的时候我和yyf已经放弃了这道题,结果吃完饭的时候gby告诉我们他把这道题A了。他看错了数据,已经有思路了没说出来……其实我们仨都把数据看成十万了。这道题只有一个测试数据,结果内存消耗竟然快6WK。我在结构体内部申请的指针开到三十就MLE了,开到26勉勉强强过了。思路:把每一个单词都看成ln(单词的长度)个单词,依次去掉第一位加入树中统计,为了防止统计多次(比如说:ababab),原创 2013-07-24 20:01:29 · 1305 阅读 · 0 评论 -
hdu 1251 统计难题(字典树)
整天写线段树,换一个口味试试。这道题就差把题目改成字典树了。这道题的测试数据很大,我看最后AC的时候内存是四万多K……#include#include#includestruct node{ node *a[27]; int cnt;};node *root;void InsertTree(char s[]){ int ln,i; ln=strlen(s);原创 2013-07-21 19:00:35 · 518 阅读 · 0 评论 -
hdu 1671 Phone List(字典树)
知道bug的时候我眼泪掉下来。。。我的第一道字典树,看了字典树的注意事项和实现方式,我写这道题的时候格外认真,就是奔着1A去的。结果这是几A来着?第一遍写的时候提交MLA,我看了一下,是因为我释放内存的函数写的有问题,‘==’写成了‘=’。修改之后提交wa,这个我就像不明白了,我可是测试了很多组数据的。之后又尝试性的做了一个小小地修改,再次提交还是wa。然后是各种思考bug,想了好久突原创 2013-07-17 22:51:40 · 838 阅读 · 0 评论 -
hdu 1232 畅通工程(并查集)
复习一下并查集的内容。#include#includeint mark[1005];int find(int x){ while(x!=mark[x]) x=mark[x]; return x;}int main(){ int n,m; int x,y; int i; int ans; while(scanf("%d",&n),n) { scanf("原创 2013-03-24 02:36:18 · 473 阅读 · 0 评论 -
hdu 1272 小希的迷宫(并查集)
代码最后要检查一下所有的数据是不是都在一棵树上。#include#define N 100001int mark[N],rank[N];struct shuju{ int x,y;}a[100005];int find(int x){ while(x!=mark[x]) x=mark[x]; return x;}void Union(int x,int y){原创 2013-03-24 14:42:45 · 450 阅读 · 0 评论 -
hdu 2112 HDU Today(最短路+字典树)
这题有点儿恶趣味了。1、起点和终点可能是同一点。2、起点和终点可能根本不会在图里出现。#include#include#include#include#define N 155#define inf 0x3f3f3f3fint map[N][N],dis[N],vis[N];int cnt;char s1[N],s2[N];struct node{ int原创 2013-12-02 21:32:11 · 587 阅读 · 0 评论 -
排序算法:冒泡排序&插入排序
冒泡排序:步骤1、从第一个元素开始与它的下一个元素比较,如果比下一个元素大,交换两个元素的位置;如果小于或者相等,保持不变。每次交换可以保证有序的队列长度增加1。步骤2、重复步骤1,一直到整个队列全部有序为止。比如对于序列5,4,3,2,1,经过第一次交换后队列改变为:4,3,2,1,5;第二次交换后队列改变为:3,2,1,4,5,;每一次队尾的有序序列的长度都会增加1。#incl原创 2014-03-18 15:39:43 · 596 阅读 · 0 评论 -
排序算法:选择排序
选择排序的过程跟冒泡非常相似。冒泡每一轮的调整是将元素逐个往后(往前)移动,选择排序则是先找到目标元素的下表,然后直接将其和目标位置进行交换。以下数据摘自百度百科:初始关键字 [49 38 65 97 76 13 27 49]第一趟排序后 13 [38 65 97 76 49 27 49]第二趟排序后 13 27 [65 97 76 49 38 49]第三趟原创 2014-03-18 16:13:12 · 680 阅读 · 0 评论 -
排序算法:快速排序
快速排序:步骤一、选取某个值(可以是序列中任意值,不一定必须是最大值和最小值的平均值)作为中间值,降序列分成左右两个部分,左边所有的值都比右边的小。步骤二、重复步骤一,知道细分的序列中只有少于一个值为止(有可能序列中一个值都没有)。原理非常简单,但是在怎么实现上让我想了好久,一直没有想明白该怎么实现,直到看了这篇博客。博客中原博主的挖坑填数+分治法的说法非常生动。#includ原创 2014-03-20 14:36:02 · 616 阅读 · 0 评论