POJ
文章平均质量分 76
sdj222555
这个作者很懒,什么都没留下…
展开
-
POJ 3724 Find the parameter 二分
这道题可以说卡精度卡到了极致,比较时eps竟然开到10才AC的,让我试了十几次,实际上做商跟1比较是最好的方法。/*ID: sdj22251PROG: calfflacLANG: C++*/#include #include #include #include原创 2011-08-19 11:35:56 · 607 阅读 · 0 评论 -
POJ 3974 Palindrome 回文串
求最长回文串 由于数据大 需要O(n)的算法 Manacher算法这个算法有一个很巧妙的地方,它把奇数的回文串和偶数的回文串统一起来考虑了。这一点一直是在做回文串问题中时比较烦的地方。这个算法还有一个很好的地方就是充分利用了字符匹配的特殊性,避免了大量不必要的原创 2011-08-15 22:53:35 · 3476 阅读 · 0 评论 -
POJ 3993 Not So Flat After All
原来就是对两个数分别因数分解,然后分别放到两个集合里,求合并后的集合的大小。再求每个数与另一个集合中该数的幂级数之差,如果另一个集合中没有这个数,就相当于这个集合中这个数的幂级数是0,最后把这些差的绝对值相加就是结果。/*ID: sdj22251PROG: calff原创 2011-08-17 16:22:09 · 881 阅读 · 0 评论 -
POJ 3903 Stock Exchange 最长上升子序列
利用了二分的思想来找已经放进去的第一个比读入元素大的位置,然后替换一下就行,如果读入的数比头上的数目还大,那么更新头部,加入一个新的数,最后这个数组的大小就是最长的上升子序列了,复杂度大约nlogn,比传统的n2快了不少;/*ID: sdj22251PROG: cal原创 2011-08-15 22:11:50 · 980 阅读 · 0 评论 -
POJ 3908 Quick answer 并查集
本题是并查集的运用,在删除操作时,除了该删除的点外其他连接关系不变,那么具体操作就将这个点变成新的点即可,用一个id数组更新id即可。/*ID: sdj22251PROG: calfflacLANG: C++*/#include #include #include原创 2011-08-16 14:39:49 · 854 阅读 · 0 评论 -
POJ 3909 Lucky numbers 深搜预存+二分
先用深搜将所有的lucky numbers 搜出来,然后再根据这些再深搜出所有的very lucky numbers,总共约35W个;最后输出数据时用二分查找进行计算看别人的解题报告后,我也用了unique这个函数,这个函数具有去重功能,但实际上并不是删除重复的,而是将重复的原创 2011-08-17 14:32:24 · 1322 阅读 · 2 评论 -
POJ 3668 Game of Lines
如果用set来做的话,这个题就变的非常非常水了, 完全不用考虑精度问题。用一个结构体存储直线,然后插到集合里,最后输出集合的大小即可。然后求公约数的时候有个负数问题,后来发现我多虑了。负数取模用%运算的时候,首先是两边都原创 2011-08-20 14:39:10 · 1179 阅读 · 0 评论 -
POJ 3544 Journey with Pigs 贪心
首先根据村庄离A的距离和单位路程的花费,以及当地猪肉的价格,我们可以把到达每一个村庄卖猪单位重量赚的钱算出来。然后,按收益降序排列,再把猪的重量降序排序,这时,根据排序不等式,就可以达到最大盈利了。所谓排序不等式:排序不等式(sequence inequality,又原创 2011-08-22 21:54:34 · 1065 阅读 · 0 评论 -
POJ 3735 Training little cats
很神奇的一道矩阵题,这也说明了矩阵的神奇之处。 构造矩阵的方法,我是想不出来了,只能从网上找了找思路。因m的数据范围较大,用矩阵连乘。构建矩阵模型,peanut[N] = {0,0,。。。。0,1}:即前n个数为0,最后一个数取1matrix[N][N],初始化原创 2011-10-19 15:26:44 · 1033 阅读 · 0 评论 -
POJ 3734 Blocks 矩阵乘法
依旧是神奇的矩阵乘法,构思很巧妙,虽说看着很简单,但是确实没练过矩阵题,所以就没这个意识去想到状态转移矩阵了。依旧是参考的别人的思路,也坚定了我要学好矩阵的决心。有四种颜色,其中红色和绿色必须是偶数,那么我们可以分四种状态,一,红为偶数,绿为偶数二,红为奇数,绿为偶数,三,红为偶数,绿为奇数四,红为奇数,绿为奇数那么我们构造一个矩阵2 1 1 01 2 0 1原创 2011-10-20 10:32:30 · 1200 阅读 · 0 评论 -
POJ 2063 完全背包
话说POJ这完全背包的题并不多,而且这个也不是很裸,因为股票的价格都是1000的倍数,所以价格都除以1000,整个背包的容量也除以1000, 这样复杂度就降下来了,然后每年的话,由于有收益,所以背包容量还会变化基本原理参考背包问题九讲。其核心部分与0-1背包中里面那层循环是反过来的F[0::V ] = 0for i = 1 to Nfor v = Ci to VF[v] = m原创 2011-10-24 16:44:33 · 1881 阅读 · 0 评论 -
POJ 3895 Cycles of Lanes
题意是求最大环的边数。做这题发现用vector特别好用。DFS即可。/*ID: sdj22251PROG: calfflacLANG: C++*/#include #include #include #include #include #include #include #include #include #include #include #include #i原创 2011-08-18 10:11:18 · 1018 阅读 · 0 评论 -
POJ 多重背包专题
POJ 1014 Dividing这道题用背包做有两种解法,一种是拆分法,另一种是很神的O(VN)的DP法。拆分法:#include #include #include #include #include #include #include #include #include #include #include #include #include #in原创 2011-10-26 21:11:20 · 1648 阅读 · 0 评论 -
poj 2886 Who Gets the Most Candies?
N 个小孩围成一圈,他们被顺时针编号为 1 到 N。每个小孩手中有一个卡片,上面有一个非 0 的数字,游戏从第 K 个小孩开始,他告诉其他小孩他卡片上的数字并离开这个圈,他卡片上的数字 A 表明了下一个离开的小孩,如果 A 是大于 0 的,则下个离开的是左手边第 A 个,如果是小于 0 的,则是右手边的第 -A 个小孩。游戏将直到所有小孩都离开,在游戏中,第 p 个离开的小孩将得到 F(p) 个糖原创 2011-10-16 21:21:01 · 1791 阅读 · 0 评论 -
POJ 2828 Buy Tickets
本题使用了一个巧妙的构造方法,首先,如果按顺序插队的话,序列是无法确定的,因为插队的时候被插的人的位置会改变。所以可以倒过来想,最后一个人的位置必然可以确定,然后接着是倒数第二的,依次的位置就都出来了。然后线段树的功能是统计区间内可插的位置数吧,我们可以先想想叶子节点,如果这个位置被确定了,那么该叶子节点的值应该变为0了,就相当于有了一个新的队列,是不包含值为0的叶子节点的队列,那么再插的时候原创 2011-10-15 22:28:25 · 749 阅读 · 0 评论 -
几道动态规划题目
1. POJ 1080 Human Gene Functions这道题我们需要分3种情况,假设两个串分为s1, s2设dp[i][j]表示i长度的s1 和j长度的s2所匹配得的最大分值则有以下几种情况1)s1取s1[i],s2取s2[j] ,dp[i][j] = dp[i - 1][j - 1] + score(s1[i], s2[j])2)原创 2012-01-12 19:39:14 · 610 阅读 · 0 评论 -
POJ 1141 Brackets Sequence
这道题是黑书上的一个例题,不过没有给出最终输出的串,但是可以通过递归把最后的串输出首先我们定义d[i][j] 为从i位置到j位置的串匹配所需的最少步数那么当s[i] = '('&& s[j] =')' 或者s[i] = '['&&s[j] =']'时,显然d[i][j] = minI(d[i][j], d[ i + 1][ j - 1])然后当s[i]和s[j]不匹配的时候,就要对串进原创 2012-01-14 15:56:46 · 522 阅读 · 0 评论 -
POJ 2823 Sliding Window 单调队列+输入输出外挂
题解:来自http://hi.baidu.com/wzyjerry/blog/item/3838f48af40e40cafd1f1089.html题目大意:给你一个长度为n的数组,求从左到右的每个相邻的长度为k的区间内数的最大值和最小值。解题方法:这道题数据较大(n最大为10^6)所以用纯模拟O(n*k)是铁定挂掉的,写的好的线段树可以卡时间过去。这里我们选择更为合适的单调队列解决原创 2012-01-23 15:25:50 · 1093 阅读 · 0 评论 -
POJ 1129 Channel Allocation 平面图染色问题
这题大意就是,给出一个平面图,对顶点进行染色, 相邻顶点是不能用同一种颜色。由四色定理,我们知道任何平面图的色数是不超过4的,所以运用这个进行暴搜,当然这题的数据不强,DFS或者贪心搞都能过/*ID: sdj22251PROG: subsetLANG: C++*/#include #include #include #include #include #includ原创 2012-01-23 19:13:36 · 931 阅读 · 0 评论 -
POJ 3070 Fibonacci 矩阵快速幂
题意很明确,求第m个斐波那契数MOD10000的结果题目连矩阵都构造好了,就是 1 11 0然后对这个求幂就行了/*ID: sdj22251PROG: subsetLANG: C++*/#include #include #include #include #include #include #include #include #include原创 2012-01-23 20:31:54 · 2926 阅读 · 0 评论 -
POJ 1942 Paths on a Grid 组合数
这道题其实就是组合数,题目给了m,n,实际上路径的长度已经确定了,就是m+n,但在这些路径中必须有m个向右走的,n个向上走的,这样才能到达终点这就变成了求组合数C(m + n, n) 其中n必须是m,n中较小的那个,这样速度还快些在求组合数的时候,要避免的是越界问题,所以每次我都是先除,然后再乘,除的时候也不能直接除,一定要求了公约数后再除,这样才是整除。/*ID: sdj22251原创 2012-01-24 13:09:46 · 907 阅读 · 0 评论 -
POJ 1026 Cipher 置换群
题目大意就是给出1~n的置换序列, 然后给出一个整数k,和一个串问置换k次后的串是什么样子的。首先,给出的串的长度是小于等于n的,不足的位置要补上空格。然后置换k次,不是直接就循环着置换,因为置换内的每个循环都是有一定长度的,如果超过这个长度的置换次数,必然会和前面的某个状态一样,所以对每个循环,如果长度为len,循环内的元素只需要置换k%len次即可。第一次看置换群得概念,不原创 2012-01-29 15:36:33 · 1076 阅读 · 0 评论 -
POJ 1095 Trees Made to Order 递归
不得不说这是一道非常之好的递归题目首先,要知道节点数为n的二叉树的种类是卡特兰数具体解题报告见http://blog.csdn.net/lvlu911/article/details/5425974原创 2012-02-05 15:15:17 · 956 阅读 · 0 评论 -
POJ 2411 Mondriaan's Dream 状态压缩DP
第一次看状态压缩DP啊。题目大意是给出一个 h*w 的空棋盘,1题目的数据规模很小,棋盘的每个格子有覆盖和未覆盖两种,正好对应二进制中的 1 和 0 。所以可以用一个二进制数表示一行棋盘的状态,这称之为状态压缩,然后对其进行相应的位运算,表示相应的操作。然后参考了http://www.cppblog.com/sdfond/archive/2011/03/17/91761.html原创 2012-02-05 19:40:11 · 901 阅读 · 0 评论 -
POJ 1010 1020 DFS+剪枝
之所以要写这两题的解题报告,原因就是这两题是比较好的搜索题,必须记录一下。另外,最近做题状态也不行,看见题目后没想法,然后看别人解题报告了,突然发现自己想过这方面,但是没深入去想,然后就做不出来了。1.POJ 1010 题意晦涩难懂。从网上找了一个稍微能说清楚的题意 题意: 给出n种邮票,每种邮票有自己的面值(面值可能重复) 指定m种“总面值”,对每种“总面值”,原创 2012-02-08 00:36:58 · 2554 阅读 · 0 评论 -
POJ 1185 炮兵阵地 状态压缩DP
http://hi.baidu.com/brabt_king/blog/item/38396a8ad00b9414c8fc7a2f.html比较好的解题报告大概如此了。不过没有提供代码。代码参考了http://www.chenyajun.com/2010/02/20/4511哎,羞愧,还是参考了才做出来的。这种先预处理可能状态,然后再枚举的思想是重要的。根据题目中的条件,每行的状态实际原创 2012-02-08 21:26:48 · 1158 阅读 · 0 评论 -
POJ 1222 EXTENDED LIGHTS OUT 枚举 || 高斯消元
题目大意就不说了,就是把棋盘上的1全变0即可如果枚举的话,看似有2的30次方中可能,其实不是。实际上只需要枚举第一行的状态即可,再往后,如果想要解决问题,必须根据第一行的状态推下去。对于每个位置,如果上一行的这一列有1,必然这个按键要按下去,不然不可能达到要求的结果。枚举代码如下,直接使用二进制枚举/*ID: sdj22251PROG: subsetLANG: C++*原创 2012-02-09 21:19:49 · 1122 阅读 · 0 评论 -
POJ 2084 卡特兰数
卡特兰数百科名片卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。原理 令h(1)=1,h(2)=1,catalan数满足递归式: h(n)= h(1)*h(n-1)+h(2)*h(n-2) + ... + h(n-1)原创 2012-02-15 12:31:02 · 3626 阅读 · 0 评论 -
POJ 3604 Professor Ben
这题的大意就是 给出一个数n, 找到它所有的因子, 然后把这些(因子的因子数)的立方和求出来。题目的时限虽然很宽,但是数据很BT。首先,公式必须找出来。证明如下:先将n质因数分解成形如n = a ^m * b ^ p * c ^q *........;那么要求的结果为函数g(x)的值;我们以n有2个质因数为例子;g(n) = g(a ^m * b ^p ) ;设求因原创 2011-08-20 14:21:51 · 1564 阅读 · 1 评论 -
树形DP 加分二叉树 and HDU 1520 Anniversary party
题目描述设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第j个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数若某个子树为主,规定其原创 2012-02-19 15:12:38 · 1328 阅读 · 0 评论 -
线段树几题 --------- 成段更新
线段树的成段更新,需要用到延迟标记就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候否则就会退化到O(n)的复杂度1.hdu 1698 Just a Hook大意是每次把某一段所有数的值改变成某个值,最后求总和。#include #include #include #include #include #include原创 2011-10-29 11:32:00 · 970 阅读 · 0 评论 -
POJ 1436 Horizontally Visible Segments 线段树
题目大意是,给出了很多条平行于y轴的线段,然后定义,两条线段能互相‘看见’的条件是,两条线段能由一条水平线连接,且这条水平线不能跟其他的所有线段有交点。而题目要求的是,3个线段能互相看见,这个条件下有多少组不同的。然后就能明显的感觉到是区间覆盖问题了。但是有一个细节问题,就是中间的水平线不一定经过整点,所以即使这个区间的所有点都被覆盖,也不能说其就不能穿过一条线,于是,可以将所有线段的长度原创 2012-02-28 21:56:51 · 1112 阅读 · 1 评论 -
POJ 3225 Help with Intervals 线段树
这是道比较经典的线段树 详情可以参考http://www.notonlysuccess.com/index.php/segment-tree-complete/ sha崽大神的bolg但需要注意的就是区间到点的转化了。 要保证转化后的区间满足集合的基本性质,比如删除一些区间后相应的点被删除,有可能会点删除完了,区间却还有,这就不符合了。所以就要把每个点乘以二之类的,还有一些细节,注意原创 2012-02-28 18:06:52 · 759 阅读 · 0 评论 -
POJ 2991 Crane 线段树
这个题比较神奇。大意就是有一个长杆,杆上有一些关节点,可以转动,然后每次操作就是将某个关节点的角度变成某个角度,最后求末尾的坐标。线段树每个结点存的信息是,这一段末尾的x坐标,y坐标,以及该段与y轴的夹角,其中x,y坐标是与上一段线段的相对坐标。这样的好处是显而易见的。注意,这个与y轴的夹角是该段线段顺时针旋转至初始状态的角度,如下图然后每次更新的时候需要注意,是把某个结点后的所有原创 2012-03-01 21:06:22 · 1509 阅读 · 0 评论 -
hdu 3308 LCIS 线段树 区间合并
好题一个,区间合并问题大意就是问某个区间内最长连续上升序列的长度跟POJ 3667 Hotel 差不多,貌似还更简单一些,因为只有单点更新用到了lmx, rmx, mx,表示从左端点往右的连续长度,右端点往左的连续长度,区间内的最大连续长度/*ID: sdj22251PROG: inflateLANG: C++*/#include #include #include原创 2012-03-04 16:15:17 · 996 阅读 · 0 评论 -
POJ 3667 Hotel 线段树区间合并
这道题应该算是比较经典的线段树了题意是:这座巨型宾馆在一条超长走廊上有N(1 ≤ N ≤ 50000)个排成一排的房间,每个房间都能欣赏到苏必利尔湖的好景色。现在所有的房间都是空的。现在Bessie等旅客们正在不断地发出订房和退房要求。你需要接受M(1 ≤ M 每条指令的第一个数字为1或2。如果是1,后面将有一个整数D表示顾客要预定的房间数。注意,这些房间必须是连续原创 2012-03-04 00:48:55 · 858 阅读 · 0 评论 -
POJ 2110 Mountain Walking 二分+搜索
看到此题,第一反应是枚举差值,然后DFS,后来一想,二分也可以,而且速度加快很多,就果断二分之了刚开始写的比较挫,直接用的差值在地图里搜,维护一个最大值,一个最小值,然后如果找不到路就回溯,这样果断TLE了。后来一想,不用这么搞,回溯太费时间了,就对每个差值,枚举下界,然后在范围内的才能走,这就不需要回溯了,就相当于最裸的走迷宫了。/*ID: sdj22251PROG: subse原创 2012-03-05 14:14:29 · 1442 阅读 · 0 评论 -
POJ 2892 hdu 1540 Tunnel Warfare 线段树 (区间合并)
这个题目的大意就是,求某个点所在的最长连续区间区间合并此类题目的通常做法都是开3个变量,区间最大值,从左往右的连续区间长度,从右往左的连续区间长度。然后更新的时候更新到点就行了。查询的时候,只需要知道,某个点所在的连续区间,一定是由某个线段的左儿子的从右往左的连续区间和右儿子的从左往右的连续区间构成的/*ID: sdj22251PROG: subsetLANG:原创 2012-03-06 00:27:54 · 983 阅读 · 0 评论 -
POJ 2407 Relatives 欧拉函数
题意很明确,比n小且与n互质的数的个数欧拉函数就是用来解决这个的首先要知道 【定理】正整数n(n≥2)可以唯一分解成素数乘积,即:n =p[1]^r1 * p[2] ^r2 * p[3]^r3. *...* p[s]^rs其次欧拉函数有两个性质,可以用来编程,单独求phi函数:① Ø(m) = m ( 1- 1/p[1]) ( 1- 1/p[2])…( 1-原创 2012-01-24 15:23:44 · 812 阅读 · 0 评论 -
POJ 1177 Picture 矩形周长并
题意很简单,但是周长并比面积并又稍微麻烦了一些这时候要开一个numseg存储竖边的个数。再开lbd,rbd分别表示边界,这样是为了帮助删除重合的边/*ID: sdj22251PROG: subsetLANG: C++*/#include #include #include #include #include #include #include #in原创 2012-03-24 21:51:26 · 972 阅读 · 0 评论