[DP][线段树][离散化][细节][坑] XDOJ 1324

离散化写挫了就wa了n发。。

先按照右端点排序,设dp[i]为铺满1到i的最小价值,注意是铺满,那么就可以在这里更新dp[r[i]]=min(dp[j])+v[i]  l[i]<=j<=r[i],注意这里有一个-1,对于左端点来说,因为如果两个线段相邻二不相交,比如(1,2)(3,4),这样其实也是可以的。这里的话,如果直接把端点离散化,就会导致后面的操作很复杂,因为要考虑相邻中间有没有空(我也是这么错的),所以不如直接在一开始读入左端点的时候就给他-1,这样之后就不用什么多余的操作了,直接每次线段树查询最小值即可。 继续阅读“[DP][线段树][离散化][细节][坑] XDOJ 1324”

[算法学习] 可持久化线段树基础题 SPOJ D-query

题意问给出一个序列然后q个询问问[l,r]之间有多少种不同的数。这里最简单的思想就是用可持久化线段树,每加入一个点作为一个版本,然后如果某一个点之前出现过那么就在新版本里把那个位置点的计数-1,再把现在这个位置+1,这样的话要求[l,r]中的数字有多少种那就只需要对第r个版本的线段树求[l,r]之间的和就行了,思路并不复杂(毕竟入门题 继续阅读“[算法学习] 可持久化线段树基础题 SPOJ D-query”

[算法学习] 可持久化线段树基础题 K-th Number

终于要搞可持久化数据结构了

在综合看了了n个大犇的博客和clj的论文之后总算是写了第一道可持久化线段树的题目。话说SCU真的很严格,这个代码在其他地方都过了就是在SCU上TLE。。。所以这个更快版本的今天先放着以后搞出来再说。。。

其实思路倒也不是很复杂,首先说求[1,n]的第k大。 继续阅读“[算法学习] 可持久化线段树基础题 K-th Number”