自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

AC_Arthur的专栏

Always challenge miracles!

  • 博客(24)
  • 收藏
  • 关注

原创 HDU 5617 Jam's maze(DP)

题目链接:点击打开链接题意:给你一个n*n的矩阵。  求从(1,1)走到(n,n)所组成的回文串个数。思路:一开始傻逼把状态写成了d[x][y][s],s表示一个串, 用map存的, 后来发现极不可行, 因为这个状态简直太大了, 包括了s串的所有情况。 只是相当于一个dfs中的剪枝罢了。后来想到, 其实串是不必记录的, 我们只要统计个数, 所以不妨在DP的过程中就判断回文串的情况, 那

2016-01-31 17:06:55 1541

原创 HDU 5616 Jam's balance(暴力枚举子集)

题目链接:点击打开链接题意:有一个没有游标的天平,和n个秤砣,m个询问, 每次一个k,问可否秤出k这个重量。 秤砣可以放两边。思路:因为n最大20, 暴力枚举子集。 因为可以放两边, 所以每次再跑一遍, 减去每个的重量, 将答案保存。比赛的时候忘了限制边界,虽然过了终测数据, 却被人用大数据hack了(RE), 还是自己程序写的不够鲁棒, 思考的不完善。细节参见代码:#incl

2016-01-31 10:29:24 1943 1

原创 HDU 4433 locker(DP)( UVA 1631 - Locker)

题目链接:点击打开链接题意:有一个n位密码锁,每一位都是0~9,可以循环旋转,每次可以让1~3个相邻数字同时往上或者往下旋转一格。 输入初始状态和终止状态,问最少需要转几次。思路: 很显然是个DP题目, 由于每次可以让相邻的1~3个数字同时旋转, 所以状态的表示上就要考虑相邻3个位置。那么可以用d[i][a][b][c]表示当前到了第i位,第i位上当前是a,i+1位是b,i+2位是c。

2016-01-29 13:32:45 1694

原创 HDU Disney's FastPass(状态压缩DP)

题目链接:点击打开链接题意:给你一个n个点的完全图, 图中任意两个点都有直接相连的路,在某些点上可以获得某些景观的入场券,有入场券和没有入场券进入景观要等候的时间不同,有k个景观,要求从1点出发参观完所有景观后回到1的最小花费。思路: 很明显的状态压缩DP, 因为 k 很小,所以可以压缩成一个整数,表示哪些景观已经参观完了。 然后还要表示出当前到了哪个点, 又因为有没有票的等候时间是不同的

2016-01-27 15:32:46 1257 1

原创 HDU 5613 Baby Ming and Binary image(暴力)

题目链接:点击打开链接题意:给一个矩阵A, 要求找到一个01矩阵使得每个格子以及周围8个格子数字之和等于A中对应的格子。要求第一行和最后一行必须都是0套路题, 因为第一行和最后一行已经确定了,并且n很小, 直接二进制枚举子集枚举第一列的情况,然后就可以一列列递推出后面的所有情况了。细节参见代码:#include#include#include#include#include

2016-01-26 15:47:09 1563 2

原创 Codeforces Round #235 (Div. 2) D. Roman and Numbers(状态压缩DP)

题目链接:点击打开链接题意:给你一个数n,要求将n的各个位上的数重新排列(不能有前导0),使得形成的数对m取模为0, 问有多少个这种数。思路:因为n太大了,枚举全排列复杂度高达n!。 因为n最大有18位, 所以可以用状态压缩每一位,表示当前的答案中选了哪些数了。那么不难想到状态d[i][j]表示当前已经把哪些位上的数用了(用集合i表示),且此时余数为j的答案数。 这样递推到所有数都用了

2016-01-25 23:21:14 1463

原创 Codeforces Round #271 (Div. 2) E. Pillars(线段树优化DP)

题目链接:点击打开链接题意:一个n个数的序列,每个数有一个高度值h[i]。 求一个最长子序列,要求相邻两个数满足| h[i] - h[i-1] | >= d。 并要求打印出该序列。类似于最长上升子序列, DP思想很简单, 但是可惜n太大了, 二重循环会超时。 所以要想办法优化掉第二层循环。观察发现, 第二层所做的事情就是在所有满足j= d 的j中找到最大的d[j]。j 把不等式

2016-01-25 17:50:00 1298

原创 1455 - Kingdom(并查集+线段树区间加减)

题目链接:点击打开链接题意:给你n个点,m次询问,每次询问有两种:1. 将城市v和u用一条道路连接起来2.询问用一条水平线能穿过多少个州和这些周中包括的城市数。由于水平线一定是v.5的形式,所以不妨将y坐标乘以2再建立线段树,建两棵线段树,一棵维护大洲的数量,一棵维护城市数。 合并问题交给并查集就好了。另外值得一提的是,对于线段树区间加减这个问题, 其处理方法大家应该更深入

2016-01-25 15:25:11 1370

原创 BZOJ 2038: [2009国家集训队]小Z的袜子(hose)(莫队算法)

题目链接:点击打开链接题意:给n个袜子, 每个袜子有一个颜色。 m次查询,每次查询给一个区间, 求在区间里的任选一对袜子的颜色相同的概率。最经典的莫队算法, 莫队算法有两种, 我刚刚学了第一种:分块。简单来说,假设总区间长度为n,那么将区间分成size = sqrt(n)块,那么每一块的长度为n/size,也是sqrt(n),所以每次只维护一块里的内容和块与块之间的内容,如果改变一个数

2016-01-25 14:40:04 1437

原创 Codeforces Round #340 (Div. 2)题解

题目链接:点击打开链接这次的比赛比较简单, 有些坑点, 主要是考思维的严密性。。。比赛时做出了前4道, 都没有什么算法, 最后一道的通用解法是莫队算法, 现在还不会, 今天就补上。终测挂了C,原来是漏了枚举第一个半径为0的情况, 太失误了。A. Elephant

2016-01-24 14:02:14 863

原创 Educational Codeforces Round 6 E. New Year Tree(DFS序+线段树)

题目链接:点击打开链接题意:给你一棵树,编号1~n,告诉你根结点是1。 每次有两个操作:1,将以v为根的子树的结点全部染成颜色c2,问以v为根的紫书的结点的颜色种类。思路:如果这是一条线段的话, 那么这就是线段树的区间更新问题,而现在是一棵树。因为告诉了根结点是1, 那么这棵树的任意一个结点的子树就是确定的, 所以我们可以用DFS的先序遍历,将所有结点重新编号,因为先序遍历的话

2016-01-22 16:56:41 1145

原创 UVA 11402 - Ahoy, Pirates!(线段树区间更新(标记重叠的处理))

题目链接:点击打开链接题意:有3种区间操作, 将某个区间全部变成1; 将某个区间全部变成0;将某个区间的1变成0, 0变成1。思路:前两个操作就是最基本的区间更新, 用到懒惰标记, 然而第3个操作却有些麻烦, 如果仅仅更新当前这个结点对应的大区间, 那么它所包含的小区间再次更新时就会发生错误, 错误的原因是因为标记的重叠和碰撞。  显然 , 这就是很典型的一个问题, 处理标记碰撞的问题。

2016-01-22 16:26:16 1659

原创 UVA 11525 - Permutation(二分+树状数组)

题目链接:点击打开链接题意:从1~k的所有排列中找到第n个排列, n由公式给出。思路:可以发现, 这个公式就是康托展开公式(康托展开百科:点击打开链接)。 那么s[i]的意思就是i个数中当前数排在第几。如此, 可以用二分+树状数组快速求解, 和一道BC题目神似。细节参见代码:#include#include#include#include#include#includ

2016-01-20 15:55:00 1409

原创 UVA 1232 - SKYLINE(线段树区间更新)

题目链接:点击打开链接题意:依次建n个建筑, 每个建筑有3个信息,宽度:[l, r], 和高度h, 要求求出每个建筑刚建完时最高的部分的区间长度之和。思路:就是维护线段树区间最值, 然而有一个问题, 因为不能更新比当前高度大的区间,所以最坏的情况下要更新到所有点, 因此要加一个懒惰标记,表示该区间是否被完全覆盖,覆盖值是多少。  另外由于是区间问题, 会产生区间端点的麻烦, 所以我们把线段

2016-01-20 10:24:29 1654

原创 UVA 1513 - Movie collection(树状数组)

题目链接:点击打开链接题意: 有编号1~n的n个影碟从上到下排列, 每次取一个影碟并把其放在最上面, 求每次取之前该影碟前面有多少个影碟。取出影碟, 将该位置-1即可, 容易想到用树状数组来维护, 但是还要放到最前面。 其实解决方法很简单, 就是把数组开大一点, 前面留出足够大的空间, 不断更新位置即可。细节参见代码:#include#include#include#incl

2016-01-19 14:52:03 1487

原创 POJ 1436 Horizontally Visible Segments(线段树区间修改)

题目链接:点击打开链接题意:n条竖直线段,如果两条线段之间可见(即可以用一条水平线段连接而不触碰其他线段),则称它们可见。   如果三条线段任意两条都可见, 则称它们为a triangle of segments, 求a triangle of segments的个数思路: 一开始真没想到n^3的复杂度可以过。。。  如果这样的话, 问题的关键就是怎样判断任意两个线段是否可见。那么如果

2016-01-18 12:31:26 1207

原创 POJ 2777 Count Color(线段树区间修改+位运算)

题目链接:点击打开链接题意:两种操作, 一个是区间修改, 一个是区间查询颜色种类数。该题因为要不断的求某个区间的颜色种类数, 我们可以用位运算的并来实现。其他的就是线段树区间修改的经典操作了。细节参见代码:#include#include#include#include#include#include#include#include#include#inclu

2016-01-17 15:07:42 1516

原创 HDU 5607 graph(矩阵优化+概率DP)

该题很容易想到求概率的转移方程:用d[i][j]表示第i

2016-01-13 11:55:35 1340

原创 POJ 3233 Matrix Power Series(矩阵优化)

题目链接:点击打开链接题意:求S[k] = A + A^2 + ..... + A^k利用矩阵快速幂可以很快的求出A矩阵的k次方, 但是该题是求和, 如果还按照原来的方法, 将要计算k次, 复杂度无法承受。我们可以构造一个矩阵   (A  0)                                           (E  E)此时令S[k] = E + A + A

2016-01-12 20:03:17 1293

原创 POJ 3734 Blocks(矩阵优化+DP)

题目链接:点击打开链接题意:个n个方块涂色, 只能涂红黄蓝绿四种颜色,求最终红色和绿色都为偶数的方案数。该题我们可以想到一个递推式 。   设a[i]表示到第i个方块为止红绿是偶数的方案数, b[i]为红绿恰有一个是偶数的方案数, c[i]表示红绿都是奇数的方案数。那么有如下递推可能:递推a[i+1]:1.到第i个为止都是偶数,且第i+1个染成蓝或黄;2.到第i个为止红绿恰有一个是

2016-01-12 18:35:46 1854

原创 HDU 5606 tree(并查集)

题目链接:点击打开链接题意:一棵树,权值只有0和1,找到每个点与之相距最近的点的个数, (包括这个点自己,也就是说,等价于找每个点与之相距为0的点的个数)。用并查集乱搞就行了, 如果边权为0就合并集合, 并在集合的根节点上维护一个信息:该集合中点的个数。细节参见代码:#include#include#include#include#include#include#inc

2016-01-04 11:00:41 1673

原创 POJ 2528 Mayor's posters(线段树区间修改+离散化)

题目链接:点击打开链接题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报。该题是线段树区间修改+离散化的应用。不难想到, 每次对一个最长10^7的线段进行线段树的区间修改, 最后统计。线段树的复杂度是log10^7, 应该不会超时, 但是会超内存。 所以想到要离散化, 将区间端点值有映射成一个尽量小的值。但是该题求的是覆盖情况, 如果按照单纯的点对点的离散化, 那

2016-01-02 11:29:25 1489

原创 POJ 3468 A Simple Problem with Integers(线段树|区间加减&&区间求和)

题目链接:点击打开链接题意:区间加减,区间求和。该题是线段树区间增减和区间求和的模板题。 和区间修改值一样, 在每个结点上维护一个之前加减的值, 那么每次经过一个结点时, 当前结点一定已经拥有所有结点信息。每次递归前下传结点信息,这就是所谓的懒惰标记。 细节参见代码:#include#include#include#include#include#include#i

2016-01-01 21:31:23 2230

原创 HDU 1698 Just a Hook(线段树区间修改)

题目链接:点击打开链接题意: 输入一个n表示一段长度为n的区间,有n个编号为1~n的点,初始值全部为1。 有q个操作, 每个操作有3个数:l,r,v表示将区间l~r的所有元素修改为v。求经过q次修改后的整个区间的值之和。该题是最典型的线段树区间修改问题, 需要用到所谓的懒惰标记。   听起来挺难的,其实非常简单, 其原理如下:因为修改很多值, 如果还是按照原来的更新方法, 每个结点

2016-01-01 20:24:42 4446

空空如也

空空如也

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

TA关注的人

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