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. CS5211|DP转LVDS |低成本DP to LVDS Conversion 方案设计

    目前市面上DP转LVDS转换--DP to LVDS Conversion 方案设计有以下: 龙迅LT8911 LT7211.普瑞PS8625.昆泰CH7511等方案,DP换LVDS转换主要是用在一些 ...

  2. 解决windows update失败,正在还原的问题

    其实这个不算问题,等上几个小时,还原完毕就好了,不过也有快速解决的办法. 所需工具:U盘.光盘等可以进入PE系统的工具,dism++软件 1.下载dism++工具,根据你的系统,选择使用32位还是64 ...

  3. mysql在Linux下大小写敏感设置

    默认情况下,mysql在windows下是不区分大小写的,但是mysql在linux下大小写规则是这样的: 1.数据库名与表名是严格区分大小写的: 2.表的别名是严格区分大小写的: 3.列名与列的别名 ...

  4. Linux密码文件介绍

    1. 查看shadow文件内容```cat /etc/shadow```可以看到shadow文件内容,例如:```root:$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF.:148 ...

  5. Python_issubclass&isinstance方法和types&inspect内置模块

    issubclass&isinstance issubclass 用于判断一个类是否是一个已知类或是该已知类的子类.注意,该方法只能判断类不能判断实例化对象. class A: pass cl ...

  6. Selenium_界面的刷新、后退、前进操作(4)

    import time from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driv ...

  7. Maven打包方式整理

    方法一 maven-jar-plugin和maven-dependency-plugin插件打包 <build> <plugins> <plugin> <gr ...

  8. nuxt 相关

    https://github.com/xuqiang521/nuxt-ssr-demo https://www.cnblogs.com/laozhang-is-phi/p/10249248.html ...

  9. 【PTA】字符串正反序连接

    将s所指字符串的正序和反序进行连接,形成一个新串放在t所指的数组中. 函数接口定义: void fun (char *s, char *t); 其中s 和t都是用户传入的参数.函数将s所指字符串的正序 ...

  10. Kafka connector (kafka核心API)

    前言 Kafka Connect是一个用于将数据流输入和输出Kafka的框架.Confluent平台附带了几个内置connector,可以使用这些connector进行关系数据库或HDFS等常用系统到 ...