[HNOI2010 公交路线]
摘要:[关键字]:数学 矩阵乘法[题目大意]:有n个车站,k路车。每个车站只能被一路车停,且同一路车的相邻的两站之间不能超过p,求方案数。//===============================================================================================================================[分析]:首先因为同一路车的相邻的两站之间不能超过p,所以除前k个每p车站内都要有所有的公交车。这样可以p个p个的转移,用状态压缩dp,p中第一位必须被一辆车占所以方案数一共有c(9,4)=126个。首先处理出
阅读全文
posted @
2012-04-18 16:24
procedure2012
阅读(335)
推荐(0) 编辑
[动态规划斜率优化小结]
摘要:用斜率优化的动态规划需要满足:1、转移方程应该是这样的形式:f[i]=Max/Min{f[j]+G(j)}其中G是一个j有关系的函数(有可能包含其他未知数)。2、设Vx=f[x]+G(x),Vy=f[y]+G(y).如果在可以推出:求最大值时根据x<y&&Vx>Vy:W(x,y)<U(i)其中W(x,y)是和x、y有关的函数U(i)是只和i有关的函数且单调递增求最小值时根据x<y&&Vx<Vy:W(x,y)>U(i)其中W(x,y)是和x、y有关的函数U(i)是只和i有关的函数且单调递增快速的转移出这样的方程需要用单调队列来维
阅读全文
posted @
2012-04-17 11:58
procedure2012
阅读(815)
推荐(2) 编辑
[POJ1062 Cipher]
摘要:[关键字]:数学 置换群[题目大意]:给出一组置换,然后要求出把给出的文字按位置置换k此后的信息。//==========================================================================================================================================[分析]:首先求出这个置换的循环,并记录循环的长度环每个位置上的值。找到每个位置所属的循环然后它在循环中的位置加k再对循环长度取模就是它的最终位置。[代码]:View Code #include<iostream&g
阅读全文
posted @
2012-04-17 11:40
procedure2012
阅读(184)
推荐(0) 编辑
[URAL1042 Central Heating]
摘要:[关键字]:数学 异或方程组[题目大意]:有n各工人n各水管,每个工人可以对某几个水管进行反操作(开变关关变开),问需要操作那些人才会大开所有水管。//==================================================================================[分析]:看懂题目后不难可以列出下面这个方程组: x1*a[1,1] xor x2*a[1,2] xor x3*a[1,3] xor …… xor xn*a[1,n]=1 x1*a[2,1] xor x2*a[2,2] xor x3*a[2,3] xor …… xor xn*a[2,
阅读全文
posted @
2012-04-16 20:54
procedure2012
阅读(404)
推荐(0) 编辑
[POJ2396 Budget]
摘要:[关键字]:图论 网络流[题目大意]:给出一个矩阵没行和和每列的和,并给出每个格子的上下界,求出一个合法的矩阵。//============================================================================================================[分析]:就是首先建立一个图,源点到每个行的边的容量上下界都为该行的和,每列到汇点连一条容量上下界都为该列和的边,每行的点到每列的点连一条容量上下界为这一行和这一列所代表的格子的上下界。然后对着个图判断它是否有最大流并求出。对一个图求容量有上下界的最大流的方法是:1、
阅读全文
posted @
2012-04-16 15:47
procedure2012
阅读(1488)
推荐(0) 编辑
[URAL1416 Confidential]
摘要:[关键字]:次小生成树[题目大意]:求出给出图的最小和次小生成树。//=============================================================================[分析]:http://www.cppblog.com/MatoNo1/archive/2011/06/25/147627.html#149420讲的又清楚又详细,ORZMato大神![代码]:kurscal#include<iostream>#include<cstdio>#include<cstdlib>#include<cst
阅读全文
posted @
2012-04-14 00:50
procedure2012
阅读(176)
推荐(0) 编辑
[BZOJ1726 Roadblocks]
摘要:[关键字]:图论 第k短路[题目大意]:求出严格次短路。//===================================================================================[分析]:首先先说K短路的求法。利用A*去求,首先先spfa处理出T到每个点的距离作为A*中的h[],在从起点开始进行搜索,g[]是从起点到当前点已经走过的距离,f[i]=g[i]+h[i]。每次选取最小的f出队并更新其他节点。可以证明一个节点出队k次它的f值就是从s到它的第k短路的长度(非严格)。每次出队是已经出的超过k次的就忽略,如果t点出过k次就算求出了第k短路。如
阅读全文
posted @
2012-04-14 00:39
procedure2012
阅读(268)
推荐(0) 编辑
[BZOJ1232 安慰奶牛]
摘要:[关键字]:最小生成树[题目大意]:在一个图里找到一颗生成树,要求选定一个根后从这个根到每一个点都走一边每经过一个点i需要停留di分钟每条边需要ei分钟根还要额外加两遍所得值最小。//====================================================================================================[分析]:因为每加入一条边(x,y),所增加的代价就是ei+dy+ei+dx,又因为所有边都加入后作为根的那个点少加了一次为了让最终结果最小需要选取最小的点作为根并让ans加上它的权值。所以可以以权值最小的点位起点,
阅读全文
posted @
2012-04-14 00:29
procedure2012
阅读(471)
推荐(0) 编辑
[JSOI2008 Prefix火星人]
摘要:[关键字]:splay hash 二分[题目大意]:给出一个字符串,求出给定的两个后缀的的最长公共前缀。在求的过程中会有改变或在某个位置添加字符的操作。//============================================================================================[分析]:一听最长公共前缀马上想到后缀数组,但因为是动态维护所以后缀数组也无能为力。可以把字符串想象成一个数组,于是变成了动态插入和改变一个序列,还要能快速找到两个子区间——splay。求最长公共前缀可以用二分答案加验证的方法,二分长度先提取出这个区间然后判断
阅读全文
posted @
2012-04-13 00:14
procedure2012
阅读(1045)
推荐(0) 编辑
[JSOI2008 Tree最小生成树计数]
摘要:[关键字]:数学 树结构[题目大意]:求出给定的图的最小生成树的数量。//==============================================================================================[分析]:有一个定理:所有最小生成树的权值为ci的边的数量ni和所连接的点集S是一样。由此可以判断每种权值的边拿出ni个构成S的最小生成树的数量,因为同样的边的数量最多只有10所以搜索即可,然后利用乘法原理成在一起。注意判断无解情况。[代码]:View Code #include<iostream>#include<c
阅读全文
posted @
2012-04-12 23:51
procedure2012
阅读(1237)
推荐(0) 编辑
[JSOI2008 Maxnumber最大数]
摘要:[关键字]:数据结构[题目大意]:有两个操作:输出后x个数中的最大值、将一个数插入到最后。//===============================================================================[分析]:就是一个线段树的维护,连延迟都没有。[代码]:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std
阅读全文
posted @
2012-04-12 23:43
procedure2012
阅读(623)
推荐(0) 编辑
[HNOI2012 Matrix]
摘要:[关键字]:搜索[题目大意]:给出一个显示原矩阵每一个2*2得小正方形的和的矩阵,每个元素都小于p,求出一个字典序最小的原矩阵a满足所给矩阵。//================================================================================[分析]:如果能求出第一行和第一列就可以推算出所有的格子。首先假设第一行和第一列都是0然后可以得到一个不满足小于p的矩阵c,然后进行调整。如果在(1,1)加了a1,1那只要再将所有非第一行第一列的行列和为奇数的格子加上a1,1行列和是偶数的减去a1,1结果不会改变,如果在(1,j)加a1,j只
阅读全文
posted @
2012-04-12 13:42
procedure2012
阅读(420)
推荐(0) 编辑
[HNOI2010 Stone取石头游戏]
摘要:[关键字]:排序 贪心[题目大意]:给出n堆石头,并在初始时取走某几堆,每次只能去相邻石头堆是空的石头堆,计算双方都是最优的情况下的石头数。//===========================================================================================================[分析]:用空堆将石头分开,可以分成两个栈和若干个双头队列。如果只有一个栈,则每个选手所能取到的数是唯一的,如果只有一个队列如果是奇数个先手可以取奇数位的和和偶数位的和的最大值。如果是组合的话就复杂了。如果在栈里出现栈顶小于下一个则除非不得已
阅读全文
posted @
2012-04-11 19:04
procedure2012
阅读(1134)
推荐(0) 编辑
[HNOI2010 Fsk]
摘要:[关键字]:置换群 路径压缩[题目大意]:生成数列c0..n-1: c0=0, ci+1=(ci*q+p) MOD m。你需要确定非负整数x1..n-1, y1..n-1。使得pos0=s, posi=(ci+d*xi+yi) MOD n恰好是一个0到n-1的排列,当(xi,yi)有多种选择时,yi要尽量小,然后xi尽量小。通过这种方法我们可以得出唯一的pos0..n-1。假设有n-1个物品1..n-1 posi表示物品i的位置 pos0表示空位的位置。初始时空位在0号位,物品i在i号位。每次移动可以把一个物品放到空位去,然后它原来所在的位置变成空位。问从初始移动到目标pos最少需要多少移动。
阅读全文
posted @
2012-04-10 12:05
procedure2012
阅读(255)
推荐(0) 编辑
[JSOI2008 sphere]
摘要:[关键字]:高斯消元[题目大意]:给出一个n维空间中球面上n+1个点,求出球心坐标。//===========================================================================================[分析]:看他给出的条件n+1个点,要求出n个值,感觉像解方程租。因为,每个点到球心的坐标相等。设圆心坐标为(x1,x2,x2......xn),每个点到圆心的距离为di,然后就可以列出n个式子d1=d2\d2=d3......dn=dn+1,然后化简一下利用高斯消元解出就行了。[代码]:View Code #include&l
阅读全文
posted @
2012-04-10 11:34
procedure2012
阅读(175)
推荐(0) 编辑
[HNOI2010 Bounce]
摘要:[关键字]:块状链表[题目大意]:有n个弹力装置,绵羊落在i个装置上会被向后弹到i+ki个装置上或被弹飞,问从i个装置开始要想被弹飞需要多少次,中间会改变装置的弹力系数。//=============================================================================================[分析]:做法有三种:动态树(不会)、伸展树+括号序列(不会+太麻烦)、块状链表。虽然块状链表在这里只是水过,但还是很好写和理解的。在以sqrt(n)分块后,对每个装置维护f[i].t[i],f[i]表示从i开始要弹几次才能弹出该块,可以用
阅读全文
posted @
2012-04-10 11:16
procedure2012
阅读(297)
推荐(0) 编辑
[HNOI2010 Planar平面图判定]
摘要:[关键字]:图论 二分图[题目大意]:给出一个带有汉密尔顿回路的图,判断它是否是一个平面图。//==============================================================================[分析]:汉密尔顿回路回练成一个环,这个图必定被分成两部分,如果两条边相交无论同时在内还是在外都会相交,只有一条在环内一条在外才行——二分图!首先判断出那些边不再回路上然后把有矛盾的边连边利用染色法判断能否构成二分图,二分图的成立决定了平面图的成立。还有一点,平面图内设点数为v边数为e面数为r,v-e+r=2 e<=3*v-6r<=2
阅读全文
posted @
2012-04-07 15:13
procedure2012
阅读(1918)
推荐(1) 编辑
[HNOI2010 Chorus合唱队]
摘要:[关键字]:动态规划[题目大意]:对于一个包含N个整数的数列 A,我们可以把它的所有元素加入一个双头队列 B。首先A[1]作为队列的唯一元素,然后依次加入 A[2..N],如果 A[i]<A[i-1]那么从B的左端加入 A[i],否则从B的右端加入A[i]。给出最终的队列 B,求原数列有多少种可能排列。//=======================================================================================================[分析]:因为每个数字不是放在最前面就是放在最后面,所以a中[1……i]就对应b
阅读全文
posted @
2012-04-07 15:02
procedure2012
阅读(552)
推荐(0) 编辑
[HNOI2008 Cards]
摘要:[关键字]:扩展欧几里得Burnside定理 动态规划[题目大意]:给你n张牌,n张牌一共有三种颜色,并且给定这n张牌种的红色、蓝色、绿色各有多少张。现在给定m种洗牌法,每一种牌的排列通过洗牌得到另一种牌的排列,则它们称为本质相同染色法。求:对这n张牌染色,满足sr、sb、sg的限制下,可以通过m种洗牌法,有多少种本质不同的染色法?//============================================================================================================================[分析]:Bu
阅读全文
posted @
2012-04-07 07:58
procedure2012
阅读(1115)
推荐(0) 编辑
[HNOI2008 Toy]
摘要:[关键字]:动态规划 斜率优化[题目大意]:有n个玩具,每个玩具有一定长度,每两个玩具之间必须有一格单位的空格,且玩具序号必须连续。每造一个箱子的花费为(l-L)2l是箱子使用长度,L为常量。求出装下所有玩具的最小花费。//============================================================================================[分析]:明显的斜率优化动态规划。首先写出转移方程:f[i]=min{f[j]+(s[i]-s[j]+i-(j+1)-L)2},设s'[i]=s[i]+i,L'=L+1,Vx=
阅读全文
posted @
2012-04-07 00:25
procedure2012
阅读(346)
推荐(0) 编辑
[HNOI2008 GT考试]
摘要:[关键字]:动态规划 矩阵乘法[题目大意]:给定一个字符集为(0-9)的字符串T(length<=20),求长度为N的不包含T的字符串的总数。//==========================================================================[分析]:首先可以用KMP求next数组的方法求出f[i][j],T串的前i个字符组成的一个串+任意一个字符的后j位和T的前j各字符匹配的方案数。把这个数组乘n遍后f[0][i]就是T的前0个加上n个字符后i为和T前i位匹配的方案数。ans=Σf[0][i](0<=i<=m-1)。而f数
阅读全文
posted @
2012-04-07 00:07
procedure2012
阅读(1167)
推荐(0) 编辑
[HNOI2008 Kingdom]
摘要:[关键字]:图论 弦图的色数[题目大意]:就是最少的颜色染完所有点使得每条边相邻点都颜色不同,也就是图的色数。//==========================================================================[分析]:首先它给出的图是一个弦图,所以有特殊的算法来求色数。首先用最大势算法求出完美消除序列,然后按照序列的逆序进行染色,每次都染这个点没有连着的边中的最小的颜色。最大势算法,每次都找有最多的相连的以被加入的节点的节点。[代码]:View Code #include<iostream>#include<cstdio&
阅读全文
posted @
2012-04-06 23:51
procedure2012
阅读(248)
推荐(0) 编辑
[HNOI2008 Prison]
摘要:[关键字]:数学[题目大意]:监狱里有n个犯人信奉m种宗教,问有两个信奉相同宗教的犯人埃在一起的方案数。//=============================================================================[分析]:如果想到反向思维你就成功了!所有方案数=mn没有两个宗教相同的犯人挨在一起的方案数是m*(m-1)*(m-1)……*(m-1)=(m-1)n-1,所以答案就是mn-(m-1)n-1[代码]:View Code #include<iostream>#include<cstdio>#include<c
阅读全文
posted @
2012-04-06 23:36
procedure2012
阅读(172)
推荐(0) 编辑
[HNOI2008 Tree]
摘要:[关键字]:Prüfer编码Cayley定理[题目大意]:告诉你N结点的树上部分点的度数,求这样的树一共有多少棵.//==================================================================================[分析]:刚刚看到这题时一点思路也没有,又想了一会儿,还是没思路……这题其实和Prüfer编码Cayley定理有关系,Cayley定理:一个n个节点的无根树有nn-2种形态。这个定理可以通过Prüfer编码来证明,见这里。通过Prüfer编码的推广可以得到n各右度限制的节点的无
阅读全文
posted @
2012-04-06 23:29
procedure2012
阅读(182)
推荐(0) 编辑
[HNOI2008 Lines]
摘要:[关键字]:数学[题目大意]:给出n条直线的k和b(y=kx+b),求出从y轴无限高的地方向下看能看到哪几条直线。//====================================================================================[分析]:因为斜率最小和斜率最大的两条边一定是可以看见的,所以将斜率从小到大排序依次加入一个记录所有可见直线的凸壳中的堆栈。记录每条边的和凸壳左交点的x值(因为直线是无穷长的可以规定一个区间-1e100到1e100使其变成有限的),而右交点是不用记录的因为右交点=下一条直线的左交点。因为是按斜率从小到大的顺序加入
阅读全文
posted @
2012-04-03 11:51
procedure2012
阅读(188)
推荐(0) 编辑
[POJ2125 Destroying The Graph]
摘要:[关键字]:图论 网络流[题目大意]:给出一个有向图,定义两种操作:w+(i)删掉i点的所有入边w-(i)删掉i点的所有出边,每种操作都有对应的花费,问删掉所有边的最小花费。//=========================================================================================[分析]:详细的解法还是看《最小割模型在信息学竞赛中的应用》这篇论文吧。[代码]:View Code #include<iostream>#include<cstdio>#include<cstdlib>#i
阅读全文
posted @
2012-04-02 11:44
procedure2012
阅读(365)
推荐(0) 编辑