
算法竞赛入门经典
文章平均质量分 61
STILLxjy
不要让任何人打乱你生活的节奏
展开
-
无根树转有根树
问题描述: 输入n个节点的无根树的各条边,并指定一个根节点,要求把树转换为有根树,输出各个节点的父节点的编号(编号从0开始);(n<=1000000) 分析: 首先要存储这个树,很容易想到用邻接矩阵表示,但是邻接矩阵要占用n*n个元素空间,开不下。所以想到了用vector数组; 在记录父节点的过程中,直接用深搜算法即可,在递归的时候记录父节点。(注意要判断v是否为它的父节点,不然会造成无限递原创 2016-04-11 20:49:51 · 1290 阅读 · 0 评论 -
(UVa 11997)K Smallest Sums --多路归并问题,优先队列
题目链接: http://acm.hust.edu.cn/vjudge/problem/18702题意: 有k个数组,每个数组k个元素。在每个数组中取一个元素加起来,有k^k个和。求这些和中最小的k个(重复的值算多次)?分析: 我们先来求两个元素个数为n的且有序的数组A,B的前n个最小值。组合情况有n*n种,但是我们可以我这些和组织成如下有序表: 表1:A1+B1<=A1+B2<=A1+B3原创 2016-07-30 16:48:43 · 627 阅读 · 0 评论 -
(LA 3942)Remember the Word --DP+Trie树
Remember the WordTime Limit: 3000MS 64bit IO Format: %lld & %lluNeal is very curious about combinatorial problems, and now here comes a problem about words. Knowing that Ray has a photographi原创 2016-08-05 19:54:49 · 447 阅读 · 0 评论 -
(LA 4329) Ping Pang --树状数组
题目链接: http://acm.hust.edu.cn/vjudge/problem/13895题意: 一条大街上住着n个乒乓球爱好者,他们经常组织比赛切磋。每个人都有一个技能值,每场比赛需要三个人,两名选手和一名裁判。他们有一个规定,裁判的技能值一定处于两个选手之间,并且也住在两个选手之间。问一共能组织多少场比赛?分析: 考虑第i个人当裁判的情况。假设在a1,..,ai-1中有ci个人技能原创 2016-08-02 20:18:39 · 433 阅读 · 0 评论 -
RMQ问题详解 --Sparse-Table算法实现和线段树实现
RMQ:范围最小值问题 给出有n个元素的数组a1,a2,…,an.设计一个数据结构支持多次查询Query(L,R):计算min(aL,aL+1,…,aR).Sparse-Table算法: 令d[i][j]表示下标从i开始长度为2^j的一段元素中的最小值。所以我们可以得到递推公式: d[i][j]=min(d[i][j-1],d[i+2^j-1][j-1]).可以看出d[i][j]可以有他前面的原创 2016-08-02 20:53:44 · 640 阅读 · 0 评论 -
(uva 11732) "strcmp()" Anyone? (trie+左儿子右兄弟表示法)
题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28438题意:定义了一个strcmp()函数,如图:然后给出n个字符串s(n<=4000,|s|<=1000),问字符串两两调用strcmp函数(总共调用函数n(n-1)/2次)需要执行多少次判断。比如”aaa”和”aaa“需要8次,”that“和”than”需要7次。转载 2016-08-06 18:09:30 · 600 阅读 · 0 评论 -
(LA3026) Period -- KMP again (KMP 模板)
Period Time Limit: 3000MS 64bit IO Format: %lld & %lluFor each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know原创 2016-08-06 18:21:59 · 384 阅读 · 0 评论 -
有向图的强连通分量Kosaraju算法 和 Tarjan算法思维详解及代码模板
有向图的强连通分量 SCC: 在有向图G中,如果两个顶点间相互可达,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通有向图的极大强连通子图,称为强连通分量(strongly connected components)。如果把每个scc看成一个节点,那么有向图中所有的scc就构成了一个scc图Kosaraju算法的思想: 在讲原创 2017-04-18 19:40:05 · 3440 阅读 · 1 评论 -
无向图的割顶和桥,无向图的双连通分量入门详解及模板
割顶和桥:对于无向图G,如果删除某个节点u后,连通分量数目增加,则称u为图的割顶;如果删除某条边后,连通分量数目增加,则称该边为图的桥。对于连通图删除割顶或桥后都会使得图不再连通以下我,我们利用dfs的性质来快速找出一个连通图中的所有的割顶和桥 首先我们要引入”时间戳”这个概念:时间戳:表示在进行dfs时,每个节点被访问的先后顺序。每个节点会被标记两次,分别用pre[],和post[]表示。 例原创 2017-04-14 22:56:11 · 5905 阅读 · 3 评论 -
(UVA 11995) I Can Guess The Data Structure! --抽象数据结构判断
I Can Guess the Data Structure! There is a bag-like data structure, supporting two operations: 1 x Throw an element x into the bag. 2 Take out an element from the bag. Given a sequence of operati原创 2016-07-30 10:30:41 · 706 阅读 · 0 评论 -
(UVa 10054)The Necklace --欧拉回路的判断和输出,DFS
题目链接: http://acm.hust.edu.cn/vjudge/problem/18806问题描述: 有一种由彩色的珠子连接成的项链。每个珠子的两半有两个不同的颜色,相邻的珠子的接触的地方颜色相同。现在有一些零碎的珠子,问是否可以还原成一个项链。颜色由1~50来表示。分析: 这题就是要判断欧拉回路并输出欧拉回路。 判断欧拉回路:若每个顶点的度都为偶数,则存在欧拉回路。 输出欧拉回路原创 2016-07-28 15:57:40 · 799 阅读 · 0 评论 -
选择问题-第k小元素
问题描述: 在一个无序的序列T中,寻找第k小的元素; 分析: 将序列T进行升序排列,下标为K的元素即为第k小的数。(下标从1开始)。考虑到快速排序的过程,每次进行一次Partition()函数,就将比轴线值小的数放在轴线左边,比轴线大的值放在轴线右边,即可确定一个轴线值的下标位置S。下面分三种情况: 1:s==k 即已经找到下表为k的数,return T[s]; 2 : s < k 即第k原创 2016-03-27 13:24:34 · 1367 阅读 · 0 评论 -
表达式树
问题描述:《算法竞赛入门经典2 p353》 将一个表达式如(a+b*(c-d)-e/f)表示成一个二叉树。即给出中序序列求二叉树。 分析: 找出最后计算的运算符,它是整个树的根,然后递归处理; 找出最后计算的运算符:最后计算的运算符一定在括号外,并且当括号外有+-时一定为最右边一个+-运算符,如果没有+-,则一定是最右边的一个*/运算符。 代码:#include <iostream>#i原创 2016-04-12 13:22:10 · 885 阅读 · 0 评论 -
反片语(Ananagrams,Uva 156)
问题描述: 输入一些单词(以“#”为结束标志),找出所有满足如下条件的单词:该单词不能通过字母的重排,得到输入文本中的另一个单词。在判断是否满足条件是不分大小写,但是在输出时应保留输入时的大小写,按字典序进行排列(所有大写字母在所有小写字母前面)。 分析: 利用map#include <iostream>#include <string>#include <cctype>#include原创 2016-04-12 20:36:06 · 720 阅读 · 0 评论 -
安迪的第一个字典
问题描述: 输入一个文本(以”#”结束),找出所有的不同的单词(连续的字母序列),按字典序输出。单词不区分大小写。 分析: 由于string已经定义了<运算符所以直接用set即可。由于输入时会有非字母字符,所以将所有非字母字符变成空格,然后再用stringstream得到各个单词。 代码:#include <iostream>#include <string>#include <cstr原创 2016-04-12 20:45:04 · 1529 阅读 · 0 评论 -
一道简单题
问题描述: 给出一个包含N个整数的数组,你需要回答若干询问。每次询问两个整数k和v,输出从左到右第k个v的下标(编号从1开始)。 输入包含两组多组数据。每组数据第一行为两个整数n和m,(1<=n,m<=100000),第二行包括n个不超过1000000的整数,即待查询数组。以下m行,每行包括两个整数k,v。 对于每个查询输出查询结果,若果不存在输出0. 分析: 由于每个数需要记录出现时的下原创 2016-05-02 23:39:37 · 1364 阅读 · 0 评论 -
优先队列详解
优先队列: 顾名思义,首先它是一个队列,但是它强调了“优先”二字,所以,已经不能算是一般意义上的队列了,它的“优先”意指取队首元素时,有一定的选择性,即根据元素的属性选择某一项值最优的出队~ 百度百科上这样描述的: 优先级队列 是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素 优先队列的类定义 优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对转载 2016-06-17 17:52:24 · 441 阅读 · 0 评论 -
(VUa 11624)Fire! -- BFS
题目连接: http://acm.hust.edu.cn/vjudge/problem/28833题意: 你的任务是帮助Joe走出一个大火蔓延的迷宫。joe每分钟可以走上下左右四个方向的相邻格子,而所有着火的格子每分钟都会向四周扩散。迷宫有些障碍joe和火到不能到达,我们认为当joe走到边界格子时就已经出了迷宫了。问最少的走出迷宫的时间,如果不能则输出:IMPOSSIBLE分析: 如果没有火,原创 2016-07-28 12:24:20 · 520 阅读 · 0 评论 -
(UVa 10047) The Monocycle -- BFS 4维状态
题目链接: http://acm.hust.edu.cn/vjudge/problem/19491问题描述: 独轮车是一种仅有一个轮子的特殊自行车。他的轮子被等分为5份,分别上5中不同的颜色。现在有一个独轮车在一个M*N的网格上,每个网格的大小恰好使当车骑到下一个格子时,轮子恰好转过一个扇形,即恰好达到下一个颜色。车每秒可以在当前方向上前进一格,或者左转和右转(不移动,且颜色不变)。刚开始时他面原创 2016-07-28 14:06:53 · 452 阅读 · 0 评论 -
Trie树静态建树模板
关于Trie的静态建树的讲解可以看白书,很简单的#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1000010;const int kind = 26;struct Trie{ int ch[maxn][ki原创 2017-05-12 12:20:04 · 684 阅读 · 0 评论