- 博客(65)
- 收藏
- 关注
原创 POJ1743 Musical Theme
后缀数组典型题。给定一个字符串,求最长重复子串,这两个子串不能重叠。计算height数组,然后二分答案k,连续的height >= k的区间中sa相差最大的差若超过k,则符合条件。#include #include #include using namespace std;const int maxn = 20005;int a[maxn], s[max
2013-10-23 00:29:15
512
原创 SOJ3866 红色病毒II
也是指数型母函数,跟前面那道一样一样的。AC个数之和为偶数,翻译一下就是AC个数均为奇数或者AC个数均是偶数。写成指数型母函数就是(e^x)^2 * ((e^x+e^-x)/2)^2 + (e^x)^2 * ((e^x-e^-x)/2)^2化简后可以得到答案的公式:2*4^(n-1)#include #define ll long longconst int
2013-10-21 23:51:24
731
原创 SOJ3865 红色病毒
指数型母函数的经典题。在泰勒公式中,令x0 = 0,得到麦克劳林级数:e^x = 1 + x/1! + x^2/2! + x^3/3! + ... (1)令x = -x,可得:e^-x = 1 - x/1! + x^2/2! - x^3/3! + ... (2)(1)(2)式相加,即可得到所有偶数项,即:(e^x + e^-x) / 2 = 1 + x^2/
2013-10-21 23:32:26
707
原创 HDU4035 Maze
神一般的概率DP基本的状态转移方程:dp[i] = k[i]*dp[1] + e[i]*0 + (1-k[i]-e[i])/d[i]* ( ∑( dp[j]+1 ); (i, j相连)把原图看成一棵树,可以把每一项的状态转移方程化简成只与其父节点有关。然后写出来的话会比较复杂= =我说的可能不够清楚,详见kuangbin大神的http://www.cnblogs
2013-10-08 23:02:03
500
原创 HDU4089 Activation
概率DP状态转移方程:dp[i][1] = p1*dp[i][1] + dp[i][i]*p2 + p4dp[i][j] = p1*dp[i][j] + dp[i][j-1]*p2 + dp[i-1][j-1]*p3+p4 (jdp[i][j] = p1*dp[i][j] + dp[i][j-1]*p2 + dp[i-1][j-1]*p3 (j>k)一层一层的处理,
2013-10-07 16:22:44
508
原创 ZOJ3582 Back to the Past
概率DP用dp[i][j]表示当前两边分别有i和j个亮的,此时到目标的期望。有:dp[i][j] = 0 (i >= m && j >= m)dp[i][j] = 1 + sigma(dp[i+a][j+b] * p) ,a>=0 && b>=0,p根据组合数算一下就行了,带环移项消一下也就行了幸好这题对精度要求不太高= =#include #include #
2013-10-05 00:05:23
523
原创 ZOJ3587 Marlon's String
KMP,正着处理一遍,反着处理一遍,但是用递归的方式一个一个统计会超时,最后累加一下比较好= =#include #include #include #include #include #include #include #include #include #include #include #include #include #include #inc
2013-10-04 23:59:40
554
原创 HDU3716 Jenga
其实是水题啊,不过就是没人做= =概率+记忆化搜索在叠叠乐基础规则之上,已知叠叠乐中每一层只有以上四种状态是稳定的,并且在总高度为n时,积木移动成功的概率为p = b - n * d。题意就是求在最优策略下,A的胜率。(具体一点请自行读题)如图,只有A和C两个状态是有后继状态的,所以说我们只需要记录这两个状态的个数就行了。(所以题目中的概率才用b和d表示么=
2013-10-02 11:49:49
767
原创 POJ2528 Mayor's posters
区间线段树水题,离散化怒A= =我觉得最后算答案哪里应该不用再单独算的= =#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #i
2013-09-26 15:30:53
509
原创 HDU2795 Billboard
线段树水题,需要稍微思考一下。手写线段树感觉好爽!!!线段树好神!!!#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #incl
2013-09-25 22:52:12
464
原创 SOJ2099 Search Nearest Neighbour
KD树水题,大家就不要看了= =#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace
2013-09-25 19:43:50
600
原创 CF1C Ancient Berland Circus
对于这种水题,我只想说:为啥精度只有开1e-3才能过= =(计算几何水题,大家就不要看了= =)#include #include #include #include #include #include #include #include #include #include #include #include
2013-09-24 00:47:52
740
原创 HDU4752 Polygon
其实从算法上并不是太难,但是细节很多,时间很紧,精度很阴险,我就不多吐槽了= =基本的结题思路就是先求出曲线和多边形的所有交点,将交点排序,然后求交点之间在多边形内部的长度和。我一开始在排序后对每两个相邻交点计算他们的曲线中点在不在多边形内,结果O(n^2)肯定TLE= =然后封哥指点说在多边形内的线段是交替出现的,然后我就去改啊,然后就TLE了= =(怎么还是TLE?
2013-09-21 20:40:34
1098
原创 SOJ3296 Windy's S
字符串的最小表示法算法复杂度O(n)也可用于判断字符串的循环同构//#pragma comment(linker,"/STACK:102400000,102400000")#include #include #include #include #include #include #include #include #include #include u
2013-09-17 13:37:02
700
3
原创 HDU4745 Two Rabbits
把模型抽象出来,其实就是在一个环中找一个最长的子环,并且这个子环是轴对称的。从对称轴上一点出发,向两个方向运动可以正好满足题意,并且可以证明如果抽选择的子环不是对称的话,其一定不是最长的。倍长原序列,在新序列中求所有区间的最长回文子序列长度。答案就等于所有长度为n的区间中最长回文的长度 和 所有长度为n-1的区间中最长回文的长度+1(在轴上的两点可不同) 中最大的那个。
2013-09-15 22:05:35
1222
原创 HDU1890 Robotic Sort
我不是code的生产者,我只是code的搬运工。(感谢cxlove世界冠军提供参考代码,我已经成功从中提取了模板= =)好吧,其实这个除了上一题的模板之外完全是我自己写的,连那个remove函数都是现编的= =要注意的是数据可能有重复,需要处理一下。splay中使用rotate函数,用时296MS:#include #include #include
2013-08-30 01:09:47
670
原创 POJ3468 A Simple Problem with Integers
我不是code的生产者,我只是code的搬运工。(咱们码农有力量!)全当学写lazy标记了= =PS:说到这个lazy标记,从线段树开始我就不会lazy标记啊,直接导致我一年来再也不写线段树了= =(还好我有两个线段树达人队友,妈妈再也不用担心我的线段树了~)#include #include #include #include #include #inclu
2013-08-29 23:06:46
541
原创 HDU4347 The Closest M Points
n维空间最近m点的问题,应该算是经典模型了。n维:采用KD树解决,轮流沿着各个维度把点分成两部分(还有一种思路是把跨度最大的那一维度分成两部分,这一种方法是更优的,但是实现起来稍微复杂一点点。而均摊下来两种方法的复杂度相同,所以这里只采用了轮流的建树法),建树即可。m点:最近点和最近m点的问题是一样的。#include #include #include
2013-08-28 18:45:51
1011
原创 HDU4697 Convex hull
X姐说没那么难写。但是A完这题,我觉得我可以去死了= =该死的精度问题。先去睡觉,题解明天再写。#pragma comment(linker,"/STACK:102400000,102400000")#include #include #include #include #include #include #include #include #includ
2013-08-23 02:30:10
733
转载 计算几何【转】
这两天在学习计算几何,随便说说自己的学习过程吧。 基本的叉积、点积和凸包等东西就不多说什么了,网上一搜一大堆,切一些题目基本熟悉了就差不多了。 一些基本的题目可以自己搜索,比如这个blog:http://blog.sina.com.cn/s/blog_49c5866c0100f3om.html 接下来,研究了半平面交,思想方法看07年朱泽园的国家队论文,模板代码参考自
2013-08-21 12:33:04
663
原创 HDU4637 Rain on your Fat brother
任意门: http://acm.hdu.edu.cn/showproblem.php?pid=4637假设所有雨点都不动,那么可以看做人物向着左上角匀速移动。求出人物运动的轨迹(一条线段)与所有雨滴的交线段,然后求线段并就可以了。题目其实很简单,但是很烦啊,记录一下代码。#pragma comment(linker,"/STACK:102400000,102
2013-08-20 11:19:10
520
转载 几何图形及计算公式查询
转自http://chenhaifeng.blog.edu.cn/2007/32311.html平面图形名称符号周长C和面积S正方形a—边长 C=4aS=a2长方形a和b-边长 C=2(a+b)S=ab三角形a,b,c-三边长h-a边上的高s-周长的一半A,B,C-内角其中s=(a+b+c)/2
2013-08-18 15:23:23
957
原创 HDU4682 The Happy Triangles
二分法的好题,推荐!题目见http://acm.hdu.edu.cn/showproblem.php?pid=4682解法需要先证明两个结论,这两个结论都是基于最优策略的,可以证明若不满足这两个条件中的任一个都可以通过调整使其变得更优。1. 每个三角形都应该把最短边与底线重合。2. 存在重叠时,所有三角形之间的交点以及三角形与左右两条竖线的交点应该在同一水平线上。(证明
2013-08-17 21:45:23
1051
原创 HDU4675 GCD of Sequence
设g(n)为最大公约数等于n的方案数(即本题答案),f(d)为公约数含有d的方案数。则有关系:f(d) = sigma(d|n, g(n))本题关键即在于如何求f(d)。如果没有(恰好K个数与序列a中不同)这个条件的话,那么函数f(d)就很好求,f(d) = [M/d] ^ N但是本题有这个条件(废话),所以我们需要对函数f的求法做一点改进。先用O(n sqrt n)的
2013-08-14 01:12:35
730
原创 SRM588 KeyDungeonDiv1
任意门:http://community.topcoder.com/stat?c=problem_statement&pm=12714很典型的状压DP。如果已经通过的是门A和门B的话,不论先过A还是先过B,用掉的钥匙数和得到的钥匙数是一样的。但是请注意:使用的白钥匙可能不一样。换而言之,用于开红色门的白钥匙数可能不一样(同理,用于开绿门的白钥匙数也不一样,只需统计一个就可以了)
2013-08-13 11:22:17
788
原创 HDU4576 Robot
很经典的矩阵快速幂题。注意,如果裸写的话时间复杂度会是O(n^4*logm),显然不行。所以,我写这篇题解(?明明就是一个tip一样的东西= =)就是想说:1. 对称矩阵的乘积还是对称矩阵。(重点是下一个↓↓↓)2. 这个类似于三对角矩阵一样的矩阵,它的每一行都可由前一行往右平移一位得到,所以只用存储一行就可以存储整个矩阵,并且也只用计算一行就可以得到整个矩阵。
2013-08-11 02:31:59
1279
原创 ZOJ3435 Ideal Puzzle Bobble
mobius反演的入门题。首先,先抄一遍mobius反演:已知 f(n) = sigma(d|n, g(d))那么 g(n) = sigma(d|n, mu(d)*f(n/d))mobius反演的另一种形式:在某一范围内,已知 f(n) = sigma(n|d, g(d))那么 g(n) = sigma(n|d, mu(d)*f(d/n))本题的难度其实
2013-08-04 23:39:59
841
原创 HDU4633 Who's Aunt Zhang
根据Burnside引理,等价类数目等于所有 f 的不动点数目 C ( f ) 的平均值。本题模型共有4大类置换,共24种:1. 不做任何旋转 K ^ (54 + 12 + 8)2. 绕相对面中心的轴转1) 90度 K ^ (15 + 3 + 2) * 31) 180度 K ^ (28 + 6 + 4) * 31) 270度 K ^ (15 + 3 + 2)
2013-08-01 21:55:24
950
原创 HDU4609 3-idiots
多校那时候我还年轻,没能理解FFT,只知道它能够进行信号在时域和频域上的转换。现在学习了FFT在多项式乘法上的应用,感觉对FFT的理解更深了一层。要搞懂FFT,首先要理解卷积。先抄一下wikiped
2013-07-30 17:45:32
692
原创 POJ3243 Clever Y
对于任意正整数x,z,p,求满足x ^ y = z (mod p) 的最小的y对Babystep_Giantstep算法的扩展详细证明请参考http://blog.csdn.net/tsaid/article/details/7354716#include #include #include using namespace std;typedef long long l
2013-07-26 14:57:48
541
原创 SOJ4293 Product
统计大集合A中所有含奇数个元素的子集S中元素乘积的和!(我已经尽量说的很不饶了= =)设ans1是A中所有奇数集元素积的和(要求的答案),ans2是A中所有偶数集元素积的和。赋初值,令ans1=0,ans2=1(方便每次从空集变成单元素集的过程)每个奇数集加入一个元素x后会变成偶数集,其元素积的和会乘以x,偶数集亦然。这样每次加入x操作有:ans1=ans1+ans2*x
2013-07-24 01:20:42
418
原创 CF17C Balance
定义压缩串为把某字符串中所有连续相同的字母压缩成一个所形成的的串。如aabbaaaabcc -> ababc如果原串是A,变形后的串为B,那么A的压缩串A‘和B的压缩串B',存在这样的关系:B'一定是A’的字串。预处理统计A中每个字符后面(包括自身,因为可以不断重复自己)最近的'a''b''c'分别在哪个位置,用next[i][0-2]记录。从1-n生成新串B,用dp[i][a][b]
2013-07-22 21:40:21
775
原创 CF17B Hierarchy
注意到只有q更大的人才能成为q较小的人的父节点,所以整个树的根节点一定是q最大的那个人。把所有人按q从大到小排序,每次加入到图中q最大的人,因为所有q比他大的人都已经加入到图中,所以所有有可能成为其父节点的人都在图中了。反言之,如果图中存在可能成为其父节点的人,则计算其中cost最小的那个加入到ans中,反之如果不存在,则无解,ans=-1。#include #include
2013-07-22 21:24:10
537
原创 CF15C Industrial Nim
做这题的时候我发现一个关于异或运算的性质:0-3,4-7,……从模4余0到模4余3每4个连续数的nim和均为0!然后这题就是很简单的裸nim题了。#include #include #include #include #include #include #include #include #include #include #include #include
2013-07-22 21:15:46
756
原创 POJ1185 炮兵阵地
这道题用DP做有两种解法,一是三进制表示,我认为这种应该是比较理想的,但是比较难写。另一种就是二进制,不过需要注意的是,每一行的状态最多只有60种,所以60*60*60*100加上一些剪枝勉强可以过= =用dp[i][j][k]表示第i行,上一行的状态是j,这一行的状态是k。则转移到下一行时有,dp[i+1][k][l]=max(dp[i+1][k][l], dp[i][j][k]+pop
2013-07-20 18:58:21
502
原创 HDU3068 最长回文
O(n)求最长回文串用辅助数组p记录以每个字符为中心得最长回文串的信息。在字符间插入'#',可以奇偶两种情况同时考虑。具体算法部分参考#include #include #include #include #include #include #include #include #include #include #include #include
2013-07-20 18:15:42
456
原创 POJ2411 Mondriaan's Dream
用1*2的小长方形铺满整个n*m的大长方形吧!问有多少种方案。用dp[i][j]表示第i行(从1开始计数)之前的所有行均已铺满,第i行目前铺的形状是j(j的二进制表示,比如01011001)。填满第i行有三种方法,用横的小长方形和用竖的小长方形,或者兼用之。枚举所有可以填横的小长方形的方法,设此时改行形状为xx,若某一位置不够(为0),则可用竖的小长方形填补,形成的新一行的形状为((1
2013-07-20 14:51:06
506
原创 POJ3590 The shuffle Problem
http://poj.org/problem?id=3590题目的意思就是求最大的置换周期。很容易知道,整个序列的置换周期等于其中所有小循环的阶的最小公倍数,DP求之。#include #include const int maxn = 110;int T,n;int dp[maxn][maxn],ds[maxn][maxn],ans[maxn],anss[max
2013-07-17 14:04:29
582
原创 CF11D A Simple Task
http://codeforces.com/problemset/problem/11/D一看以为是图论吓尿了,其实是状态压缩DP。感谢frog神提供思路。dp[i][j]表示当前链包含结点k(iff 1假设链i的起点是其最低位1的结点,在找到起点之后判断末尾是否能与起点相连。若能,再判断是不是自环,两点环。最后,由于延伸过程是双向的,即对于一个环来说,顺时针和逆时针都被算
2013-07-16 21:56:40
604
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人