Atcoder ARC-068
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\) 的转移方程是具有组合意义的,首先不看方程后面的限制,不难发现这是从 \(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}\)。
因此只考虑后面一个限制的答案即为:
\]
再来考虑前一条限制的情况。
可以发现,如果前面一条限制是不满足的,那么这条路线必然会经过 \((k - 1, n)\) 这个点,于是我们直接容斥即可得到答案:
\]
复杂度 \(O(n)\),瓶颈在于计算组合数上。
Atcoder ARC-068的更多相关文章
- 【题解】Atcoder ARC#90 F-Number of Digits
Atcoder刷不动的每日一题... 首先注意到一个事实:随着 \(l, r\) 的增大,\(f(r) - f(l)\) 会越来越小.考虑暴力处理出小数据的情况,我们可以发现对于左端点 \(f(l) ...
- AtCoder ARC 076E - Connected?
传送门:http://arc076.contest.atcoder.jp/tasks/arc076_c 平面上有一个R×C的网格,格点上可能写有数字1~N,每个数字出现两次.现在用一条曲线将一对相同的 ...
- AtCoder ARC 076D - Built?
传送门:http://arc076.contest.atcoder.jp/tasks/arc076_b 本题是一个图论问题——Manhattan距离最小生成树(MST). 在一个平面网格上有n个格点, ...
- AtCoder ARC 082E - ConvexScore
传送门:http://arc082.contest.atcoder.jp/tasks/arc082_c 本题是一个平面几何问题. 在平面直角坐标系中有一个n元点集U={Ai(xi,yi)|1≤i≤n} ...
- Atcoder ARC 082C/D
C - Together 传送门:http://arc082.contest.atcoder.jp/tasks/arc082_a 本题是一个数学问题. 有一个长度为n的自然数列a[1..n],对于每一 ...
- 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)
题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...
- 【题解】Atcoder ARC#96 F-Sweet Alchemy
首先,我们发现每一个节点所选择的次数不好直接算,因为要求一个节点被选择的次数大于等于父亲被选择的次数,且又要小于等于父亲被选择的次数 \(+D\).既然如此,考虑一棵差分的树,规定每一个节点被选择的次 ...
- AtCoder ARC 090 E / AtCoder 3883: Avoiding Collision
题目传送门:ARC090E. 题意简述: 给定一张有 \(N\) 个点 \(M\) 条边的无向图.每条边有相应的边权,边权是正整数. 小 A 要从结点 \(S\) 走到结点 \(T\) ,而小 B 则 ...
- 【题解】Atcoder ARC#67 F-Yakiniku Restaurants
觉得我的解法好简单,好优美啊QAQ 首先想想暴力怎么办.暴力的话,我们就枚举左右端点,然后显然每张购物券都取最大的值.这样的复杂度是 \(O(n ^{2} m)\) 的.但是这样明显能够感觉到我们重复 ...
- 【题解】Atcoder ARC#85 E-MUL
……没啥可说的.最大权闭合子图,跑下dinic就好了…… #include <bits/stdc++.h> using namespace std; #define maxn 500000 ...
随机推荐
- bootstrap datetimepick 时分秒选择,坑我15个小时,整理记录
官网的datetimepick 下载链接 官网下载 <input type="text" readonly name="feedDay" id=" ...
- Codeforces 777C:Alyona and Spreadsheet(预处理)
During the lesson small girl Alyona works with one famous spreadsheet computer program and learns ho ...
- 【系统分析】《系统分析与设计方法》 Jeffrey L.Whitten 第1部分 系统开发环境 第3章 信息系统开发
1.解释为什么对企业来说,拥有一个标准的系统开发过程很重要. 开发过程的成熟,使项目时间和费用减少,生产率和质量提高 2.如何关联系统生命周期和系统开发方法学? 系统生命周期包含系统开发阶段,其中使用 ...
- 计算机系统2->从芯片说起 | 芯片怎样诞生
这部分数字逻辑课上老师在讲CMOS部分时有讲过,当时在课堂上放了一个全英的视频,没怎么看懂,现在在研究计算机系统,自底层说起,也得从这讲起. 主要参考: <嵌入式C语言自我素养> b站相关 ...
- js处理复杂数据格式数组嵌套对象,对象嵌套数组,reduce处理数据格式
let list=[ {id:1,name:'a'}, {id:1,name:'b'}, {id:1,name:'c'}, {id:2,name:'A'}, {id:2,name:'B'}, {id: ...
- [多线程]async异步操作的使用实例及不同策略的对比
#include <iostream> #include <thread> #include <mutex> #include <iostream> / ...
- MySQL数据操作与查询笔记 • 【第7章 连接查询】
全部章节 >>>> 本章目录 7.1 内连接查询 7.1.1 交叉连接(笛卡尔积) 7.1.2 内连接查询概要 7.1.3 内连接案例 7.1.4 自然连接 7.2 多表连 ...
- 编写Java程序,观察类启动时静态代码块和main()的执行顺序
返回本章节 返回作业目录 需求说明: 观察类启动时静态代码块和main()的执行顺序 在Book类中定义静态代码块. 在Book中分别定义一个普通实例方法和静态方法. 在Book类的静态代码块中调用静 ...
- Kafka集群安装Version2.10
Kafka集群安装,基于版本2.10, 使用kafka_2.10-0.10.1.0.tgz安装包. 1.安装规划 Storm集群模式,安装到下面三台机器 IP Hostname 10.43.159.2 ...
- 计算机网络-4-11-IP多播
IP多播 IP多播的基本概念 与单播相比,在一对多的通信中,多播可以大大减少网络资源.在互联网上进行多播就叫做IP多播,IP多播所传送的分组需要使用多播IP地址.能够运行多播协议的路由器叫做多播路由器 ...