- 博客(167)
- 资源 (2)
- 收藏
- 关注
原创 POJ 1743
Musical Theme用了一个星期的时间学了一下后缀数组,然后将罗穗骞论文上的题目都做完。有些题写起来太蛋碎了。。。这道题是论文上的第一道题目,还是蛮简单的。。直接二分长度l,利用height数组将后缀分组,然后判断同组的是不是存在排名第i和j的后缀使得abs(sa[i] - sa[j]) >= l。#include #define maxn 20005int r[m
2013-01-22 22:56:08
517
原创 hdu 3068 and ural 1297
两道回文串的题目,关于回文串的题目有很多种解法。以前写回文串的题目都是采用后缀数组写的,今天无意中搜到了Manacher算法,就学了一下。发现Manacher算法真心简洁,复杂度低编程量低。后缀数组写起来得100来行的题目,Manacher写起来不到30行,无限ORZ。。。关于Manacher算法:http://wenku.baidu.com/view/3031d2d3360cba1aa811da
2013-01-22 22:18:57
529
原创 hdu 3234 Exclusive-OR
Exclusive-OR并查集的好题这里由于每次给定的是xi, xj的关系,并且可以会给定xi的值,所以我们需要3个数组来存储每个值的信息:v[i]表示i的值,p[i]表示i的父亲节点,d[i]表示v[i] ^ v[p[i]] 的值。 首先是并查集的查询操作。这里我们不仅需要压缩路径,更新x与根节点的关系,这里可以由抑或操作的传递性直接计算出来,同时如果已知x或者已知树根的值时,我们
2013-01-14 23:35:14
673
原创 uva 11645 Bits
uva 11645 Bits题目描述:一个数n的二进制表示中连续的11的个数记为f(n),例如f(111) = 2, f(1111) = 3,先给定n求ans = sum (f(i)) 0=解决办法:逐位确定举例说明:n = 1111, x1 = 11**, x2 = *11*, x3 = **11所以答案可以分成如下3个部分,即前两位是11的个数,中间两位是11的个数,后两位是1
2013-01-14 23:03:29
1416
原创 POJ 2356 Find a multiple 鸽巢原理
Find a multiple记sum[i] = (sum[i-1] + num[i])%N,显然对于sum[1...N]肯定会分布在0....N-1中,如果出现sum[i] = 0,显然我们已经找到了一组解;如果没有出现,也就是说sum[1...N]的值都分布在1....N-1中,N个数分布在1....N-1中,显然会出现sum[i] = sum[j], 其中i != j;这
2012-11-21 12:28:45
542
原创 hdu 2825 Wireless Password
Wireless PasswordAC 自动机+ DP题目意思:给定M个子串,现需要构造一个长度为N的串使得该串中至少包含K个子串,求有多少中构造方法。开始的时候错误的理解题目意思:认为只需要包含k个字串(允许重复)。。。现在状态就很容易写了。dp[i][j][k] 长度为i处于j状态的包含的字串的情况为k的可能串的个数, 方程就可以直接得到了,这里就不写了,参看程序。。
2012-11-01 13:55:57
533
原创 hdu 4009 && POJ 3164
做hdu4009学习了最小树形图。关于最小树形图的资料可以参看:最小树形图Transfer water#include #include const int maxn = 1005;struct Edge{ int s, t, w;}edge[maxn*maxn];int ent;//记录边的数量int n, X, Y, Z;struct Point{ i
2012-10-31 14:05:51
567
原创 2-sat 相关问题总结
1.元素关系有以下11种A[x]NOT A[x]A[x] AND A[y]A[x] AND NOT A[y]A[x] OR A[y]A[x] OR NOT A[y]NOT (A[x] AND A[y])NOT (A[x] OR A[y])A[x] XOR A[y]NOT (A[x] XOR A[y])A[x] XOR NOT A[y] And 结果为
2012-10-26 18:33:59
1302
原创 Hdu 4303 Hourai Jeweled
Hourai Jeweled官方题解:从任意一点开始深搜,每颗子树搜索完毕之后向上返回pair每次深搜完一个子节点之后,增加的过这一点的gorgeous边的总分数为: 之前深搜的所有子节点向上返回的边数之和 * 当前子节点返回的分数 + 之前深搜的所有子节点向上返回的分数之和 * 当前子节点返回的边数 + 之前深搜的所有子节点向上返回的边数之和 *
2012-10-25 23:59:46
567
原创 POJ 3756 Chess Game
Chess Game高斯消元求期望设dp[i]为处在格子i走到格子N时的期望,很容易得出方程,但是存在后退操作,所以方程中会存在dp[j]其中j/* author : csuchenan prog : POJ 3756 algorithm: 高斯消元+期望 csuchenan 3756 Accepted 252K 16MS
2012-10-25 00:42:05
549
原创 POJ 3156 Interconnect
Interconnect昨天一天都在这个题上面个wa,晚上回来又重新打了一遍,然后就进400多毫秒过了这个题目。。。很是惊讶。然后仔细一看,原来是之前有地方写错了,这让我情何以堪。。。。发现自己打代码的能力越来越差,不能很快的将自己的思路用代码给表现出来。。。还要一直狂DEBUG(现在愈来愈认为DEBUG是一个非常不好的东西。。。)。。。计算期望的时候:E(i) = pk* E(i
2012-10-24 09:06:44
700
原创 hdu 3715 Go Deeper
Go Deeper2 - sat建图:x[a[i]] = 1, x[a[i] + n] = 0c[i] == 0 a[i] + n --> b[i] b[i] + n --> a[i]c[i] == 1 a[i] + n --> b[i] + n b[i] + n --> a[i] + n a[i] ---> b[i]
2012-10-22 22:59:48
545
原创 CodeForces round146
A题,直接水题啦。直接用map统计一下给定的字符串出现的字母的种类。。然后判断奇偶。#include #include #include #include #include using namespace std;int main(){ string name; int cnt = 0; cin>>name; maphash; for(in
2012-10-22 18:00:27
404
原创 HDU 4305 Lightning
Lightning建无向图。如果两个点之间的距离小于R,并且两点之间无第三点可以用向量判断时间复杂度O(n^3).然后求生成树的个数。这里直接用Martix Tree定理。对于无向图G,它的kirchhoff矩阵C定义为它的度数矩阵D减去它的邻接矩阵A.然后用martix_Tree定理:对于一个无向图G,它的生成树个数等于kirchhoff矩阵任何一个n-1阶主子式的行列式的绝对值。关
2012-10-21 12:50:46
645
原创 hdu 3622 Bomb Game
Bomb Game很裸的2-sat。二分枚举半径,然后对于每个点i枚举j,其中j不是i'.如果dist(i,j)小于半径,那么就连边i->j', j->i',然后判断是否出现冲突。由于用double的话会出现精度误差,而给定点的坐标都是整数.所以,我们可以将其转化为整型处理,不进行开方操作,而比较的时候也是枚举两点间的距离。最后输出答案的时候在开方就行了。/*
2012-10-20 22:51:08
429
原创 HDU 4302 Holedox Eating
Holedox Eatinghdu 4302有一个[0,l]区间,有一只毛毛虫,初始位置在0,现在又两种操作操作0 x 代表在x点放一块蛋糕,操作1代表毛毛虫要吃一块蛋糕:如果有蛋糕,那么毛毛虫将走到距离其最近的位置吃一块蛋糕。如果在其两边有两个距离其等距的蛋糕,那么毛毛虫将沿上次走的方向移动。如果没有蛋糕那么毛毛虫将待在原位置不动。现在给定M个操作,问毛毛虫的移动距离。做法:1.
2012-10-20 17:17:17
538
原创 hdu 4301 Divide Chocolate
Divide ChocolateDP状态:dp[i][j][1]表示前i个分成j部分并且最后一行被分在不同的部分中的个数,dp[i][j][0]表示前i个分成j部分并且最后一行被分在相同的部分中的个数可以先预处理出1000内所有的,然后只需要查询即可。/* author : csuchenan prog : hdu4301 algorit
2012-10-19 23:07:06
662
原创 hdu 4331 Image Recognition
Image Recognition先处理出每个位置,前后左右四个方向的连续的1的个数。。由于正方形的对角顶点一定在对角线上,所以直接暴力枚举。#include #include const int maxn = 1005;int l[maxn][maxn];int r[maxn][maxn];int u[maxn][maxn];int d[maxn][maxn];
2012-10-19 19:33:54
571
原创 HDU 4276 The Ghost Blows Light
The Ghost Blows Light也是树形DP里非常不错的一道题。由于要从1走到N,我们可以先将从1到N的最短路给直接处理出来。然后由于我们可以在这条路上的一个节点走一个回路,已得到更大的价值。所以我们可以再对每个点进行一个分组背包。dp1[i][j]表示从i点出发回到i点用时j所能得到的最大价值。然后在进行一次分组背包dp2[i][j] i是关键路径上的点,表示从1走到i点用时j所能
2012-10-19 13:29:27
507
原创 hdu 2242 考研路茫茫——空调教室
考研路茫茫——空调教室非常好的一个题。这个题目与hdu 3298很相似,都是求分成两个连通块之后,差值最小。不过这个题目的难点在于给的不是一棵树,而是一个图有回路存在。由于只能切断一条边,所以这条边对于这个图来说,一定是割边。那么问题就变得容易的多了,枚举每条割边,算出割边去除后两个连通分量的权值和之差。如何快速计算出每个连通块的权值和。我们可以在找割边的时候,就算出每个点的子节点的权
2012-10-19 13:17:44
1496
原创 POJ 1770 Special Experiment
Special Experiment题目描述同POJ1192一样繁琐。。。意思很简单,如果两个原子的能量之差刚好是某个光子的能量,那么将会引起爆炸。。现在选取若干个原子,使得他们的能量之和最大,且不发生爆炸。建树方式:如果两个原子能量之差刚好是一个光子的能量,那么连边这样问题就变成了求最大独立集。方程就不在写了。。。具体看程序#include #include #include
2012-10-19 13:01:37
888
原创 POJ 1192最优连通子集
最优连通子集题目的描述太繁琐了。。。其实意思简单,就是给定若干个点,如果两个点之间的曼哈顿距离小于1,就连边。然后就构成一颗树,然后每个点都有一个权值,然后选取若干个点,使得权值和最大,并且点与点之前都连通。简单的树形DP,dp[i]表示以i点为根的子树并且选取i点时的最大权值。方程就很好写,dp[i]+=dp[u] ,其中u为i的儿子节点,并且dp[u]>0直接dfs一次,同时直
2012-10-19 12:47:16
578
原创 POJ 2378 Tree Cutting
Tree Cutting给一棵n个节点的无根树,问去掉哪个节点后可以使所有连通分支的节点数均,遇到小于等于n/2的,直接输出。。。#include #include #define maxn 10001int dp[maxn] ;int first[maxn] ;int next[maxn<<1] ;int edge[maxn<<1] ;int n ;inline
2012-10-19 12:36:56
368
原创 POJ 3107 Godfather
Godfather树形DP简单题,就是找到这样的点:删除该点后最大的连通子树所包含的节点个数最小。然后将这些点依次输出。dp[i] = max{dp[j] , n-number} , j是i的儿子节点,number是i所在子树的总结点个数。#include #include #include #define maxn 50005using std::vector ;int n
2012-10-19 12:20:15
427
原创 HDU 1011 Starship Troopers
Starship Troopers树形DP+分组背包,根节点一定需要被攻占。dp[i][j] : 在i节点派j个机器人,能获得的最大概率。先不考虑根节点dp[i][j] = max{dp[i][j] , dp[i][j-k] + dp[u][k]} ,然后考虑i点也需要派兵攻占。。在判断一下就可了。具体参看程序/* * author : csuchenan
2012-10-19 12:05:27
398
原创 HDU 4320 Arcane Numbers 1
Arcane Numbers 1题意:给出A,B(/* author : csuchenan prog : hdu 4320 algorithm: 整数分解*/#include #include #include using std::vector;typedef long long LL;vector pr;// 用于存放素数
2012-10-19 11:47:39
359
原创 hdu 1423 Greatest Common Increasing Subsequence
Greatest Common Increasing Subsequencehdu 1423 GCIS (n^2)省赛的时候,这个题目看了良久,都没想到O(n^2)的算法。后来苏犇看到GCIS的时候就让看模版,然后在吉大的模版上看到了这个然后我们就顺利的1Y.我又看了一下这个题目,找了好多博客(不是挂了,就是讲的很不清楚)。。然后看到了http://www.tyvj.cn/bb
2012-10-14 22:40:58
443
原创 ZOJ 3640 Help Me Escape
Help Me Escape题目意思: 一个吸血鬼,每天有n条路走,每次随机选一条路走,每条路有限制,如果当这个吸血鬼的能力大于某个值c[i],那么只需要花费ti(ti = (1.0 + sqrt(5.0))/2 * c[i] * c[i]) 天的时间就可以逃出去,否则,花费1天的时间,吸血鬼的能力增加c[i],花费1天的时间,然后继续下一天的尝试。求逃出去的期望。设dp[v] ,表示当能力值
2012-10-06 23:23:52
603
原创 POJ 3071 Football
Football计算概率的题目。模拟对应的过程,然后按照概率公式计算主要是在计算每一轮的每个人的可能的对手的时候比较麻烦。我们先计算出,每个人所属的组,然后计算出每个人与其相邻的组,也就是本轮所需要的PK的对手的组,然后对需要PK组一一计算概率。/* author : csuchenan prog : POJ 3071 Algorithm: Prob
2012-10-05 23:27:05
404
原创 HDU 4405 Aeroplane chess
Aeroplane chess今年的网络赛题目。那个时候还没写过期望概率DP的题目。之前苏牛说让我做一下期望概率DP的专题,但是没做,结果就出了一道期望DP的题目。后悔啊。。。最近学了一下期望DP,然后做到了这一题。现在发现这题真的是很水。方程很容易写出来。dp[i] = sum(dp[i+j]) + 1 , 1=/* author : csuchenan PRO
2012-10-05 16:22:50
446
原创 POJ 1241 Knockout Tournament
Knockout TournamentTree DP 。很有意思的一个题目。给定了2^n个人每轮比赛的结果,然后推测每个人可能的最高排名与最低排名。由于给的是每轮比赛的结果,所以题目在数据的读入与处理方面比较麻烦。如果编号为i的人赢了编号为j的人,那么我们连有向边(i,j),即j为i的孩子。这样我们只需要处理出每轮比赛的两个人之间的关系即可。由于数据的最后一个肯定是树的根节点,然后我们从后往前
2012-10-04 23:16:32
639
原创 ZOJ 3201 Tree of Tree
Tree of Tree简单Tree DP. 求一个含有k个节点的子树,使得子树上所有节点的权值和最大。方程:dp[i][j] 表示以i为根的子树中选取j个点所能获得最大值,其中i点必须选,然后就是直接使用分组背包就可以了。/* *author : csuchenan *Prog : ZOJ 3201 *Algorithm : Tree DP dp[i][j] 以i为
2012-10-04 23:01:50
430
原创 HDU 3853 LOOPS
LOOPS期望DP。题目意思很容易理解,这里就不再解释了。方程dp[i][j]表示从i,j点出发到达(R , C)的消耗能量的期望值。题目给了状态转移的几个方向,dp[i][j] = x1 * dp[i][j] + x2 * dp[i][j + 1] + x3 * dp[i + 1][j] + 2 ; 这里x1,x2,x3即为从(i,j)走到(i,j),(i , j + 1) , (i
2012-10-04 22:53:55
394
原创 POJ 2096 Collecting Bugs
Collecting Bugs首个概率DP类题目。题意: 一个软件有S个子系统,会产生n中bug某人一天发现一个bug,这个bug属于一个子系统并且属于一个分类。每个bug属于某个子系统的概率是1/s,属于某个分类的概率为1/n,求发现n中bug,每个子系统都发现bug的天数的期望。全期望的公式:E(Y) = E(E(Y|x)) = sgm(P(X=xi)E(Y|X = xi)
2012-10-04 21:55:37
520
原创 hdu 3627 Giant For
Giant For线段树+离散化。离线处理,由于查询的时候我们需要找到所有满足条件的结果中行最小且列最小的。我们以行建树,然后将行对应的列中的值有set保存下来。首先将数据读入,然后将行从大到小进行排序,维护一个区间中的列最大的值。添加与删除操作很相似,一个是相当于将点的标记为1,另一个就是将标记置为0,所以只需要1个update函数就可以了。然后查询的时候很简单,我们只需要找到行最小的,并且
2012-10-03 23:53:39
512
原创 POJ 3345 Bribing FIPA
Bribing FIPATree DP。由于选定某棵子树的根之后,所有的子节点都被选择。我们先处理出不考虑树根的情况,选择j个点所需要的最小花费。然后对于每个j进行判断,如果对应的价值大于树根的价值,就更新。直接看代码:/* *author : csuchenan *PROG : POJ3345 *Algorithm : Tree DP dp[i][j]表示以i
2012-10-02 22:59:47
431
原创 POJ 2486 Apple Tree
Apple Tree继续将树形DP题目给与整理。这个题目能很容易想到状态,dp[i][j]表示以i为根的子树中走j步所能获得的最大值。但是这样状态转移的时候比较难写,而状态转移比较麻烦的原因在于不能确定走到了哪一步。我们增加一维,dp[i][j][2],其中dp[i][j][0]表示要回到根节点,dp[i][j][1]表示不回到根节点。这样我们就很容易能得到状态转移方程了,很容易推出来,具体看
2012-10-02 22:47:27
387
原创 POJ 1155 TELE
TELE这个题目搁置了好久才有重新拿过来做的。题目意思不难理解。TreeDP + 分组背包 方程: dp[i][j] = max{ dp[i][j] , dp[i][k] + dp[s][j-k] - edge[i][s]},其中s表示i的儿子节点,edge[i][s]表示i到s的边权,dp[i][j]从树根i的子树中选取j个叶子所需要的最小代价。不过这个题目比较卡时限,需要优化。由于叶子
2012-10-01 22:20:08
499
原创 POJ 3342 Party at Hali-Bula
Party at Hali-Bula好久没有写解题报告了,这次把上个月做的一些题都写写,上个月做了不少的树形DP,先从这个比较简单的入手。这个题目与hdu 1520 Anniversary party那道很裸的树形DP差不多,只不过这道题不仅要求出最多的人,还要判断是不是唯一。主要是如何判断人数是不是唯一的。出现多解的情况可能有如下两种,如果对于根节点而言,选与不选的解是相同的,则说明这样
2012-10-01 22:08:32
569
原创 博弈论初级入门题目
详细资料参见博弈论入门hdu 1846 巴什博弈,只要n%(m + 1)==0肯定输。#include int main(){ int T ; int n ; int m ; //freopen("hdu1846.in" ,"r" , stdin) ; scanf("%d" , &T) ; for( ; T-- ; ){ s
2012-09-10 22:56:20
717
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人