摘要: LCA参考Yuan神博客:/*题意:给出一棵节点有值的树,给出Q个询问(a,b),问从a到b的最大盈利(即:先在最小值买入,再在最大值卖出)我有想过用一个新序列w2-w1,w3-w2,,wn-wn-1这样只需用O(n)求得最大子段和即为结果Max-Min了但Q很大,每次都找一个路径会超时用类似Tarjan算法进行处理,但在find()那里要修改一下对每个几点记录4个值up[v]表示从v到目前的根的最大盈利down[v]从目前的根到v的最大盈利Max[v]表示到目前的根的最大值Min[v]表示到目前的根的最小值转移看update!在LCA(u,v)处再来计算,这样那四个值才是正确的值!!*/#i 阅读全文
posted @ 2013-05-31 17:20 Titanium 阅读(1749) 评论(1) 推荐(0) 编辑
摘要: LCA题意:先给出一棵无根树,然后下面再给出m条边,把这m条边连上,然后每次你能毁掉两条边,规定一条是树边,一条是新边,问有多少种方案能使树断裂。我们知道,这m条边连上后这颗树必将成环,假设新边为(u,v),那么环为u---->LCA(u,v)------->v-------->u,我们给这个环上的边计数1,表示这些边被一个环覆盖了一次。添加了多条新边后,可知树上有些边是会被多次覆盖的,画图很容易发现,但一个树边被覆盖了2次或以上,它就是一条牢固的边,就是说毁掉它再毁掉任何一条新边都好,树都不会断裂,这个结论也是很容易证明的,画图更明显,所以不累述所以这启发了我们,要统计所有 阅读全文
posted @ 2013-05-31 17:19 Titanium 阅读(1861) 评论(0) 推荐(0) 编辑
摘要: 递推(DP)http://codeforces.com/contest/313/problem/B题意:比较好懂,一个字符串只有.或者#字符,给你一段区间[x,y],其实y>x,让你在这个区间里面统计一个数字,即这个子串,相邻两位,若s[i]=s[i+1]则计数一次,然后输出结果这题一看,其实想到了线段树,因为原串,如果一段连续的.....则看成是一串白色的段,一段连续的#####则看成是一段黑色的段,那么原串可以看成是线段树的总区间被一系列的黑白段覆盖,对于每个查询就在线段树上查询它被什么黑白段覆盖,并且覆盖了多长,不过鉴于比赛时间短,而且好像大材小用的感觉,就没再往线段树上面想,比赛 阅读全文
posted @ 2013-05-31 08:36 Titanium 阅读(374) 评论(0) 推荐(0) 编辑