03 2012 档案

摘要:有一个圆上有n个点,有m个要求,分别是(a,b)表示a与b要联通,每个点只能和它左右的点连线,问最少连多少个线段(相邻两点之间连的一条线算1条线段)。最多要连n-1条线,整个圆上的点都联通,所以枚举不连哪一条线段,算出此时最小的线段数即可。算的时候用next[i]记录i点向后连边的终点,求和的时候就能很快了。View Code 1 {$inline on} 2 program pku1944(input,output); 3 type 4 node = record 5 x,y : integer; 6 end; 7 var 8 ... 阅读全文
posted @ 2012-03-29 10:59 Codinginging 阅读(276) 评论(0) 推荐(0)
摘要:有6种面值的货币,最小的是1,求出用最少的货币数凑成1..100的最少货币数,输出其中的最大值和他们的平均值。而可以用减法。例如:6=1+2+3,6=7-1,那么凑成6的最小货币数为2.是一个没有下限的背包问题,体积数组开到3000+就可以了(经过试验了)。View Code 1 program pku1252(input,output); 2 var 3 f : array[-3000..3000] of longint; 4 v : array[1..6] of longint; 5 cases,e : longint; 6 procedure ... 阅读全文
posted @ 2012-03-28 16:20 Codinginging 阅读(297) 评论(0) 推荐(0)
摘要:给你两个串A,B,可以得到从A的任意位开始的子串和B匹配的长度。 给定K个询问,对于每个询问给定一个x,求出匹配长度恰为x的位置有多少个。 N,M,K<=200000字符串的处理,用KMP喽,首先求出模式串B的next[],然后进行一遍AB匹配,记录a[i]匹配的最大长度,那么如果a[i]可以匹配l[i]的长度,answer[i]表示匹配长度为i的串的数量,则answer[next[i]]的匹配长度也是满足answer[i]的,所以只要倒着循环一遍,把answer[next[i]]加到answer[i]中即可。这时的answer[i]包含了长度为i+1的情况,所以要输出answer[k] 阅读全文
posted @ 2012-03-27 15:27 Codinginging 阅读(576) 评论(0) 推荐(0)
摘要:有三个矩阵A,B,C,问A*B是否C,(n^3)的算法会超时。构造一个n*1的矩阵,由A*B=CA*B*X=C*XA*(B*X)=C*X那么在(n^2)的时间内就能判定一次。View Code 1 program pku3318(input,output); 2 var 3 x,y,z : array[0..501,0..501] of int64; 4 left,right,answer1 : array[0..501] of int64; 5 n : longint; 6 rand : arra... 阅读全文
posted @ 2012-03-25 17:54 Codinginging 阅读(196) 评论(0) 推荐(0)
摘要:在一个笛卡尔平面坐标系里(则X轴向右是正方向,Y轴向上是正方向),有N(1<=N<=100)个矩形,第i个矩形的左上角坐标是(x1,y1),右下角坐标是(x2,y2)。问这N个矩形所覆盖的面积是多少?注意:被重复覆盖的区域的面积只算一次。(-10^4<=x1,y1,x2,y2<=10^4)离散化一下之后暴力统计即可,染的时候要搞清楚s[i,j]是i(j)与前(上)一条线还是后(下)一条线围成的面积。相当于vijos1056,但是坐标的判重就需要改一下了,很好弄,不再累述。View Code 1 program planting(input,output); 2 type 阅读全文
posted @ 2012-03-25 17:09 Codinginging 阅读(402) 评论(0) 推荐(0)
摘要:对于每一组数据(b,a),统计b在a中出现的次数。一道裸的KMP匹配题,你用BM我也没意见。View Code 1 program pku3461(input,output); 2 var 3 a,b : ansistring; 4 next : array[0..20000] of longint; 5 cases : longint; 6 i,j,k : longint; 7 answer : longint; 8 begin 9 readln(cases);10 for k:=1 to cases do11 beg... 阅读全文
posted @ 2012-03-23 16:50 Codinginging 阅读(151) 评论(0) 推荐(0)
摘要:求一个字符串中每一个前缀用s’^k(k>1)表示的所有情况。要求输出该前缀的结束位置和k值。和2406有基本相同的方法,求出next数组后枚举i,看(1-i) mod(i-next[i])是否大于1,满足条件就输出即可。View Code 1 program pku1961(input,output); 2 var 3 n : longint; 4 ch : char; 5 s : ansistring; 6 next : array[0..1000100] of longint; 7 i,j : longint; 8 ... 阅读全文
posted @ 2012-03-23 16:39 Codinginging 阅读(227) 评论(0) 推荐(0)
摘要:有一个长度不超过400000的字符串s,求满足{既是s的前缀,又是s的后缀}的字串,输出每一个串的起始位置。首先,它本身满足条件,接下来,用KMP求出next数组,每次去掉next[i]到i的一段字符,剩余字串仍满足条件,直到找到头为止。View Code 1 program pku2752(input,output); 2 var 3 s : ansistring; 4 next : array[0..500000] of longint; 5 answer : array[0..500000] of longint; 6 total : lo... 阅读全文
posted @ 2012-03-23 16:23 Codinginging 阅读(224) 评论(0) 推荐(0)
摘要:有一个字符串,长度在1000000以内,求它最大的链节个数,即把s表示成s'+s'+s'······。求s'的个数。用KMP的思想,求出next数组,然后可以用手画方法发现从next[length(s)]到length(s)间的字符串可以不断向前推,只要这个长度能被总长度整除,它就是最大链节长度,否则就是1.View Code 1 program pku2406(input,output); 2 var 3 i,j : longint; 4 s : ansistring; 5 next : array[ 阅读全文
posted @ 2012-03-23 16:11 Codinginging 阅读(558) 评论(0) 推荐(0)
摘要:数轴上有n个点,现在有c个点,放在n个点中的c个点中,让c个点中两点间最小距离最大。这个最大最小问题就真是二分答案了,然后贪心判定即可。加了一个pascal自身优化{$inline on}把140+ms拉到了90+ms。View Code 1 {$inline on} 2 program pku2456(input,output); 3 var 4 x : array[0..100010] of longint; 5 n,c : longint; 6 answer : longint; 7 procedure init; inline; 8 ... 阅读全文
posted @ 2012-03-22 11:26 Codinginging 阅读(372) 评论(0) 推荐(0)
摘要:求一棵树的直径。题目没说数据范围,无论如何显然是O(n)的。这里用了dfs,先找任一点的最远点,再从这个最远点找一次最远点,后一个的两点距离就是答案。View Code 1 program pku1985(input,output); 2 type 3 node = ^link; 4 link = record 5 goal,w : longint; 6 next : node; 7 end; 8 var 9 l : array[0..50000] of node;10 d : ... 阅读全文
posted @ 2012-03-22 10:40 Codinginging 阅读(466) 评论(0) 推荐(0)
摘要:给出算式{1/a = (1/b + 1/c) / (1 - 1/(b*c)}中的a,求算式中b和c使b+c最小.a,b,c均大于0。经过一系列的数学推导,可以得到b的范围是{0 < b <= a + sqrt(a^2 + 1)}又从某OIer的博客中看到令f(b)= b + c即f(b)=b + (ab + 1) / (b - a)求导得到f(b)' = 1 - (a^2 + 1) / (b - a)^2,在区间(a, a + sqrt(a^2 + 1))上恒小于0,所以f(b)单调递减。View Code 1 program pku1183(input,output); 阅读全文
posted @ 2012-03-21 16:32 Codinginging 阅读(145) 评论(0) 推荐(0)
摘要:有三维坐标中的16个点,然后又有若干点,求每一个点和前16个点中哪个更近。View Code 1 program pku1046(input,output); 2 type 3 node = record 4 x,y,z : longint; 5 end; 6 const 7 oo = 10000000; 8 var 9 color : array[1..16] of node;10 now : node;11 answer : byte;12 procedure init;13 var14 i : long... 阅读全文
posted @ 2012-03-21 16:16 Codinginging 阅读(174) 评论(0) 推荐(0)
摘要:有一个字符串,每次只能从两端取,求取得的字典序最小的子符序列。每次比较剩余字符串的正向和反向字符串的大小,正向大就在尾取,否则在头取,相当于贪心了吧。View Code 1 program pku3617(input,output); 2 var 3 s1,s2 : ansistring; 4 answer : ansistring; 5 n : longint; 6 procedure init; 7 var 8 i : longint; 9 ch : char;10 begin11 readln(n);12 s1:='';13 ... 阅读全文
posted @ 2012-03-21 12:20 Codinginging 阅读(325) 评论(0) 推荐(0)
摘要:给一个n个顶点的图(怎么最近的随笔都拿这句话开头^_^),Q条询问,(x,y),查询从x到y的路径上的最大边的最小值。(Q<=40000)最大最小问题99%都是二分答案,这道题却偏偏是那1%.用floyd,最后的关键语句变成f[i,j]=min(f[i,j],max(f[i,k],f[k,j]))即可。算法执行后f[i,j]就是问题(i,j)的答案。View Code 1 program pku3615(input,output); 2 var 3 f : array[0..400,0..400] of longint; 4 n,m : longint; 5 q :... 阅读全文
posted @ 2012-03-21 12:04 Codinginging 阅读(364) 评论(0) 推荐(0)
摘要:给定一个n个顶点的完全有向图,求从0点出发遍历所有点之后回到0点的最小路径长度。网上很多人用floyd之后再dp的算法,看起来没什么意思,这种题正是二维SPFA的用武之地,d[now,state]表示到now点,状态为state的最短路径,其中state为把遍历情况压缩为二进制数的十进制值,SPFA之后输出d[0,(1<<(n+1))-1]即可,由于习惯问题,代码中我把所有的编号都+1了。View Code 1 program pku3311(input,output); 2 type 3 node = record 4 now,state : longint;... 阅读全文
posted @ 2012-03-20 15:34 Codinginging 阅读(242) 评论(0) 推荐(0)
摘要:题意抽象出来就是求(cell[i])^k mod m1^m2=0的最小的k值。把m1^m2分解质因数即可,再把每一个细胞数分解,对比其质因子数量,对于某个因子,m1^m2次有而后者没有,那么这种情况一定无解,继续枚举下一个细胞数即可,而两者都有时,就是要最少的后者的因子凑出大于等于后者因子的最小次幂,处理完每一个因子后取因子需要的最大值,用它去更新答案。注意m1=1时的特殊情况。View Code 1 program tyvj1105(input,output); 2 var 3 v : array[2..50000] of boolean; 4 prime... 阅读全文
posted @ 2012-03-18 18:13 Codinginging 阅读(1151) 评论(0) 推荐(0)
摘要:把质因子只有2,3,5的数称为Ugly数,求第k大的Ugly数。(1是第一个)用堆保存数字,开始堆中只有1,每次删除最小值,把最小值的2倍,3倍,5倍插入到堆中,执行k次就得到结果。注意要判重,用个hash就行,有点羡慕C++的map了。View Code 1 program pku1338(input,output); 2 type 3 longint = int64; 4 node = ^link; 5 link = record 6 worth : longint; 7 next : node; ... 阅读全文
posted @ 2012-03-18 17:11 Codinginging 阅读(584) 评论(0) 推荐(1)
摘要:给一个地图,其中有障碍物,开始人在起点的面对方向任意,求从起点到终点最少转几次弯。f[pos,x,y]表示人在(x,y)位置,面向方向pos时的最小步数,用BFS或SPFA即可。View Code 1 program lphone(input,output); 2 type 3 node = record 4 xx,yy,pos : integer; 5 end; 6 var 7 d : array[1..4,0..101,0..101] of longint; 8 v ... 阅读全文
posted @ 2012-03-18 15:08 Codinginging 阅读(578) 评论(0) 推荐(0)
摘要:很老的一道树DP,用树形DP的模型做,今天再写的时候居然沙茶的在计算过某状态后又重新计算,DP退化成了搜索,无奈。转成二叉树后枚举左右子树分配的资源量即可。View Code 1 program ctsc(input,output); 2 var 3 n,m : longint; 4 w,v : array[0..601] of longint; 5 left,right : array[0..601] of longint; 6 f : array[-100..601,-100..601] of longint;... 阅读全文
posted @ 2012-03-18 14:12 Codinginging 阅读(306) 评论(0) 推荐(0)
摘要:就是求个逆序对,基础编程能力还是要有的,交这个题时很囧。PKU也有不给力的时候啊!View Code 1 program merge_sort(input,output); 2 var 3 a,x : array[0..2000] of longint; 4 n,answer : longint; 5 cases,v : longint; 6 procedure init; 7 var 8 i : longint; 9 begin10 read(n);11 for i:=1 to n do12 read(x[i]);13 ... 阅读全文
posted @ 2012-03-17 11:57 Codinginging 阅读(252) 评论(0) 推荐(0)
摘要:求一个图的最小生成树,其中某些边不收费(可以这样理解)。这次用kruscal打的,对于不收费的边先全部加入,再维护即可。View Code 1 program pku2421(input,output); 2 var 3 father : array[0..200] of longint; 4 f : array[0..200,0..200] of longint; 5 x,y,w : array[0..40000] of longint; 6 n,m,q,answer : longint; 7 procedure ini... 阅读全文
posted @ 2012-03-17 11:15 Codinginging 阅读(157) 评论(0) 推荐(0)
摘要:给定一个序列,每次可取出一段任意长度的序列插到某个位置,问至少多少次操作能让序列变为1.2.3.4......n。如果步数超过4,输出“5 or more”可以用双向BFS,但编程复杂度较高,用迭代加深就需要动一点脑筋想强剪枝。题目的最终状态是1 2 3 4 5 6 7 8,则严格递增序列为1。所谓严格递增即是说1 2 3 4 5 6,这些,而2 5,2 4 6,这种只能称之为递增,那么1 2 5 6 3 4 7 8的严格递增序列有4个,而每次操作最多一次减少3个非严格递增序列,所以有这个剪枝:if 当前递增序列个数-3*(最大深度-当前深度)>=0 then exit加入这个剪枝不一定 阅读全文
posted @ 2012-03-17 10:49 Codinginging 阅读(277) 评论(0) 推荐(1)
摘要:给定一棵树,要求对于每一个节点,要么自己放联络器,要么儿子放联络器,要么父亲放联络器,求让所有点满足条件的最少联络器数。一道经典的看守皇宫问题,用DP解决。f[0,now]表示在now节点放联络器的以now为根的子树的最小代价f[1,now]表示now节点不放联络器,被他的儿子联络的以now为根的子树的最小代价f[2,now]表示now节点不放联络器,被他的父亲联络的以now为根的子树的最小代价注意树的形态开始并不确定,需要DFS一次来建树。状态的转移在程序里很清楚,输出答案是min{f[0,1],f[1,1]}(我以1为根节点重建的树),因为根节点不可能再有父亲了,f[2,1]没有意义。Vi 阅读全文
posted @ 2012-03-16 16:50 Codinginging 阅读(334) 评论(0) 推荐(0)
摘要:求一个图的最小生成树,用了prim,0ms,但前面WA了几次,这里进一步理解了prim,外部循环i只是控制次数,内部不用看i与j的值的关系,把d赋值成0,表示在树里,节省了一个布尔数组。View Code 1 program pku1258(input,output); 2 var 3 f : array[0..200,0..200] of longint; 4 d : array[0..200] of longint; 5 n : longint; 6 answer : longint; 7 procedure init; 8 var ... 阅读全文
posted @ 2012-03-15 12:01 Codinginging 阅读(212) 评论(0) 推荐(0)
摘要:给一些牛的排名关系,问有多少牛的排名确定。如果A比B强,就由A向B连边,之后求出这个图的传递闭包,对于一头牛,如果比它强的+比它弱的=N-1,它的排名一定。View Code 1 program pku3660(input,output); 2 var 3 g : array[0..101,0..101] of boolean; 4 answer : longint; 5 n,m : longint; 6 procedure init; 7 var 8 i,x,y : longint; 9 begin10 fillchar(g,sizeof(... 阅读全文
posted @ 2012-03-15 11:42 Codinginging 阅读(205) 评论(0) 推荐(0)
摘要:给定一个图,N个顶点,M条边,N值极小,对于每一条边,有ai,bi,ci,pi,ri这几个参数,表示这条边从ai到bi,如果之前经过了ci,那么费用是pi,否则费用为ri,求从1到N的最小费用。用f[i,j]为节点,i表示当前在哪个点,j转化为二进制数后为0位表示未经过这一点,为1这表示经过了这一点,进行SPFA即可{对j的解释,11:1011,表示经过1,3,4这三个点而没有经过2}View Code 1 program pku3411(input,output); 2 type 3 node = ^link; 4 link = record 5 ... 阅读全文
posted @ 2012-03-15 10:27 Codinginging 阅读(266) 评论(0) 推荐(0)
摘要:折叠的定义如下: 1. 一个字符串可以看成它自身的折叠。记作S @ S 2. X(S)是X(X>1)个S 连接在一起的串的折叠。记作X(S)即SSSS…S(X 个S)。 3. 如果A @ A’, B @ B’,则AB @ A’B’ 例如,因为3(A) = AAA, 2(B) = BB,所以3(A)C2(B) @ AAACBB, 而2(3(A)C)2(B) @AAACAAACBB 给一个字符串, 求它的最短折叠。一道DP题目,考试的时候在折叠时的转移搞乱了——用f[i,j]表示从i到j折叠后的最短长度,那么f[i,j]=min{f[i,k]+f[k+1,j] x<=k<y f[ 阅读全文
posted @ 2012-03-14 17:23 Codinginging 阅读(892) 评论(0) 推荐(0)
摘要:种类并查集的经典题目,和NOIP2010里的关押罪犯一个类型,0,1,2表示三个种类,在合并时用类似向量的方法去导公式,其他的模拟操作即可。View Code 1 program pku1182(input,output); 2 var 3 father,r : array[0..50000] of longint; 4 i,n,x,y,answer,k,t : longint; 5 function find(i : longint):longint; 6 var 7 temp:longint; 8 begin ... 阅读全文
posted @ 2012-03-14 16:45 Codinginging 阅读(222) 评论(0) 推荐(0)
摘要:这道题是一道经典的搜索剪枝题,每次听搜索的课总有这道题,剪枝思想主要就是最优化和可行性。最优化:当前面积+下面的最小面积>当前解可行性:1:当前剩余体积<做完剩余蛋糕需要的最小体积 2:当前剩余体积+做剩余蛋糕能用的最大体积<NView Code 1 program pku1190(input,output); 2 const 3 maxr = 30; 4 maxh = 30; 5 var 6 n,m,answer : longint; 7 minv : array[0..21] of int64; 8 mins ... 阅读全文
posted @ 2012-03-14 16:30 Codinginging 阅读(264) 评论(0) 推荐(0)
摘要:给定n个人的坐标,第一个人必须站在1 处,最后一个人站在L 处,其次让距离尽可能的相同。因此任意两个相邻的人相距必须与(L-1)/(n-1)【使用整数除法】相差最多为1,而且距离为(L-1)/(n-1)(整数除div)的个数尽可能的多,一个人由x移动到y的费用为|x-y|,求最小费用。问题转化为给定线段和最优长度,在最优长度最多的前提下费用最小,进一步说,就是在一堆最优长度中插入剩余的所有1.f[i,j]表示在前i个人就位后插入了j个(最优长度+1)的线段的最优解,DP方程直接看代码就行了,坐标式最好自己推导一下。View Code 1 program sunglasses(input,ou. 阅读全文
posted @ 2012-03-11 17:33 Codinginging 阅读(369) 评论(0) 推荐(0)
摘要:一开始有一个数n(1<=n<=1000000),两个人轮流对n 进行操作。每次可将n减去它的最大或最小的非零数位。现在给定G个N,问先手赢还是输。一道博弈问题,脑子一定要清晰,别想着想着自己乱了,那就太惨了。必败态和必胜态很好找,考试时就写了一个记忆化的博弈搜索树,结果悲剧的栈崩了两个点。其实可以转化成DP,f[i]为true表示i必胜,则f[i]=(not f[i-min[i]]) or (not f[i-max[i]]),实现很简单了。粘上我的博弈搜索记忆树··········& 阅读全文
posted @ 2012-03-11 17:09 Codinginging 阅读(444) 评论(0) 推荐(0)
摘要:本题谁都会做,在这里分析一下各个方法。1.按照说明模拟,不再累述。2.pascal同学有内置函数swap,但要注意数据类型了,longint不够2^32,int64不符合函数要求,只能用cardinal。3.最有水平的解法,位运算(n shr 16) or (n shl 16) 就是结果了。View Code 1 program p1201(input,output); 2 var 3 x:dword; 4 begin 5 assign(input,'p1201.in');reset(input); 6 assign(output,'p1201.out');re 阅读全文
posted @ 2012-03-11 16:09 Codinginging 阅读(235) 评论(0) 推荐(0)
摘要:一道线段树的典型应用,标记真强大,没事怕错就多下放几次标记,反正没什么错。View Code 1 program tree_line(input,output); 2 type 3 node = record 4 sum,mark : int64; 5 left,right,x,y : longint; 6 end; 7 var 8 tree : array[0..1000000] of node; 9 n,m,tot ... 阅读全文
posted @ 2012-03-09 16:42 Codinginging 阅读(165) 评论(0) 推荐(0)
摘要:给定N个数,每两个数有一个最大公约数,求最大的最大公约数。N<=10^5,每个数<=10^6枚举求是N^2*logN的,必定超时换一个思考的角度,如果我们假设最大公约数是多少,用多少时间可以判定是否成立呢?假设判定x,那么给变量每次加x,看有没有这个值,有的话就计数器加一,计数器一旦大于1,就成立,跳出即可。这样,我们开一个10^6的数组,v[i]记录值为i的数的个数,判定有没有值时就是O(1)的了,总体时间在max_number*logN左右View Code 1 program sgu499(input,output); 2 var 3 v : array[0..11000.. 阅读全文
posted @ 2012-03-09 16:03 Codinginging 阅读(621) 评论(1) 推荐(0)
摘要:一道看起来算法很明确的题目:给定N条平面上的线段,问最早在哪条线段处出现封闭图形,保证线段不相交。对平面上的点进行离散,之后用并查集维护,一旦出现两个端点在同一集合中,终止算法,输出即可。离散化的地方有必要说一下,很多人用HASH,很慢的,有人用平衡树,C++调库,psacal就吃了亏——说一下本人离散方法,三棵平衡树,第一棵存x坐标,第二棵存y坐标,第三棵存{(x在一中的排位)*一中的x个数+(y在二中的排位)}这样可以确定每个坐标都对应三中的一个值,不会有重复。AC的感觉不错!还要墨迹几句,SGU交pascal不能用exit(x),真不爽啊View Code 1 program sgu.. 阅读全文
posted @ 2012-03-07 18:18 Codinginging 阅读(360) 评论(0) 推荐(0)
摘要:最小覆盖问题,跟3041差不多,只不过有了不能覆盖点的限制,首先横竖染色,那么每个水坑要么没横着的覆盖,要么被竖着的覆盖,用染出色的该点木板颜色连边,求最大匹配即可。View Code 1 program pku2226(input,output); 2 var 3 map : array[0..51,0..51] of char; 4 x,y : array[0..51,0..51] of longint; 5 f : array[0..2500,0..2500] of boolean; 6 v : array[0..25... 阅读全文
posted @ 2012-03-04 18:19 Codinginging 阅读(179) 评论(0) 推荐(0)
摘要:给一个n*n的矩阵,其中有一些坏东西需要消灭,用激光炮每次消灭一行或一列中的所有坏东西,问最少次数。总结一下,对于每个坏东西,我们有两种方案消灭它,横着打或者竖着打,满足最小覆盖的定义,用方案做点(即每个坏东西的x坐标和y坐标),连边求最大匹配OKView Code 1 program pku3041(input,output); 2 var 3 f : array[0..1100,0..1100] of boolean; 4 v : array[0..1100] of boolean; 5 lk : array[0..1100] of longint; 6 ... 阅读全文
posted @ 2012-03-04 17:47 Codinginging 阅读(242) 评论(0) 推荐(0)
摘要:有两台机器A,B,分别有n,m个进程,有k个任务,每个任务要么在A的x进程上完成,要么在B的y进程上完成,但机器换进程要时间,求完成方案下的最短时间。最小覆盖问题,通式:方案有两个,作为二分图的对立点,而任务为点,完成每一个任务的两种方案连边,求最大匹配即可,因为“最小覆盖=最大匹配”很不理解输入里面的那个i有什么用??View Code 1 program pku1325(input,output); 2 var 3 f : array[0..201,0..201] of boolean; 4 lk : array[0..201] of longint; 5 ... 阅读全文
posted @ 2012-03-04 17:31 Codinginging 阅读(176) 评论(0) 推荐(0)
摘要:有两个长度为N的序列A和B,在A和B中各任取一个数相加可以得到N^2个和,求这N^2个和中最小的N个。把a,b数组排序后,用pos[i]表示当前与a[i]取得未取最小值的b[j]的编号j,也就是说pos[i]=k{a[i]+b[k]-->min}每次取min{a[i]+b[pos[i]]}输出,再将pos[i]加一即可,这个算法是n^2的,进一步思考,取一堆数中的最小值,可以用堆维护,nlognView Code 1 {为方便heap中存编号而不是具体值} 2 program sequence(input,output); 3 var 4 a,b,pos : array[0..... 阅读全文
posted @ 2012-03-04 16:54 Codinginging 阅读(613) 评论(0) 推荐(0)
摘要:给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数的定义可以转化为在序列中大于它和小于它的数的个数相等。序列总数就是以它为左端点的+以它为右端点的+它不做端点的怎么求看代码View Code 1 program median(input,output); 2 var 3 f,a : array[-100000..110000] of longint; 4 n,i,x : longint; 5 max,pos,answer : longint; 6 begin 7 assign(input,'median.in... 阅读全文
posted @ 2012-03-04 15:35 Codinginging 阅读(374) 评论(0) 推荐(0)
摘要:给一个有向图,顶点数少于50,有Q条询问(Q<=100000),对于每条询问(x1 y1),输出他们之间的最小密度路径的密度(长度比边数)两种实践方法,一个是FLOYD,再就是二维SPFA,注意数据有环,SPFA时要控制边数少于n才行,至于为什么,是困扰几代人的烦恼了。d[i,j,k]表示从i到j走过k条路径的最小路径长度floydView Code 1 program path(input,output); 2 var 3 i,j,k,l,m,n,w,p,x,y:longint; 4 max,tmp:real; 5 f:array[0..51,0..51,0..51] of... 阅读全文
posted @ 2012-03-04 15:29 Codinginging 阅读(447) 评论(0) 推荐(0)
摘要:这道题真是没法说,时间限制是5000ms,而且矩形数还少于5000,O(n^2)枚举即可啊!!View Code 1 program pku1468(input,output); 2 type 3 node = record 4 x1,y1,x2,y2 : longint; 5 end; 6 var 7 a : array[0..5001] of node; 8 answer,n : longint; 9 function cover(x,y :longint ):boolean;10 begin11 if (a[y]... 阅读全文
posted @ 2012-03-01 11:55 Codinginging 阅读(174) 评论(0) 推荐(0)
摘要:看到这个标题后我毅然交上了CTSC的树形DP,WA的结果不言而喻,囧仔细读题后有两种思路:1.把每个课程拆成两个点,对于时间发生矛盾的课之间(i‘-->j)(i-->j')下面应该是一个最大独立集问题了,点数减匹配数即可这个思路没有实践,如果有错,请指出。2.很多人都用这种方法,二分图一边是84个时间点,另一边是课程,连边之后求最大匹配即可View Code 1 program pku2239(input,output); 2 var 3 f : array[0..100,0..301] of boolean; 4 lk : array[0..301] of longint 阅读全文
posted @ 2012-03-01 11:53 Codinginging 阅读(345) 评论(0) 推荐(0)
摘要:这道题目就没有1274那么阴人,学生一边,课程一边,构造二分图,看最大匹配是否等于m就可以了View Code 1 program pku1469(input,output); 2 var 3 f : array[0..101,0..301] of boolean; 4 lk : array[0..301] of longint; 5 v : array[0..301] of boolean; 6 n,m,p,k : longint; 7 procedure init; 8 var 9 i,j,x,y : longint;10... 阅读全文
posted @ 2012-03-01 11:46 Codinginging 阅读(202) 评论(0) 推荐(0)
摘要:有n头牛,m个牛栏,其中每头牛都有自己愿意去的牛栏,求牛和牛栏的最大匹配。简单的二分图裸题,居然调了1节课,数据会阴人啊!!每行第一个数是说这一行接下来有多少个数,可是这些数完了这一行还有数,用read就悲催了!View Code 1 program pku1274(input,output); 2 var 3 f : array[0..301,0..301] of boolean; 4 v : array[0..301] of boolean; 5 lk : array[0..301] of longint; 6 n,m : longint; 7 proc... 阅读全文
posted @ 2012-03-01 11:42 Codinginging 阅读(150) 评论(0) 推荐(0)