摘要: 给你一颗苹果树,树的主干设为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 ... 阅读全文
posted @ 2012-04-14 11:54 Codinginging 阅读(255) 评论(0) 推荐(1) 编辑
摘要: 裸的求最近公共祖先,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... 阅读全文
posted @ 2012-04-14 11:02 Codinginging 阅读(185) 评论(0) 推荐(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 ... 阅读全文
posted @ 2012-04-14 10:37 Codinginging 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 求区间最值之差,需要Qlogn的算法,可以用线段树或者ST。线段树1750msView Code 1 program pku3264_line_tree(input,output); 2 type 3 node = record 4 left,right,x,y,minx,maxx : longint; 5 end; 6 var 7 tree : array[0..500000] of node; 8 n,q : longint; 9 a : array[0..200000] of longint;10 to... 阅读全文
posted @ 2012-04-14 09:56 Codinginging 阅读(181) 评论(0) 推荐(0) 编辑