自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 收藏
  • 关注

原创 Trie树专题

Trie树专题下面是查询字符串的模板,可以通过做题练习来灵活修改。1、静态建树 速度快,但可能会浪费内存 有的题用动态建树会超时,静态就不超时struct trie{ int next[maxnode][size];//小写字母size就是26,十进制就是10,二进制就是2 bool end[maxnode]; int sz; trie()

2016-02-20 23:36:27 421

原创 树状数组专题

树状数组专题 基础和原理就不多说了,做了一些树状数组的题,现在根据题目来大概分一下类。1、一维 单点修改 区间查询这是树状数组最基础的用法,query函数的判断条件如果习惯写成while(x)的请注意一下,如果x为负数的话,会造成死循环。要将数据偏移到1下标开始。void add(int x,int k){ while(x<=n) {

2016-02-16 11:33:40 826 3

原创 UVA 10129 Play on Words

题意:输入n个单词,将这些单词按顺序排列,使得相邻两个单词尾首字母相同(acm  malform),问这样的序列是否存在。思路:每个字母可以看做一个点,一个单词的首尾字母可以看错是首字母的点指向尾字母的点的一条有向边。这样问题就变为在有向图中寻找一条欧拉路/欧拉回路(不连成环,所以回不回到起点都可以)。可以根据图的连通性(并查集或dfs)和点的度数(不存在奇点,或者存在两个奇点,且一个

2016-02-28 13:52:36 267

原创 POJ 2513 Colored Sticks

题目链接:http://poj.org/problem?id=2513题意:有一些木棍,两端染有颜色,问能不能将所有的木棍首尾相连,并且使得每个连接处的位置颜色一致(如果a和b首尾相连,a尾部的颜色和b首部的颜色相同)。现在给出每根木棍首尾的颜色,求解问题。思路:把每个颜色看做一个点,一根木棍看做两个点之间的边,那么问题就转化为图中是否有欧拉路( 1、 0/2个点的度数

2016-02-28 10:37:25 205

原创 算法竞赛入门经典第六章习题

习题6-1:http://blog.csdn.net/chy20142109/article/details/50756253习题6-2:http://blog.csdn.net/chy20142109/article/details/50756265习题6-3:http://blog.csdn.net/chy20142109/article/details/50756

2016-02-28 10:17:42 697

原创 UVA 246 10-20-30

题意:有52张牌摞在一起作为总牌堆,有7个牌堆都为空,现在不断从总牌堆中取牌按照顺序从左往右放到牌堆上。如果当前牌堆放上一张牌后满足(1、前两张加上最后一张牌 2、第一张牌加最后两张牌 3、最后三张牌)按照顺序判断,如果点数之和为10/20/30,就把这三张牌放回总牌堆底下,一直操作到这个牌堆不满足这三个条件为止。如果一个牌堆为空,那么就不再向这个牌堆上放牌。最后有三种情况:1、总牌堆为空 2、7

2016-02-27 18:28:04 494

原创 UVA 127 "Accordian" Patience

题意:有52张牌从左往右放在桌子上,一开始每张牌算一个牌堆。如果两张牌可以匹配当且仅当这两张牌的花色或者点数相同。现在每个牌堆的最上面的牌可以和它左边的第一个牌堆上的第一张牌或左边第三个牌堆上的第一张牌匹配,如果匹配成功,就把这张牌放到对应的牌堆上。如果都能匹配,优先去和左边第三个牌堆匹配。存在多个牌堆可以发生匹配的情况,优先去执行靠左的牌堆。如果一个牌堆为空,这个牌堆就不再用了,右边所有牌都向左

2016-02-27 18:26:24 355

原创 UVA 806 Spatial Structures

题意:用四叉树可以表示黑白图像,对于一个黑白图像等分四部分,左上、右上、左下、右下。如果一个区域同为一种颜色,那么就不再分叉。现在从根节点开始,走左上记1、右上记2、左下记3、右下记4。一个节点的路径就可以用这些数连起来构成一个五进制的数。输入有两种情况,一种是给n*n的0/1点阵,输出所有黑色节点的路径(10进制);一种是给出黑色节点的路径(10进制),输出n*n的点阵。思路:对于第一种

2016-02-27 18:22:34 832

原创 UVA 804 Petri Net Simulation

题意:现在有一些 places  transitions 和 tokens(place里面的黑点,一个黑点算一个token),现在给出连接情况,place和transition交错连接。如果一个transition的每个输入端(place)里面都至少有一个token,那么这个transition就可以fire一下,fire之后这个transition每个输入端place里面的token都会减少一个

2016-02-27 18:20:19 1132

原创 UVA 1600 Patrol Robot

题意:一个机器人从m*n的格子的左上角(1,1)走到右下角(m,n),格子是空地或者障碍,机器人每次可以向四个方向走一步,但是不能穿越连续k个障碍,求最短步数。思路:bfs求最短路。考虑一种情况,对于一个位置,可能先连续穿越障碍去接近这个点,步数最小。但是如果这个点四周都是障碍,而现在连续穿越的障碍数已经达到上限了,这条路就没法继续走下去了。反之如果一开始绕一下路使得到达该点时连续穿越

2016-02-27 18:17:48 847

原创 UVA 439 Knight Moves

题意:8*8的棋盘,给定一个起点和终点,求马至少需要多少步可以从起点跳到终点。思路:bfs模板。注意坐标判重,判断坐标越界。#include #include #include #include using namespace std;#define Clean(x,y) memset(x,y,sizeof(x))const int dx[8] = {-2,-2

2016-02-27 18:15:56 272

原创 UVA 536 Tree Recovery

题意:给出二叉树的先序遍历和中序遍历,输出后序遍历。思路:先序遍历顺序为:根左右,中序遍历顺序为:左根右。也就是说,在中序遍历中找到先序遍历的第一个字符位置,可以将中序遍历分为左右两部分。按照这个思想,我们就可以用递归去解决这个问题。所谓后序遍历,就是先处理左右分支,最后输出根节点。#include #include #include #include #inclu

2016-02-27 18:04:56 316

原创 UVA 712 S-Trees

题意:给一颗满二叉树,只有叶子节点有值。现在从根节点出发,走左儿子记0,走右儿子记1,给出一个路线,求最后到达的叶子节点的值是多少。思路:按照路线模拟输出即可。如果是一个n层的满二叉树。最底层的第一个节点编号为2^(n-1),一共有2^(n-1)个叶子节点。将原编号为 2^(n-1) 到 2^n-1的叶子节点的值存到数组[1]到[2^(n-1)]中,按照路线求出叶子编号直接输出即可

2016-02-27 18:02:38 331

原创 UVA 673 Parentheses Balance

题意:给一个含'('、')'、'['、']'的括号序列,判断是否合法。思路:用栈去判断一下。1、如果遇到左括号就入栈。2、如果遇到右括号   1)栈空  不合法   2)栈顶括号不与当前右括号匹配  不合法   3)匹配  出栈,继续执行。序列扫一遍之后,如果栈为空则序列合法,否则就有多余的括号。#include #include #includ

2016-02-27 18:00:53 333

原创 HDU 4099/UVA 12333 Revenge of Fibonacci

hdu题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4099题意:给出一个不超过40长度的前缀,在前10W项fib项数中查找最小满足前缀的项数。思路:因为fib数列增长很快,而且查询长度不超过40,我们可以考虑用高精度计算然后用字典树维护每一项的前40位。大概计算55位长度就够了(因为取前40位,后面造成的误差不影响前40

2016-02-27 11:52:13 412

原创 UVA 12166 Equilibrium Mobile

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=3318题意:给出一个天平的信息,天平可嵌套。问至少修改多少个点的权值可以使得这个天平达到平衡。思路:参考了别人的想法,一个很重要的信息,假设一个点在不

2016-02-24 22:50:39 406

原创 CodeForces 282E Sausage Maximization

题目链接:http://codeforces.com/contest/282/problem/E题意:给一个长度为n的整数序列,现在要你截取这个序列的一个前缀和一个后缀(前缀和后缀不能相交),使得前缀和后缀的异或值最大。前缀和后缀的异或值为前缀序列中的数和后缀序列中的数,异或的结果,比如,某个序列的前缀为1、 2、 4 ,后缀为8、 16,那么它们的异或值为31.前缀和后缀可以为空

2016-02-20 21:33:39 526

原创 POJ 3764 The xor-longest Path

题目链接:http://poj.org/problem?id=3764题意:给出一棵树,每条路径都有一个权值。选择一条路(不用一定包含叶子节点),使得这些权值异或之后结果最大。思路:x^y = ( x^z ) ^ ( y^z ),如果先计算出来所有点到1号节点的异或路径距离。那么求任意x,y两点的异或距离就可以表示为x到1的距离异或上y到1的距离,中间重复的值会互相抵消

2016-02-20 12:37:33 398

原创 HDU 5269 ZYB loves Xor I

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5269题意:给n个数,求所有的lowbit( a[i] xor a[j] )之和,i,j∈[1,n]lowbit是一个数在二进制表示下的第一个1所在位的权值。思路:首先是求所有点对,而且自己和自己算出来是0不用考虑,那么对于一个数,我们就只求这个数到它前面所有点的答案,最

2016-02-20 12:26:16 503

原创 POJ 2001 Shortest Prefixes

题目链接:http://poj.org/problem?id=2001题意:给n个单词,对于每个单词求出一个前缀,这个前缀不能是其他单词的前缀,只能用来唯一表示这个单词,而且使得前缀长度最短。思路:建一棵trie树,对于每个字母节点都进行计数。那么对于一个单词求最短唯一前缀,只需从每个单词开头字母开始去访问这棵树,在第一个计数节点为1的地方停止输出即可。#inclu

2016-02-20 11:55:02 303

原创 POJ 3630 Phone List

题目链接:http://poj.org/problem?id=3630题意:给一些字符串,问这些字符串是否存在一个字符串是另一个字符串前缀的情况。思路:trie树解决字符串前缀问题。我们把每个单词x加入trie树的时候考虑两种情况:(1) 是否存在已加进去的单词y是x的前缀。(2) 是否存在已加进去的单词y,x是y的前缀。我们对每个单词的结尾字母节点进行标记。

2016-02-20 11:43:39 270

原创 POJ 1056 IMMEDIATE DECODABILITY

题目链接:http://poj.org/problem?id=1056题意:给一些由0/1构成的编码,问问它们是不是存在某个编码为另一个编码的前缀。思路:trie树解决字符串前缀问题。我们把每个单词x加入trie树的时候考虑两种情况:(1) 是否存在已加进去的单词y是x的前缀。(2) 是否存在已加进去的单词y,x是y的前缀。我们对每个单词的结尾字母节点进

2016-02-20 11:35:08 290

原创 HDU 1247 Hat’s Words

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1247题意:给出一些单词,输出所有的复合单词,复合单词是指由两个单词连接而成,而这两个单词也是给出范围内的。思路:考虑用trie树去查找单词,先将所有单词都插入进去。对于一个单词是不是复合单词,枚举这个单词中间断开位置,在trie树中去查找前后两部分即可。当然也可以用map直

2016-02-20 11:30:49 286

原创 POJ 2503 Babelfish

题目链接:http://poj.org/problem?id=2503题意:给一个词典,格式为单词x对应单词y,现在输入一些单词y,输出各自对应的单词x。思路:建一棵trie树,在每个单词的结尾字母节点处附上单词y。然后查找的时候直接输出结尾字母节点的单词即可。或者也可以用map水一下。trie树代码#include #include #incl

2016-02-20 11:23:40 409

原创 HDU 1251 统计难题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251题意:给出一些单词,统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀)。思路:建trie树,记录每个字母的经过次数。如果以某个字符串为前缀,我们在树上按照这个字符串走到最后一个字母的位置,答案就是最后一个字母的经过次数。#include

2016-02-20 11:17:51 293

原创 HDU 4825 Xor Sum

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825题意:有n个数,每次询问给出一个数s,在n个数里面找出一个数k,使得s xor k的结果最大。思路:数的范围不超过2^32,我们可以把每个数固定为二进制下的33位,每一位的权重为2^0到2^32,不足的高位用0补。我们建一棵从高位到低位的trie树,先把n个数加进去。对

2016-02-20 11:12:45 311

原创 POJ 3468 A Simple Problem with Integers

题目链接:http://poj.org/problem?id=3468题意:有n个数,将一个区间上的数都加上一个值,或者查询一个区间的和。思路:线段树或者树状数组模板。树状数组专题链接:http://blog.csdn.net/chy20142109/article/details/50673749#include #include #i

2016-02-16 13:27:24 291

原创 POJ 2155 Matrix

题目链接:http://poj.org/problem?id=2155题意:给一个二维矩阵,每次一个操作,将一个矩形范围内的值改变一次,或者查询一个点的值。思路:二维树状数组模板题。树状数组专题链接:http://blog.csdn.net/chy20142109/article/details/50673749#include #incl

2016-02-16 13:23:17 277

原创 POJ 1195 Mobile phones

题目链接:http://poj.org/problem?id=1195题意:给一个二维矩阵,每次在一个点上增加一个值,或者求一个矩形范围内的和。思路:二维树状数组模板,查询的时候,如果我们query(x2,y2)是求的从(1,1,)到(x2,y2)的所有和。所以答案是q(x2,y2)-q(x2,y1-1)-q(x1-1,y2)+q(x1-1,y1-1)树

2016-02-16 13:20:24 320

原创 HDU 1556 Color the ball

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556题意:有n个数,编号为1到n,每次一个操作 a b,表示区间[a,b]内的数都记一次,最后输出每个数记过几次。思路:n的范围是10W,平方模拟的算法会超时。我们要优化每次对区间的操作,如果对区间[3,5]操作一次,x[3]++,x[6]--。那么我们观察前六个数的区间和

2016-02-16 13:18:27 293

原创 POJ 2309 BST

题目链接:http://poj.org/problem?id=2309题意:好的,让我们来用一下原图,就是这样一个二叉树,给你一个节点,让你求这个节点和其子节点中,编号最大的和最小的,比如求12的就是 9和15。思路:让我们先把这些编号用二进制来表示。找一下规律,发现每个数在第几层是由它后面有几个0决定的而且一个节点在范围内属于中间的那个数,左右

2016-02-16 13:10:34 346

原创 POJ 3321 Apple Tree

题目链接: http://poj.org/problem?id=3321题意:给一棵树,每个节点有一个编号,告诉你这棵树的构造。可以将一个节点的值改变,或者求一个节点及其所有子节点的和。思路:如果按照题意去模拟的话,时间复杂度是不稳定的,当这棵树为链时,就会超时。我们可以试着用树状数组来解决这个问题,我们将树的节点看做一个个直线上的点,我们要考虑查询的时候一个节点及其子

2016-02-16 12:27:15 314

原创 POJ 1990 MooFest

题目链接:http://poj.org/problem?id=1990题意:有n个奶牛站成一排,每只奶牛都有两个值,v和pos,如果两只奶牛i和j想传话,需要消耗max(v[i],v[j]) * | pos[i]-pos[j] |现在求n个奶牛之间互相都传话一次,一共需要消耗多少?思思路:答案是n*(n-1)/2个数的和,但是如果我们一个个求的话,会超时。首先,我们

2016-02-16 12:02:15 280

原创 HDU 1541 Starts

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541题意:给出n个星星的二维坐标,而且坐标是唯一的。每个星星有一个level,是x,y坐标都不超过它本身的星星数量和。最后求每个level(0到n-1)的星星的数量。思路:题目明确说了,输入时以y为第一关键字升序排列,以x为第二关键字升序排列。也就是说,处理到第i颗星星时,前i

2016-02-13 23:49:36 303

原创 POJ 2182 Lost Cows

题意:有n个编号为1到n,排列错位的数。现在告诉你每个位置上的数前面有多少个编号比它小的数,要求输出每个位置上的数的编号。思路:如果我们从最后一个位置开始推,可以发现,最后一个位置的编号就是前面比它小的数的个数加一。就可以从最后一个往前,一个个的推出来,但是假设一个位置前面有5个比它小的数,它的编号不一定是6,因为1到5有可能排在后面,所以不参与计数。那么我们就可以用一个树状数组来维护

2016-02-13 23:43:36 339

原创 POJ 2481 Cows

题意:有n个奶牛,每个都有一个区间[L,R],如果奶牛i的区间是奶牛j区间的真子集,那么说j比i强壮。现在告诉每只奶牛的区间,问对于每一只奶牛,有多少只奶牛比它强壮。思路:我们将奶牛按照L为第一关键字升序,R为第二关键字降序,那么对于排好序的奶牛来说,它前面的奶牛都是左边界小于等于它的,那么我们用树状数组查找一下右边界有多少不小于它的即可。如果两只奶牛区间一样,那么直接赋值一下上次

2016-02-13 23:36:24 323

原创 POJ 3067 Japan

题意:日本的东西海岸分别有n,m个城市,现在有k条线路将东西岸的城市连接起来,求有多少个线路交叉点。思路:这道题的本质是统计逆序对,我们按照东岸编号先排个序,那么假设当前这条线路是东-西是 x - y。首先考虑东海岸编号互不相同,如果之前的线路中,有西海岸的城市编号大于y,就会产生一个交叉点。因为之前的线路中,东海岸的编号都是小于x,所以必然会交叉。所以我们排好序之后,只看西海岸的编号统计

2016-02-13 23:32:52 377

原创 UVA 12504 Updating a Dictionary

题意:给出新旧两个格式为(key:value)的字典,输出前后的变化,包括增加的、减少的、仅value值发生变化三种情况。思路:题意说key和value都可能很长,又没有前导零和负号,所以我们可以建两个map来记录新旧字典。三种情况我们都可以用map.find来解决。(1)新增键:我们遍历新字典,如果在旧字典里没有找到这个key,就输出。(2)删除键:我们遍历旧字典,如果在新字典里

2016-02-11 20:08:57 618

原创 算法竞赛入门经典第五章习题

先写一点我认为重要的Priority_queue set map 等使用struct类型时,必须重载<号。定义模板如下:struct node{ int a,b; node(int x = 0,int y = 0):a(x),b(y){} bool operator<(const node& rhs) const { if ( a == rh

2016-02-11 10:02:21 903

原创 UVA 1596 Bug Hunt

题意:给出一段程序,输出第一个出现bug的位置。程序有两个格式:一种是定义一个数组,并规定数组大小;一种是对数组元素进行赋值。 Bug有两种:一种是数组越界,一种是使用未初始化的变量。思路:模拟判断如果是第一种语句,就给丢进map给个编号并记录数组大小。第二种语句用递归判断一下,因为可以嵌套类似这样a[a[1]]。#include #include #include

2016-02-11 09:37:58 838

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除