随笔分类 - pku
摘要:题目大意: 有一段长为n的线段,在这条线段上进行操作: 1.找出最靠前的长度为l的空线段,并把一个长为l的线段插入在这个地方. 2.删除从某点开始长为l的一段线段(有可能并不存在,总之就是把这个区间清空). 输出每次插入操作的位置.题目分析 线段树的经典题,练习块状链表写的好长啊,伤心ing 用块状链表的话,对于每一个块需要维护以下信息,包含左端点的最长空白,包含右端点的最长空白,这一块内的最长空白及其开始位置,最后是该块是否被完全赋值的标记。 对于查找操作,我们从头向后查找,维护包含当前块的最长空白长度,注意处理答案存在于块的头部的信息,而且当一个块内有答案时,他不一定是最长空...
阅读全文
摘要:【题目大意】开始时有两个变量(A=x^a,B=x^b),每次可以做以下爱几种运算:A*B,A*A,B*B,A/B,B/A,A/A,B/B并把结果放到某个变量中,问最少多少步可以得到目标X^P【题目分析】我们可以只记录当前两个变量的指数,这样各种操作就变成了加和减,可以直接进行BFS,但是显然会超时,于是我们先从状态入手,规定a<=b,这样就把状态数减少了一半,而操作中的除法也就只剩下b/a这一种情况了,再继续考虑优化。对于各种操作,其实A*A这个变化时与一些操作重复的,所以可以去掉这个变换,这样就减少了搜索树结点的度,使能达到的节点数更少了。状态树上已经不能再优化了,继续考虑较少扩展量,
阅读全文
摘要:问题抽象成图论,对于每一对欢迎关系(A,B),我们从A向B连一条有向边,得到的图是有可能存在环的,在原图上使用Tarjan算法,得到一个新图(有向无环),如果缩后仅剩一个点,答案为n,即任意点都被其他点欢迎,否则统计每一个新点的出度,对于出度为0的点的个数1:答案是该点包含的原图点数,其他的牛都不能被他们欢迎>=2:答案为0,出度为0的点间互不欢迎。View Code 1 program pku2186(input,output); 2 type 3 node=^link; 4 link=record 5 goal:longint; 6 ...
阅读全文
摘要:需要这样一个数据结构,支持如下操作1:插入优先级为p,编号为k的节点2:查询优先级最高的节点,输出编号并删除3:查询优先级最低的节点,输出编号并删除用一颗SBT即可完美解决问题,没什么好说的,多说无益~~~View Code 1 program pku3481(input,output); 2 var 3 left,right,key,s,th:array[0..200000] of longint; 4 tot,root:longint; 5 procedure left_rotate(var t:longint); 6 var 7 k:longint...
阅读全文
摘要:有一个仓库,在时间段[M,E]需要一直被打扫。现在有n头奶牛来干这项工作。每头奶牛都有一个工作时间段[start,final],并且需要付的费用是cost。问题是聘用哪些奶牛能使费用最少?允多头奶牛在同一时间工作。先把区间按照final升序排列,然后进行DP,考虑到范围较大,O(L^2)超时,引入线段树进行优化,将决策的复杂度降到logn。还要输出-1,WA死了。。。这是我的pku第100题,庆祝啊,激动死了。。View Code 1 program pku3171(input,output); 2 type 3 node=record 4 left,righ...
阅读全文
摘要:有n个火车站,从一个站点到另一个站点的费用C与它们的距离L有关,有3种距离,对应有3种费用。现在求从一个站点S到另一个站点E所需的最小费用。很简单的DP,难度等价于数字三角形,注意:输入中起点不一定大于终点View Code 1 program pku2355(input,output); 2 var 3 f :array[0..10010] of longint; 4 d :array[0..10010] of longint; 5 l,c :array[1..3] of longint; 6 x,y :longint; 7 ...
阅读全文
摘要:准确的说,这个题叫递推,不叫DP,用f[i,j]表示长度为i,和为j的方案数f[i,j]=∑f[i-1,j-k]边界见程序。View Code 1 program pku2346(input,output); 2 var 3 f:array[0..5,0..45] of int64; 4 answer:array[0..11] of int64; 5 n:longint; 6 i,j,k:longint; 7 begin 8 fillchar(f,sizeof(f),0); 9 for i:=0 to 9 do10 f[1,i]...
阅读全文
摘要:一道经典贪心题,用并查集来优化。万恶的pku,这题pascal读入必须用seekeof判断是否读完数据,否则WA死你。。。View Code 1 program pku1456(input,output); 2 var 3 x,w :array[0..11000] of longint; 4 f :array[0..11000] of longint; 5 n :longint; 6 answer :longint; 7 procedure swap(var aa,bb:longint); 8 var 9 ...
阅读全文
摘要:最大的移动时间取决于被经过次数最多的一个房间,把每个移动看做一个区间,覆盖1-400的点,特别的,有时区间端点需要加减,因为它会影响后面一个点(前面一个点)。View Code 1 program pku1083(input,output); 2 var 3 cover:array[0..801] of integer; 4 x,y,n:longint; 5 cases:longint; 6 i,j:longint; 7 answer:longint; 8 procedure swap(var aa,bb:longint); 9 var10 t...
阅读全文
摘要:求一个图中到其他点的最短路的最大值最小的点和这个值。floyd一遍完事View Code 1 program pku1125(input,output); 2 var 3 f:array[0..300,0..300] of longint; 4 n:longint; 5 procedure init; 6 var 7 i,j,s,x,y:longint; 8 begin 9 fillchar(f,sizeof(f),30);10 for i:=1 to n do11 begin12 read(s);13 for ...
阅读全文
摘要:这道题需要涉及到置换群的知识,只需知道一个定理。最小交换次数=元素个数-环的个数。View Code 1 program pku1674(input,output); 2 var 3 number :array[0..11000] of integer; 4 v :array[0..11000] of boolean; 5 n,cases:longint; 6 answer :longint; 7 procedure init; 8 var 9 i:longint;10 begin11 readln(n);12 for i:...
阅读全文
摘要:石头剪刀布,每个人出什么已知,你可以决定他们游戏的顺序,有多少人有可能赢分情况:1:对于石头剪刀布都有的情况,这个值是n 2:对于只有两种的情况,答案是两种对抗能赢得那种的人数 3:只有一种的情况,答案是nView Code 1 program pku2232(input,output); 2 var 3 n,i :longint; 4 c,s,f:longint; 5 ss:ansistring; 6 begin 7 while not eof do 8 begin 9 c:=0;s:=0;f:=0;10 ...
阅读全文
摘要:统计字符串中各个字母出现的次数并且输出一个柱状统计图,注意用鼠标去划一下,每两个‘*’柱之间有空格。。其他的就是模拟了,水题View Code 1 program pku2136(input,output); 2 var 3 map :array[0..73,'A'..'Z'] of boolean; 4 number:array['A'..'Z'] of integer; 5 max:longint; 6 procedure init; 7 var 8 s:ansistring; 9 i,j:longint;10 begin11
阅读全文
摘要:设计一个程序,能够在logn的时间内求出两个区间的并,交,相对补,相对差。一个区间内如果为1,就表示这个区间存在,为0表示不存在。线段树的应用,lazy思想的完美应用,对于一个节点,cm标记为1时,表示其区间内均为1,0表示区间内均为0,2表示区间内既有0又有1cx标记取反,为1时表示区间取反,0时表示不取反。标记下传时cm优先。U:把区间[l,r]覆盖成1 I:把[-∞,l)(r,∞]覆盖成0 D:把区间[l,r]覆盖成0 C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换 S:[l,r]区间0/1互换poj数据NND没有判错,得自己判,错的当∅还不能忽略,最阴的地方有这种
阅读全文
摘要:把一个字符串按照特定的符号分成5分,把后四份按照特定的顺序插入后一个字符串的‘...’处,最后将去掉符号的字符串输出即可。View Code 1 program pku1917(input,output); 2 var 3 s : array[0..6] of ansistring; 4 ss,x : ansistring; 5 cases : longint; 6 i,tmp : longint; 7 begin 8 readln(cases); 9 while cases>0 do10 begin11 dec(case...
阅读全文
摘要:平面中n个点,求每个点左下点的数量,直接上树状数组,题目数据以y为第一关键字,x为第二关键字升序排列了,所以只需从1到n依次插入横坐标,统计之前的小于当前点的横坐标的点数即可,注意树状数组上限是坐标最大值,不是n,同时坐标还有0的可能,所以都加1才行。View Code 1 program pku2352(input,output); 2 var 3 c : array[0..40000] of longint; 4 x,y,answer : array[0..40000] of longint; 5 n,maxx : longint; 6 pro...
阅读全文
摘要:需要一个这样的数据结构,每次能修改矩阵中的某一个值,还可以查询某个子矩阵的权值和。二维树状数组没压力啊。View Code 1 program pku1195(input,output); 2 var 3 c : array[0..1500,0..1500] of int64; 4 n,kk : longint; 5 function lowbit(x: longint ):longint; 6 begin 7 exit(x and (-x)); 8 end; { lowbit } 9 procedure insect(x,y,w :longint );10 va...
阅读全文
摘要:给你一颗苹果树,树的主干设为1,每一个分支设为一个数,一直到N,代表这颗苹果树。每个分支上面只能最多有一个苹果。下面是两种操作,Q 和CC j 的意思是如果 j 这个枝上面有苹果就摘下来,如果没有,那么就会长出新的一个Q j 就是问 j 这个叉上面的苹果总数。先一遍DFS确定树的形态,再一遍DFS求出每各节点标号后作为根的子树标号范围,有DFS性质,这个范围一定连续,接下来问题转化为在某一个点加一或减一,查询区间和,用树状数组完成。View Code 1 program pku3321(input,output); 2 type 3 node = ^link; 4 ...
阅读全文
摘要:裸的求最近公共祖先,LCA-->RMQ,没什么大问题,只不过标号不再完美,需要在深度序列中找最小值,最后再对应回去。View Code 1 rogram pku1330(input,output); 2 type 3 node = ^link; 4 link = record 5 goal : longint; 6 next : node; 7 end; 8 var 9 tree : array[0..31000] of node; 10 eurl : array[0...
阅读全文
摘要:有一个长度为n(n<=100000)的有序序列,对于Q(Q<=100000)条询问(x,y)输出区间[x,y]中出现次数最多的数的次数。用maxl表示包括左端点的最长重复数的个数maxr表示包括右端点的最长重复数的个数sum表示在该区间内重复数的最大个数,那么就很容易建立线段树,由儿子节点去求父亲节点,具体的规划式在程序里很清楚。View Code 1 program pku3368(input,output); 2 type 3 node = record 4 left,right,x,y,maxl,maxr,sum : longint; 5 ...
阅读全文