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. Codeforces Gym-100985C: MaratonIME plays Nim(交互题&博弈)

    C. MaratonIME plays Nim time limit per test : 2.0 smemory limit per test : 64 MBinputstandard inputo ...

  2. Mysql客户端的安装

    Mysql数据库(简称)属于C/S架构,正常工作中一般都会提供服务端,我们只需要安装客户端进行查询修改数据等操作即可. 正常工作中不管是测试人员或者开发人员,一般数据库的管理员(测试负责人或者开发负责 ...

  3. CS229 机器学习课程复习材料-线性代数

    本文是斯坦福大学CS 229机器学习课程的基础材料,原始文件下载 原文作者:Zico Kolter,修改:Chuong Do, Tengyu Ma 翻译:黄海广 备注:请关注github的更新,线性代 ...

  4. 「影院售票系统」 · Java Swing + MySQL JDBC开发

    目录 文档说明: 一.语言和环境 二.实现功能 三.数据库设计 四.具体要求及推荐实现步骤 五.注意事项 六.评分标准 实现代码: 一.数据库: 二.Java Swing: com.ynavc.Bea ...

  5. .NET 云原生架构师训练营(模板方法 && 建造者)--学习笔记

    目录 模板方法 源码 建造者 模板方法 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 源码 https://github.com ...

  6. oracle 之 cursor:创建存储过程批量执行DDL语句

    说明:使用此过程可任意执行批量DDL语句,调用DDL查询语句时,注意转义字符,使用 ' 转义! 需求:批量删除以CUR_TEST开头的表,且有日志记录. 环境准备:建几张以CUR_TEST开头测试表. ...

  7. shell中的2>/dev/null

    1.文件描述符Linux系统预留可三个文件描述符:0.1和2,他们的意义如下所示:0--标准输入(stdin)1--标准输出(stdout)2--标准错误(stderr) 标准输出--stdout假设 ...

  8. python安装第三方库的步骤

    windows下举例:1.下载openpyxl,http://pypi.doubanio.com/simple/openpyxl/2.将下载后的文件解压放到Python文件夹下的Lib文件夹下3.cm ...

  9. react中state与setstate的使用

    我们可以利用state来定义一些变量的初始值 //放在construcor里 this.state = { list: [1, 2, 3] } 要更改state里的值,注意要遵循react里immut ...

  10. CSS命名规范整理

    基于网易NEC修改后,整理的命名规范 单行写完一个选择器定义 便于选择器的寻找和阅读,也便于插入新选择器和编辑,便于模块等的识别.去除多余空格,使代码紧凑减少换行. 如果有嵌套定义,可以采取内部单行的 ...