[HNOI2010 公交路线]
摘要:[关键字]:数学 矩阵乘法[题目大意]:有n个车站,k路车。每个车站只能被一路车停,且同一路车的相邻的两站之间不能超过p,求方案数。//===============================================================================================================================[分析]:首先因为同一路车的相邻的两站之间不能超过p,所以除前k个每p车站内都要有所有的公交车。这样可以p个p个的转移,用状态压缩dp,p中第一位必须被一辆车占所以方案数一共有c(9,4)=126个。首先处理出
阅读全文
posted @
2012-04-18 16:24
procedure2012
阅读(341)
推荐(0)
[JSOI2008 Prefix火星人]
摘要:[关键字]:splay hash 二分[题目大意]:给出一个字符串,求出给定的两个后缀的的最长公共前缀。在求的过程中会有改变或在某个位置添加字符的操作。//============================================================================================[分析]:一听最长公共前缀马上想到后缀数组,但因为是动态维护所以后缀数组也无能为力。可以把字符串想象成一个数组,于是变成了动态插入和改变一个序列,还要能快速找到两个子区间——splay。求最长公共前缀可以用二分答案加验证的方法,二分长度先提取出这个区间然后判断
阅读全文
posted @
2012-04-13 00:14
procedure2012
阅读(1050)
推荐(0)
[JSOI2008 Tree最小生成树计数]
摘要:[关键字]:数学 树结构[题目大意]:求出给定的图的最小生成树的数量。//==============================================================================================[分析]:有一个定理:所有最小生成树的权值为ci的边的数量ni和所连接的点集S是一样。由此可以判断每种权值的边拿出ni个构成S的最小生成树的数量,因为同样的边的数量最多只有10所以搜索即可,然后利用乘法原理成在一起。注意判断无解情况。[代码]:View Code #include<iostream>#include<c
阅读全文
posted @
2012-04-12 23:51
procedure2012
阅读(1241)
推荐(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
阅读(626)
推荐(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
阅读(424)
推荐(0)
[HNOI2010 Stone取石头游戏]
摘要:[关键字]:排序 贪心[题目大意]:给出n堆石头,并在初始时取走某几堆,每次只能去相邻石头堆是空的石头堆,计算双方都是最优的情况下的石头数。//===========================================================================================================[分析]:用空堆将石头分开,可以分成两个栈和若干个双头队列。如果只有一个栈,则每个选手所能取到的数是唯一的,如果只有一个队列如果是奇数个先手可以取奇数位的和和偶数位的和的最大值。如果是组合的话就复杂了。如果在栈里出现栈顶小于下一个则除非不得已
阅读全文
posted @
2012-04-11 19:04
procedure2012
阅读(1143)
推荐(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
阅读(262)
推荐(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
阅读(180)
推荐(0)
[HNOI2010 Bounce]
摘要:[关键字]:块状链表[题目大意]:有n个弹力装置,绵羊落在i个装置上会被向后弹到i+ki个装置上或被弹飞,问从i个装置开始要想被弹飞需要多少次,中间会改变装置的弹力系数。//=============================================================================================[分析]:做法有三种:动态树(不会)、伸展树+括号序列(不会+太麻烦)、块状链表。虽然块状链表在这里只是水过,但还是很好写和理解的。在以sqrt(n)分块后,对每个装置维护f[i].t[i],f[i]表示从i开始要弹几次才能弹出该块,可以用
阅读全文
posted @
2012-04-10 11:16
procedure2012
阅读(303)
推荐(0)
[HNOI2010 Planar平面图判定]
摘要:[关键字]:图论 二分图[题目大意]:给出一个带有汉密尔顿回路的图,判断它是否是一个平面图。//==============================================================================[分析]:汉密尔顿回路回练成一个环,这个图必定被分成两部分,如果两条边相交无论同时在内还是在外都会相交,只有一条在环内一条在外才行——二分图!首先判断出那些边不再回路上然后把有矛盾的边连边利用染色法判断能否构成二分图,二分图的成立决定了平面图的成立。还有一点,平面图内设点数为v边数为e面数为r,v-e+r=2 e<=3*v-6r<=2
阅读全文
posted @
2012-04-07 15:13
procedure2012
阅读(1921)
推荐(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
阅读(556)
推荐(0)
[HNOI2008 Cards]
摘要:[关键字]:扩展欧几里得Burnside定理 动态规划[题目大意]:给你n张牌,n张牌一共有三种颜色,并且给定这n张牌种的红色、蓝色、绿色各有多少张。现在给定m种洗牌法,每一种牌的排列通过洗牌得到另一种牌的排列,则它们称为本质相同染色法。求:对这n张牌染色,满足sr、sb、sg的限制下,可以通过m种洗牌法,有多少种本质不同的染色法?//============================================================================================================================[分析]:Bu
阅读全文
posted @
2012-04-07 07:58
procedure2012
阅读(1117)
推荐(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
阅读(349)
推荐(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
阅读(1169)
推荐(0)
[HNOI2008 Kingdom]
摘要:[关键字]:图论 弦图的色数[题目大意]:就是最少的颜色染完所有点使得每条边相邻点都颜色不同,也就是图的色数。//==========================================================================[分析]:首先它给出的图是一个弦图,所以有特殊的算法来求色数。首先用最大势算法求出完美消除序列,然后按照序列的逆序进行染色,每次都染这个点没有连着的边中的最小的颜色。最大势算法,每次都找有最多的相连的以被加入的节点的节点。[代码]:View Code #include<iostream>#include<cstdio&
阅读全文
posted @
2012-04-06 23:51
procedure2012
阅读(253)
推荐(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
阅读(175)
推荐(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
阅读(186)
推荐(0)
[HNOI2008 Lines]
摘要:[关键字]:数学[题目大意]:给出n条直线的k和b(y=kx+b),求出从y轴无限高的地方向下看能看到哪几条直线。//====================================================================================[分析]:因为斜率最小和斜率最大的两条边一定是可以看见的,所以将斜率从小到大排序依次加入一个记录所有可见直线的凸壳中的堆栈。记录每条边的和凸壳左交点的x值(因为直线是无穷长的可以规定一个区间-1e100到1e100使其变成有限的),而右交点是不用记录的因为右交点=下一条直线的左交点。因为是按斜率从小到大的顺序加入
阅读全文
posted @
2012-04-03 11:51
procedure2012
阅读(190)
推荐(0)
[NOI2003 文本编辑器]
摘要:[关键字]:splay[题目大意]:也不说了……太麻烦了……//==============================================================================[分析]:就是NOI2005序列维护的简化版,不用维护太多信息、不用延迟……但是要注意要判断从当前光标往后走n各是否超出了当前文本的范围,特殊判断一下查出范围就当只查到最后一个就行了。听说输出时如果用中序遍历有可能爆栈但是本弱菜不会高级做法,直接递归遍历在tyvj上已经ac。[代码]:View Code #include<iostream> #include<
阅读全文
posted @
2012-03-30 23:00
procedure2012
阅读(715)
推荐(0)
[NOI2005 维护序列]
摘要:[关键字]:splay[题目大意]:太麻烦了自己找题看吧。//=============================================================================[分析]:就是一些基本的splay操作。将一个区间[a,b]从splay树中取出来要先将a-1旋到根b+1旋到根的右子树,然后以根的右树的左树为根的子树就是区间[a,b]。每个splay树中的节点要保存:数值dat,子书大小size、sum区间和、maxsum最大子段和,mls从左开始连续的最大子段和,mrs同样;same是否要改为普通值,rev是否需翻转。同时为了免去NULL的判
阅读全文
posted @
2012-03-30 22:42
procedure2012
阅读(593)
推荐(0)