数据结构
飘过的小牛
不停成长才会洞悉成功的奥妙,fighting!
展开
-
士兵杀敌(树状数组-插点问线)
描述南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的。小工是南将军手下的军师,南将军经常想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧。南将军的某次询问之后士兵i可能又杀敌q人,之后南将军再询问的时候,需要考虑到新增的杀敌数。输入只有一组测试数据第原创 2011-07-22 19:53:16 · 1411 阅读 · 2 评论 -
Is it a tree?
题目:http://poj.org/problem?id=1308大意:给你一堆树枝,让你判断最后能不能构成一棵树。思路:根据树的定义判断即可树:1.入度只能为1或者0(根结点)2.根结点只有一个3.出度可以有多个代码如下:#include#include#include#include#includeusing namespace原创 2011-08-11 18:34:24 · 1106 阅读 · 0 评论 -
POJ-1002 487-3279
题目链接:http://poj.org/problem?id=1002题目大意:给你一些由大写字母、数字、和'-'组成的字符串,并给出大写字母各自对应的数字。求出转换为数字后重复的次数。解题思路:简单模拟题,用map处理一下就行了。不过在POJ上数据规模有点大,用字符串老超时,还得换成整数形式才A了。。。第一种是string(TLE了),第二种转换为整数代码如下: #原创 2011-11-16 10:04:12 · 10195 阅读 · 2 评论 -
HDU-1022 Train Problem I
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1022题目大意:给你2个字符串,第一个字符串str1代表火车的入站顺序,第二个字符串str2代表出站序列,如果str1能满足str2的要求,就输出YES。并输入进站出站的顺序。解题思路:很裸的栈的应用。只要平时好好想过,就可以写出来。因为C++提供了stack可以用,非常方便的。。。原创 2011-11-03 14:47:48 · 1673 阅读 · 0 评论 -
HDU-1075 What Are You Talking About
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075题目大意:给你一本火星词典,每个火星单词对应一个英文单词。然后给你一篇火星文章,要求你翻译成英文。要求如下:如果这个火星单词用英文单词可以表示,就翻译成英文,如果没有这个单词,就原样输出。遇到标点符号或者空格原样输出即可。解题思路:字典树的变形而已。原创 2011-11-05 14:03:21 · 2615 阅读 · 3 评论 -
POJ-2299 Ultra-QuickSort
题目链接:http://poj.org/problem?id=2299题目大意:给你N个数组成的序列,求这个序列的逆序数一共有多少个。这个序列个数不超过100000.解题思路:很经典的一个问题,解决方法有两种:第一种方法是归并排序,第二种方法是树状数组。如果我们要枚举的话,复杂度为o(n*n),铁定TLE,所以要考虑更高效的算法。归并操作中,当取到右边集合的第i个元素时,左原创 2011-12-14 16:49:02 · 1105 阅读 · 0 评论 -
POJ-2352 Stars【树状数组】
题目链接:http://poj.org/problem?id=2352题目大意:给你星星的坐标(y递增,若y相等,x递增),每个星星都有一个等级,规定它的等级就是在它左下方的星星的个数。输入所有星星后,依次输出等级为0到n-1的星星的个数。解题思路:就是统计x前面比它小的星星的个数,符合树状数组最基本的应用。注意的是:树状数组下标为0的位置不可用,所以我们需要在输入x坐标时+1原创 2012-03-24 07:54:38 · 4446 阅读 · 0 评论 -
NYOJ-119 士兵杀敌(三)【RMQ算法】
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=119解题思路:RMQ算法。不会的可以去看看我总结的RMQ算法。http://blog.csdn.net/niushuai666/article/details/6624672代码如下:#include#include#includeusing原创 2012-03-27 21:14:39 · 6234 阅读 · 2 评论 -
POJ-3264 Balanced Lineup【RMQ】
题目链接:http://poj.org/problem?id=3264题目大意:一个农夫有N头牛,每头牛的高度不同,我们需要找出最高的牛和最低的牛的高度差。解题思路:我是用RMQ写的。N为50000,Q为200000,如果我们暴力的话,需要50000*200000=10000000000,需要25s左右.所以我们需要高效的算法,而RMQ正好解决的就是区间最值问题,复杂度为nlo原创 2012-03-28 09:01:13 · 3886 阅读 · 2 评论 -
RMQ实现LCA
RMQ实现LCA。。。。。。。。。。弄了一下午,终于搞定了。#include#include#include#include#include#include#includeusing namespace std;const int N = 100005; //不同结点数const int M = N * 2; //总结点数int visit[M], level[M], f原创 2012-03-30 21:50:31 · 1634 阅读 · 0 评论 -
HDU-4190 Problem D【二分答案】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4190题目大意:有N个城市,M个投票箱。然后是N行,表示每个城市的人口数。现在每个城市所有的人要投票,投票箱的大小可以无限大(投票箱全部相同,大小相等),我们现在要求的是最小的投票箱容纳量。解题思路:如果N == M,则容量肯定为城市人口数最多的那个。如果N 比如 2原创 2012-04-02 17:31:20 · 2749 阅读 · 0 评论 -
表达式求值
写了一个下午,各种纠结,各种问,终于搞明白了。但是自己还是想出来的一点东西的。很爽歪歪的,哈哈。。。先贴第一次的代码:#include#include#include#include#include#includeusing namespace std;char DATA[7][7]={ //运算符优先级判断{'>','>','','>'},{'>','>',''原创 2011-07-28 19:23:48 · 1403 阅读 · 0 评论 -
NYOJ-467 中缀式变后缀式【逆波兰法】
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=467解题思路:经典的逆波兰法求表达式的值,以前是用栈模拟的,但是没有仔细研究,现在对表达式求值方法有了一定的了解。其实表达式求值的通法就是建立一棵表达式树,则,前缀、中缀、后缀表达式分别对应表达式树的前序、中序、后序遍历。则,通过表达式树就可以对这个问题做一个全面的分析了。原创 2012-03-18 19:02:33 · 4634 阅读 · 0 评论 -
POJ-2201 Cartesian Tree【笛卡尔树】
题目链接:http://poj.org/problem?id=2201题目大意:让你构造一棵笛卡尔树。笛卡尔树的节点含有2个值,1个key,一个value,其中key是主键,value是辅键。一棵笛卡尔树就是:key升序,value升序或者降序。类似堆。与treap的区别是:treap的value是随机值,是为了使树更加平衡引进的,而笛卡尔树的value是一个确定的值。结构完全原创 2012-04-05 13:53:48 · 3741 阅读 · 3 评论 -
表达式二叉树
总结了一下常见的表达式求值问题,写了一个模板,输入为中缀式时,用中缀式建立表达式二叉树,可以打印前缀式和后缀式,可以用前缀式计算,也可以用后缀式计算。代码如下:#include#include#include#include#include#include#include#include#include#include#includeusing namespa原创 2012-03-23 10:19:47 · 2021 阅读 · 0 评论 -
NYOJ-63 小猴子下落【满二叉树】
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=63解题思路:很久前做过这道题,是用的模拟法做的。因为这道题数目的测试数据比较少,所以暴力就过了。但是如果测试数据很大时,超时是明显的。因为D今天看到了一种优化,非常巧妙。因为每个小猴子都是从根节点向下,它必然有两种选择:左、右。而且有规律,它前面的两个猴子一定是左,右。原创 2012-04-24 22:00:11 · 2965 阅读 · 1 评论 -
二叉树的创建与遍历(递归创建与遍历)
二叉树的创建与遍历(递归创建与遍历) 代码如下: #include#include#include#define MaxSize 100typedef struct BiNode{ int data; struct BiNode *lchild, *rchild;}BiNode, *BiTree;int TreeCreated = false;int Creat原创 2011-05-16 09:44:00 · 1639 阅读 · 0 评论 -
NYOJ-542 试制品【字典树】
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=542解题思路:省赛的时候就是卡在这里,没能搞出来。下来又仔细想了下,然后很快就把代码打出来了。。。。字符串处理还是不行,以后多练吧。。。。。。我的思路就是用字典树存化学物,然后查反应物是否齐全,齐全的话看是否是反应物,如果不是反应物就加入一个结果数组。之后排序一下就可以了。原创 2012-05-18 23:38:11 · 2536 阅读 · 0 评论 -
Hdu-1671 Phone List
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1671题目大意:给你很多电话号码,判断其中是否存在号码是其他号码的前缀,若存在,输出NO.否则输出YES解题思路:很简单的字典树的变形。只需要判断2种情况:1. 9112然后输入9112.911然后输入9112通过这道题,认识了一种灰常巧妙的方法:空插法(自己原创 2011-10-13 19:33:37 · 1394 阅读 · 0 评论 -
Hdu-1800 Flying to the Mars
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1800题目大意:给你一堆士兵的等级,等级高的的士兵可以当等级小的士兵的师傅,一个士兵最多一个师傅(可以没有),一个师傅最多1个徒弟(可以没有),如果是师徒关系,可以用一把扫帚练原创 2011-10-13 21:47:51 · 1774 阅读 · 3 评论 -
树状数组
树状数组是一种非常优雅的数据结构.当要频繁的对数组元素进行修改,同时又要频繁的查询数组内任一区间元素之和的时候,可以考虑使用树状数组. 最直接的算法可以在O(1)时间内完成一次修改,但是需要O(n)时间来进行一次查询.而树状数组的修改和查询均可在O(log(n))的时间内完成.原创 2011-07-22 19:55:55 · 1419 阅读 · 0 评论 -
大数阶乘
思路:用Data数组来存放阶乘的每一位数字,首先令第一位的数值为1,位数为1,然后将每次相乘的乘积存回数组,并循环处理每个数组中超过10的数,若数值超过10,则需要进位,将位数加1,原来的数除以10,商数加前一位数的数值后存回前一位数的数组中,再将余数存回原来位数的数组中。例如求原创 2011-07-27 11:36:40 · 1525 阅读 · 0 评论 -
求递推公式(大数序列)
描述数列A满足An = An-1 + An-2 + An-3, n >= 3 编写程序,给定A0, A1 和 A2, 计算A99输入输入包含多行数据 每行数据包含3个整数A0, A1, A2 (0 数据以EOF结束输出对于输入的每一行输出A99的值样例输入1 1 1样例输出690原创 2011-07-27 16:17:32 · 1640 阅读 · 0 评论 -
大数加法
#include#include#include#include#includeusing namespace std;#define CLR(arr, val) memset(arr, val, sizeof(arr))#define MAX 1010int a原创 2011-07-27 11:38:30 · 10230 阅读 · 5 评论 -
士兵杀敌(树状数组)
南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的。小工是南将军手下的军师,南将军经常想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧。南将军的某次询问之后士兵i可能又杀敌q人,之后南将军再询问的时候,需要考虑到新增的杀敌数。输入只有一组测试数据第一行原创 2011-07-21 17:06:27 · 1427 阅读 · 0 评论 -
二叉树——(先序序列+中序序列)=后序序列
已知二叉树的先序遍历序列和中序遍历序列,求后序遍历序列。 先递归构造二叉树,然后递归得到后序序列。 思路: 先序序列的第一个结点为要构造二叉树的根结点,在中序序列中查找二叉树的根结点,则中序列根结点左边为根结点的左子树的中序序列,右边为根结点的右子树的中序原创 2011-05-11 21:21:00 · 6971 阅读 · 9 评论 -
河南省第四届程序设计大赛--Substring
描述You are given a string input. You are to find the longest substring of input such that the reversal of the substring is also a substring原创 2011-08-04 10:06:37 · 2135 阅读 · 0 评论 -
回文字符串
描述所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。输入第原创 2011-08-04 13:53:39 · 21187 阅读 · 5 评论 -
求最长回文字串的长度
题目描述:输入一个字符串,求出其中最长的回文字串的长度。子串的含义为:在原串中连续出现的字符串片段。回文的含义是:正着看和倒着看相同,如abba和yyxyy。在判断时,应该忽略所有标点符号和空格,且忽略大小写,但输出应保持原样(在回文串的首部和尾部不要输出多余字符)。输入字符原创 2011-08-04 09:20:23 · 1667 阅读 · 1 评论 -
二叉非递归的中序遍历(递归创建)
二叉非递归的中序遍历(递归创建)原创 2011-05-16 10:33:00 · 1188 阅读 · 0 评论 -
士兵杀敌(树状数组-插线问点)
南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战(编号相近的人经常在一块,相互之间比较熟悉),最终他们获得的军功,也将会平分到每个人身上,这样,有时候,计算他们中的哪一个人到底有多少军功就是一个比较困难的事情,军师小工的任务就原创 2011-07-22 19:51:23 · 1687 阅读 · 2 评论 -
滚动数组
滚动数组的作用在于优化空间,主要应用在递推或动态规划中(如01背包问题)。因为DP题目是一个自底向上的扩展过程,我们常常需要用到的是连续的解,前面的解往往可以舍去。所以用滚动数组优化是很有效的。利用滚动数组的话在N很大的情况下可以达到压缩存储的作用。一个简单的例子:斐波那原创 2011-08-11 10:38:12 · 21741 阅读 · 12 评论 -
完全二叉树
有一颗二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从左到右从上到下的编号为1,2,3,·····,2的D次方减1。在结点1处放一个小猴子,它会往下跑。每个内结点上都有一个开关,初始全部关闭,当每次有小猴子跑到一个开关上时,它的状态都会改变,当到达一个内结点时,如果开关关原创 2011-08-11 16:15:37 · 2740 阅读 · 0 评论 -
Train Problem
题意很简单,输入n, str1, str2.n为火车的个数,str1为火车进站的顺序,str2为火车出站的顺序。若能满足条件,则输出火车进站出站的顺序,不能则输出No.思路:赤裸裸的栈的应用。。。由于以前就用栈写过括号匹配和表达式求值,所以虽然思路很清晰,原创 2011-08-16 17:46:11 · 1169 阅读 · 0 评论 -
简单的Hash
例题:给你一堆英文单词(可能有4000000个。用普通查询铁定让你TLE)。找出出现次数最多的,输出这个单词,并输出出现的次数。思路:hash离散数据,进行查询即可。(转化为数字时)1.首先将每个字符串转化为一个数字。2.把离散原创 2011-08-22 12:42:42 · 1546 阅读 · 3 评论 -
Hdu-1251 统计难题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251解题思路:字典树的典型应用——插入,查询。1.插入时候,不是字母结束时将head->count++,而是遇到字母:没出现过:初始化1,表明此次出现出现过:co原创 2011-09-20 18:28:56 · 2660 阅读 · 0 评论 -
后缀表达式
表达式的表示形式有中缀、前缀和后缀3中形式。中缀表达式按操作符的优先级进行计算(后面代码实现只包括+、-、*、\,小括号),即数学运算。 后缀表达式中只有操作数和操作符。操作符在两个操作数之后。它的计算规则非常简单,严格按照从左到右的次序依次执行每一个操作。每遇到一个操作符,就将原创 2011-08-19 20:02:45 · 15659 阅读 · 0 评论 -
括号配对问题
#include#include#include#include#includeusing namespace std;struct sStack{ char sign[10010]; int top;};void initstack(sStack &s原创 2011-07-25 17:17:41 · 24445 阅读 · 14 评论