2014 Xian Online

来源:互联网 发布:js自适应瀑布流 编辑:程序博客网 时间:2024/05/01 20:23

hdu5008
字符串的不同子串从小到大排序,求第小大的子串的最小的起始位置
思路:后缀数组处理出字典序前k小的后缀的不同字符串个数。然后二分一下得到第k小的字符串在字典序中的最小后缀起始点x。接着求一下字典序x到n的后缀的LCP不大于第k小的子串长度的最大字典序y,这个可以在height数组中通过RMQ+二分求出。最后在[x,y]中求出起始的最小下标。这个可以在sa数组中RMQ求出。

hdu5009
反向迭代器很慢,不如定义一个比较函数

struct compare{    bool operator ( ) (int s1, int s2)    {        return s1 > s2;    }};set<int,compare> S;//S可以从大到小存储

将a[1..n]分成若干块,每一块的代价是该块中不同元素个数的平方,求分配方案中总和的最小值。
每一块最多存储“块长度的根号倍”的颜色数目。按照该性质,只要向前枚举根号次即可。如何记录第i个位置之前的根号i个不同颜色的位置?用last数组表示某颜色最后出现的位置,将所有位置存储到set中,每次顺序查询最多根号i次。
总复杂度:O(n*sqrt(n))

5013
期望后向推倒公式。
如何快速求b[i]=jia[j],b[0..2n1],a[0..2n1]
dp[k][i]=jika[j]
j是i的k子集:i的最低k位进行子集枚举,其余位不变
1.i&(1<<(k1))==1
dp[k][i]=dp[k1][i]+dp[k1][i2(k1)]
2.or
dp[k][i]=dp[k1][i]

hdu5014
找规律,log级别复杂度构造

hdu5016
树分治。
树上每个点权值为0或1。我们现在要找到一个权值为0的点,使得树上所有权值为0的点到达该点的距离与到达权值为1的点的距离相比而言最小的点数最多。如果距离相同,选择编号越小的点
预处理每个点到达权值为1的点的最小距离和点的编号。
现在将以某点作为最小距离点的贡献分成两部分:经过重心的点和不经过重心的点。经过重心的点,点j如果满足:
MP(d[i]+d[j],i) < MP(f[j], id[j])
<=> MP(d[i],i) < MP(f[j]-d[j],id[j])
那么点j对点i有贡献。二分/双指针求满足条件的个数。

0 0
原创粉丝点击