杂题:
-
CF 908 G
分开计算每个数字的贡献,即 ∑ d = 1 9 d ∗ v a l ( d ) \sum_{d=1}^9d*val(d) ∑d=19d∗val(d),其中 v a l ( d ) val(d) val(d)是 ∑ 1 0 i \sum10^i ∑10i的形式,直接数位DP需要知道大于和等于 d d d的个数,复杂度较高。改为求 ∑ d = 1 9 ∑ i = d 9 v a l ( i ) \sum_{d=1}^9\sum_{i=d}^9val(i) ∑d=19∑i=d9val(i),枚举 d d d,就只需要知道大于等于 d d d的个数 k k k,贡献就是 ∑ j = 0 k − 1 1 0 j \sum_{j=0}^{k-1}10^j ∑j=0k−110j,数位DP就变成了 O ( n 2 ∗ 9 ∗ 2 ∗ 9 ) O(n^2*9*2*9) O(n2∗9∗2∗9).
cnblogs题解. -
AGC 024 F
总串数是 O ( 2 N ) O(2^N) O(2N)级别。考虑对于每个串,计算它是集合中多少个串的子序列。
题解
笛卡尔树DP:
-
BZOJ 4380
· 首先将权值离散化。 n n n很小,所以我们可以直接将状态设为 F [ i ] [ j ] [ k ] F[i][j][k] F[i][j][k]表示区间为 [ i , j ] [i,j] [i,j]最小值为 k k k的最大收益(只考虑 i ≤ a ≤ b ≤ j i\le a\le b\le j i≤a≤b≤j的人)。
· 转移时枚举最小值的位置 x x x,那么就可以用 F [ i ] [ x − 1 ] [ p ≥ k ] + F [ x + 1 ] [ j ] [ q ≥ k ] + C o s t ( i , j , k , x ) F[i][x-1][p\ge k]+F[x+1][j][q\ge k]+Cost(i,j,k,x) F[i][x−1][p≥k]+F[x+1][j][q≥k]+Cost(i,j,k,x)来更新答案,其中 C o s t ( i , j , k , x ) Cost(i,j,k,x) Cost(i,j,k,x)表示 i ≤ a ≤ x ≤ b ≤ j i\le a\le x\le b\le j i≤a≤x≤b≤j的人在价格为 k k k的店洗车的收益之和,可以在枚举 x x x的时候弹队列实现,也可以高维前缀和实现。 F F F用一个简单的后缀max即可。
· 复杂度 O ( n 3 m ) O(n^3m) O(n3m)。 -
BZOJ 2616
算得上笛卡尔板子题了吧。。题解。 -
AGC 026 D
先考虑矩形的情况。
· 分析2*2的格子恰好两红两蓝的条件:先确定第一行的颜色,如果设第二行的颜色为第一行的反色,显然是可以的。如果第一行存在两个相邻格子颜色相同,那么反色将是唯一的可行方案(从相同处往两边延伸可得)。如果不存在,那么除了反色之外,第二行与第一行完全相同也是一种可行方案。
· 然后就DP区间记录存在相邻格子颜色相同和不存在的方案数,用solve(l,r,k)表示解决区间 [ l , r ] [l,r] [l,r]在 k k k以上的部分,每次对于这段区间把下面整块矩形的部分砍掉,上面部分递归处理。代码实现见:bestfy’s blog -
LOJ 2743 摩天大楼 (BZOJ 4664: Count)
分段DP,分步贡献。题解
这题好像跟笛卡尔树没太大关系,就是合并两个段的时候形成了笛卡尔树的一棵子树(没什么用)。