A

不难发现从 \(5\) 开始一直往 \(6\) 转再转回来是最优的,直接模拟即可。

B

不难发现可以将多余部分直接贪心消去,最后必然会剩下两个或 \(1\) 个多余的数。

如果剩下两个,此时多余的数必然是偶数个,取之前序列中和这两个数中一个相等的数即可将这两个数消去,不浪费一个数。

否则,此时多余的数必然是奇数个,一定需要找到和这一个数相等的数和另一个数,需要浪费一个数。

C

首先的一个想法是对于一个商品 \([l, r]\) 将 \(l \rightarrow r\) 之间的每个数加 \(1\),然后对于每辆车直接调和级数查询。

不难发现这样会记重,因为可能一辆车能跳到的位置可能会被一间商品覆盖多次。

那么一个很直接的想法就是思考怎么才能不计重。

那么对于一件商品 \([l, r]\) 和第 \(d\) 辆车,当且仅当存在若干个 \(d\) 的倍数在 \([l, r]\) 之间时才会被记重。

一个很直接的想法就是只让这若干个倍数只有一个被记录,为了方便,我们考虑只记录第一个包含在 \([l, r]\) 内 \(d\) 的倍数。

假设第一个在区间内 \(d\) 的倍数为 \(kd\),那么不难发现这个区间的左端点必然处于 \(((k - 1)d, kd]\) 之间,右端点必然在 \([kd, m]\) 之间。

于是问题就转化为,对于 \(d\) 的每个倍数 \(kd\),求出左端点在 \(((k - 1)d, kd]\) 之间,右端点在 \([kd, m]\) 之间的区间个数。

我们限制一方的端点,不难发现问题进一步转化为限制右端点在 \([kd, m]\) 的区间中,左端点在 \(((k - 1)d, kd]\) 之间的区间个数。

不难发现将区间挂在右端点上,直接主席树即可,复杂度 \(O(n \log ^ 2 n)\)。

然而有没有更为简单的方法呢,答案是有的。

需要发现这样一条性质,对于一个区间 \([l, r]\) 令 \(len = r - l + 1\),那么对于 \(d \ge len\) 的车辆,一定可以获得该区间的商品。

这意味着对于每辆车 \(d\),\(r - l + 1 \ge d\) 的区间我们是不需要处理去重的问题的,只需要在答案上加上这部分商品的数量即可。

那么对于 \(r - l + 1 < d\) 的区间呢?

不难发现这样的区间最多只会包含一个 \(d\) 的倍数,因此这部分也是不需要去重的,直接统计即可。

实现时将区间按照长短排序,双指针扫过来,使用树状数组动态加入线段,复杂度 \(O(n \log ^ 2 n)\)。

D

近期的一些 \(dp\) 题 中已经详细记录了本题 \(O(n ^ 2)\) 的 \(dp\) 解法,下面是一个基于 \(dp\) 的 \(O(n)\) 优化。

观察一下 \(dp\) 方程:

\[dp_{i, j} = \sum\limits_{k \ge j} dp_{i - 1, k}(j \ne 1, j \le n - i + 1)
\]
\[dp_{i, j} = \sum\limits_{k > j} dp_{i - 1, k}(j = 1, j \le n - i + 1)
\]

事实上这个 \(dp\) 的转移方程是具有组合意义的,首先不看方程后面的限制,不难发现这是从 \(n + 1\) 走到 \(1\) 恰好走 \(k\) 步的方案数。

为了方便起见,我们将这个过程倒过来看,看作是从 \(0\) 开始走 \(k\) 步走到 \(n\) 的方案。

那么那两个多余的限制就等价于最后一步走的步数必须不为 \(0\) 且对于每一个走了 \(i\) 步的位置,满足之前一共走的步数不能低于 \(i\) 步。

单看后面这个限制是一个经典的组合数问题,将问题具体化放到坐标系下看待。

那么问题就等价于从 \((0, 0)\) 开始走到 \((k, n)\) 走 \(k\) 步,每一步横坐标必须 \(+1\) 纵坐标无限制,且这整条路线必须在 \(y = x\) 之上的方案。

如果没有在 \(y = x\) 之上这条限制,答案就相当于解一个非负整数不定方程的解,运用插板法即为 \(\dbinom{n + k - 1}{n}\)。

下面来考虑存在一段路线在 \(y = x\) 之下的非法情况。

将 \(y = x\) 下移一个单位长度,变成 \(y = x - 1\)。

取 \((0, 0)\) 关于 \(y = x - 1\) 的对称点 \((1, -1)\),不难发现每一个非法的走法都必然会经过 \(y = x - 1\),令第一次经过的点为 \(A\)。

将从 \((0, 0)\) 开始一直到 \(A\) 的这条路线翻折,都会唯一对应一条从 \((1, -1)\) 开始沿着这条翻折路线再沿着前者在 \(A\) 之后走的路线。

由此不难证明从 \((0, 0)\) 走到 \((k, n)\) 的非法路径,和从 \((1, -1)\) 走到 \((k, n)\) 的所有路径组成的集合是相等的。

因此所有的非法方案就等于从 \((1, -1)\) 走到 \((k, n)\) 的任意一个方案,方案数即为 \(\dbinom{n + k - 1}{n + 1}\)。

因此只考虑后面一个限制的答案即为:

\[F_{k, n} = \dbinom{n + k - 1}{n} - \dbinom{n + k - 1}{n + 1}
\]

再来考虑前一条限制的情况。

可以发现,如果前面一条限制是不满足的,那么这条路线必然会经过 \((k - 1, n)\) 这个点,于是我们直接容斥即可得到答案:

\[Ans = F_{k, n} - F_{k - 1, n}
\]

复杂度 \(O(n)\),瓶颈在于计算组合数上。

Atcoder ARC-068的更多相关文章

  1. 【题解】Atcoder ARC#90 F-Number of Digits

    Atcoder刷不动的每日一题... 首先注意到一个事实:随着 \(l, r\) 的增大,\(f(r) - f(l)\) 会越来越小.考虑暴力处理出小数据的情况,我们可以发现对于左端点 \(f(l) ...

  2. AtCoder ARC 076E - Connected?

    传送门:http://arc076.contest.atcoder.jp/tasks/arc076_c 平面上有一个R×C的网格,格点上可能写有数字1~N,每个数字出现两次.现在用一条曲线将一对相同的 ...

  3. AtCoder ARC 076D - Built?

    传送门:http://arc076.contest.atcoder.jp/tasks/arc076_b 本题是一个图论问题——Manhattan距离最小生成树(MST). 在一个平面网格上有n个格点, ...

  4. AtCoder ARC 082E - ConvexScore

    传送门:http://arc082.contest.atcoder.jp/tasks/arc082_c 本题是一个平面几何问题. 在平面直角坐标系中有一个n元点集U={Ai(xi,yi)|1≤i≤n} ...

  5. Atcoder ARC 082C/D

    C - Together 传送门:http://arc082.contest.atcoder.jp/tasks/arc082_a 本题是一个数学问题. 有一个长度为n的自然数列a[1..n],对于每一 ...

  6. 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)

    题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...

  7. 【题解】Atcoder ARC#96 F-Sweet Alchemy

    首先,我们发现每一个节点所选择的次数不好直接算,因为要求一个节点被选择的次数大于等于父亲被选择的次数,且又要小于等于父亲被选择的次数 \(+D\).既然如此,考虑一棵差分的树,规定每一个节点被选择的次 ...

  8. AtCoder ARC 090 E / AtCoder 3883: Avoiding Collision

    题目传送门:ARC090E. 题意简述: 给定一张有 \(N\) 个点 \(M\) 条边的无向图.每条边有相应的边权,边权是正整数. 小 A 要从结点 \(S\) 走到结点 \(T\) ,而小 B 则 ...

  9. 【题解】Atcoder ARC#67 F-Yakiniku Restaurants

    觉得我的解法好简单,好优美啊QAQ 首先想想暴力怎么办.暴力的话,我们就枚举左右端点,然后显然每张购物券都取最大的值.这样的复杂度是 \(O(n ^{2} m)\) 的.但是这样明显能够感觉到我们重复 ...

  10. 【题解】Atcoder ARC#85 E-MUL

    ……没啥可说的.最大权闭合子图,跑下dinic就好了…… #include <bits/stdc++.h> using namespace std; #define maxn 500000 ...

随机推荐

  1. ZOJ 3960:What Kind of Friends Are You?

    What Kind of Friends Are You? Time Limit: 1 Second Memory Limit: 65536 KB Japari Park is a large zoo ...

  2. 本地修改配置hosts文件解决Github加载慢问题

    本地修改配置hosts文件解决Github加载慢问题 手动方式 hosts 文件在每个系统的位置不一,详情如下: Windows 系统:C:\Windows\System32\drivers\etc\ ...

  3. Type-C扩展芯片|Type-C扩展方案|CSCapstone|扩展坞方案选型

    一.关于Capstone Capstone科技于2018年8月在台湾成立.团队成员的多样性将硅谷和台湾的才华横溢的人联系在一起,以进行协作和取得优越成就. Capstone科技是由一个经验丰富的研发团 ...

  4. Java练习小题_猴子吃桃问题分别用for循环和while循环实现程序。

    要求说明: 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第10天早上想再吃时, ...

  5. VMware客户端vSphereClient新建虚拟机

    1.说明 VMware客户端工具vSphere Client, 用来连接和管理ESX或ESXi主机(下面称为宿主机), 可以方便的创建.管理虚拟机,并分配相应的资源.宿主机就是使用虚拟化软件运行虚拟机 ...

  6. Nginx高级模块学习

    Nginx的rewrite规则 实现url重写一级重定向 使用场景: 1.URL访问跳转,支持开发设计 页面跳转.兼容性支持.展示效果 2.SEO优化 3.维护 后台维护.流量转发等 4.安全 配置语 ...

  7. JVM调优-1

    JVM运行参数 在jvm中有很多的参数可以进行设置,这样可以让jvm在各种环境中都能够高效的运行.绝大部分的参数保持默认即可. 三种参数类型 标准参数 -help -version -X参数(非标准参 ...

  8. 【Java】IntelliJ IDEA 快捷键

    IntelliJ IDEA 快捷键 1. Editing(编辑) 快捷键 介绍 Ctrl +Space 基本代码补全,输入字母按后列出匹配的词组 Ctrl+Shift+Space 智能代码补全,列出与 ...

  9. 学习javaScript必知必会(3)~数组(数组创建,for...in遍历,辅助函数,高级函数filter、map、reduce)

    一.数组: 1.js是弱语言,js中的数组定义时:不用指定数据类型.不用功指定数组长度:数组可以存储任何数据类型的数据 2.数组定义的[ ] 的实质: [] = new Array(); {} = n ...

  10. 在字节,A/B 实验是这么做的!

    主要为大家介绍了为什么要做 A/B 测试.火山引擎的 A/B 测试系统架构及字节跳动内部 A/B 测试的最佳实践. 为什么要做 A/B 测试 首先我们看一个案例. 字节跳动有一款中视频产品叫西瓜视频, ...