首页 > 代码库 > 2014 8.7 第8场个人 排位

2014 8.7 第8场个人 排位

FZU 2079  最大获利(dp)

自己很难想到,囧

dp[i]表示处理完前i 个点的最大收益。
有两种情况:
(1)第i 个点不投资,那么dp[i] = dp[i - 1]
(2)第i 个点投资,那么dp[i] = max(dp[k] + get(k + 1,i) - sigma(c[j]) (k + 1 <= j <= i))(0 < k <
i)
这个的意思是,[k + 1,i]点选择全部投资,所以sigma(c[j])表示每个点都投资了,get(k +
1,i)的意思是,[k + 1,i]完全包含了的给出区间的总价值
第二步需要优化,我们发现,任意一个dp[i]的转移dp[k],sigma(c[j]),即dp[k] 减去了从k
+ 1,i 的每个数c[i],所以每做到一个数i,给1..i - 1 中的每个dp 值减去c[i](因为以后要用
某个dp 转移的话,后面的每个数都被减了一次)。第二个是收益[Li,Ri,Pi],同样的方法,
选择了dp[k],k < Li 的话,意味着get(k + 1,i)增加了Pi,所以给1...Li - 1 的每个dp 值加上Pi

赛后代码:

view code


FZU 2056 最大正方形(二分,水题)

刚开始看题目还以为是长方形,最近老是看错题目

view code


FZU 2082 

方法一:树链剖分最入门的题目,复杂度nlognlogn(第一次听说树链剖分)
方法二:随便选一个点作为root,dfs 一次求出root 到某个点的距离,并且得到dfs 序。
一个显然的事实:dis(u,v) = dis(root,u) + dis(root,v) - 2 * dis(root,lca(u,v)),因此任意两个点的
距离可以直接用到root 的距离算出来。dis(root,i)表示从根到i 的距离,dis(u,v)是u 到v 的距

修改操作是,如果给(fa(u),u)这条边增加了一个值x,那么dis(root,u)增加x,且其后代每个
点的dis(root,i)都增加了x,这个操作,直接用得到的dfs 序维护即可

(把dfs序列得到的dis弄到线段树上,对于root所有子节点增加x,相当于成段更新,因为root的所有子节点是连续的线段)!!

view code

 

FZU 2057 家谱(简单的遍历)

view code



FZU 2059 MM(暴力)

因为最多只有10次修改,就把当作最多有10个子case就好了

view code



FZU 2060 The Sum of Sub-matrices(状态压缩dp,不会)


FZU 2030  括号问题(dfs/dp)

view code