随笔分类 - weekly exams
some interest or bt probleams
maybe they are easy for cows
摘要:MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0编号山脚的树是1w[i]表示从1号到i号节点的树的总质量。d[i]表示第i棵树距离山脚的锯木厂的距离。g[i]表示从i到n棵树都运到i地的锯木厂所用的费用。h[i]表示从1到i棵树都运到山底锯木厂所用的费用。f[i]表示中间的锯木厂建设在i处所用过的最小费用。MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0很容易写出朴素方程 f[i]=h[i-1]+g[j]+ h[j-1]-h[i]-(w[j-1]-w[i])*
阅读全文
摘要:有一棵树,求出以每个点为起点的最长路径长度后,找到最长的连续区间满足极差不超过M。有一个重要的性质,一个点为起点的最长路的终点一定是直径的某个端点,问题转换为直径,O(n)之后ST处理出区间最值O(nlogn)用类似队列的维护形式求最长区间 O(n)View Code 1 {$inline on} 2 {$M 10000000000} 3 program race(input,output); 4 type 5 node = ^link; 6 link = record 7 goal,w : longint; 8 n...
阅读全文
摘要:有一个天平,天平左右两边各有若干个钩子,总共有C个钩子,有G个钩码,求将钩码全部挂到钩子上使天平平衡的方法的总数。(距离小于15,重量小于25,钩子和钩码都少于20个)其中可以把天枰看做一个以x轴0点作为平衡点的横轴。别看数据小,搜索只能过3个点,那方案数巨多无比,要用int64。定义平衡度:当前所挂砝码分别乘其坐标的和,很明显平衡度=0时满足条件。用f[i,j]表示当前挂到第i个钩子,平衡度为j的方案数,f[i,j]=xigema{f[i-1,k-x[k]*y[i]]},y记坐标,x记重量。View Code 1 program balance(input,output); 2 const.
阅读全文
摘要:给你两个串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]
阅读全文
摘要:在一个笛卡尔平面坐标系里(则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
阅读全文
摘要:给一个地图,其中有障碍物,开始人在起点的面对方向任意,求从起点到终点最少转几次弯。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 ...
阅读全文
摘要:很老的一道树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;...
阅读全文
摘要:折叠的定义如下: 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[
阅读全文
摘要:给定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.
阅读全文
摘要:一开始有一个数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]]),实现很简单了。粘上我的博弈搜索记忆树··········&
阅读全文
摘要:有两个长度为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.....
阅读全文
摘要:给出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...
阅读全文
摘要:给一个有向图,顶点数少于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...
阅读全文

浙公网安备 33010602011771号