zoukankan      html  css  js  c++  java
  • ARC070 简要题解

    ARC070 简要题解

    A

    往厕所里一蹲

    然后发现对于 (i) , ([1, frac{i(i+1)}{2}]) 的点均可达

    没了

    B

    我有一个绝妙的思路

    首先一个数 (a_i) 会产生影响当且仅当能够有若干个数的和在 ([k - a_i, k))

    前缀跑一遍背包, 后缀跑一遍, bitset 优化一下, 然后把后缀的 reverse 一下

    对于每一个点讨论 ([k - a_i, k)) 中的每一个值

    发现对应的是前缀背包和后缀背包的一段卷积, 正好后缀又 reverse 了

    所以就会是 前缀背包的 一段前缀 , 和 后缀 reverse 过的背包的 一段前缀 , 与一下, 看有没有 1

    没写过所以不知道复杂度

    网上的解法是这样的

    可有可无的数必定是从最小值开始的一段连续的数

    证明挺简单的

    所以二分, 然后 check 里面跑背包, bitset 优化

    复杂度 (O(frac{N^2log N}{64}))

    C

    暴力 DP 很好想, 设 (f[i][j]) 为第 (i) 个矩形左端点放到 (j) 的最小花费

    (len_i) 为第 (i) 个区间的长度, (l_i, r_i) 为第 (i) 个区间左, 右端点, 则有

    [f[i][j] = min(f[i - 1][k])+|j-l_i|, k in [j-len_i+1,j+len_{i-1}-1] ]

    范围可能写错了, 最好是自己手推一下

    然后那个 (min) 里面那个式子是一个斜率依次递增的直线构成的凸包, 右边那个是个 "V" 型函数

    发现跟 [APIO2016]烟火表演 挺像的

    不妨设斜率为零的那部分的横坐标是 ([l, r]) , 我们把 DP 方程换一换, 设 (f_i(x)) 为第 (i) 个矩形左端点在 (x) 的最小花费

    先设 (L = len_i - 1, R = len_{i+1}-1)

    那么就会有

    [f_{i+1}(x)=egin{cases}|x-l_{i+1}|+f_i(x+R), xin(-infin, l-R)\|x-l_{i+1}|+f_i(l), xin[l-R,r+L]\|x-l_{i+1}|+f_i(x-L),xin(r+L,+infin)end{cases} ]

    原因是如果决策区间中不包含斜率为 (0) 的那一段的横坐标那就尽量靠近斜率为 (0) 的选, 这样花费少

    如果包含就选上

    发现上面那个东西就是把原来 (f_i) 函数的 ((-infin, l]) 左移 (R) , ([r, +infin)) 右移 (L) , 然后再插进去一个 (|x-l_{i+1}|) 函数

    可以用堆维护拐点, 因为左边也要平移, 右边也要平移, 一个拐点代表在这个点斜率加了 (1)

    所以写两个堆, 一个存斜率为 (0) 直线左边的拐点, 一个存右边的

    然后按上面的转移即可

    D

    先咕着

  • 相关阅读:
    简单的测试用例计划放法
    黑盒测试用例设计方法-等价类划分
    Redis净化板
    爬虫部署与Django
    怎样实现前端的优化
    关于Apache简介笔记
    yield生成器的经典案例
    石头剪刀布
    函数内是否可以修改传递进来的列表
    不定长参数的传递
  • 原文地址:https://www.cnblogs.com/ztlztl/p/13687481.html
Copyright © 2011-2022 走看看