2014 Xian Online

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值