Atcoder ARC-125
写的详细的就是我不会做的。。。
A
显然至多有一次移动距离 \(> 1\) 只需判断这个位置在哪里即可。
复杂度 \(\mathcal{O}(n)\)。
B
令 \(x ^ 2 - y = z ^ 2 \Longrightarrow y = (x + z)(x - z)\)。
考虑枚举 \(y\) 计算合法的 \(x\) 的数目,不难发现 \(x\) 合法的充要条件为:
y = ab(a \ge b)\\
a + b \equiv 0 \pmod{2}
\end{cases}
\]
有两种做法:
做法一
观察到 \(b \le a \le \sqrt{n}\),于是考虑枚举 \(b\),转化为统计合法 \((a, b)\) 的数量。
那么显然合法的 \(a\) 的数目可以直接计算得出,复杂度 \(\mathcal{O}(\sqrt{n})\)。
做法二
首先直接忽略 \(b \le a\) 这个条件,只需计算出此时答案与 \(a = b\) 时的答案即可。
后者的数量显然为 \(\lfloor \sqrt{n} \rfloor\),考虑如何计算前者。
考虑枚举 \(a\) 的大小,发现统计的式子可以整除分块,复杂度 \(\mathcal{O}(\sqrt{n})\)。
C
考虑按位贪心,问题在于如何判定是否存在解。
首先容易发现对于任意的排列和给定的任意序列均存在一种构造方式能满足其有解:
我们找到 \(> A_1\) 的那些元素将其从大到小放在 \(A_1\) 之前,然后紧跟着恰好按照 \(A\) 序列的顺序放置,然后再把 \(< A\) 的部分倒序放在最后,容易观察得到这一定是合法的。
由于这是对于排列的判断,因此现在我们就需要找到一种方式使得填完前面的数字后后面的问题为一个子问题。
首先我们有观察(不难证明):
- 第一个数字 \(P_1 \ge A_1\)。
为了字典序最小,我们大胆猜测是否可以选到 \(A_1\)?
答案是肯定的,因为去除掉 \(A_1\) 后剩下的部分我们可以按照原问题的做法得到一个满足要求的解。
但是去掉 \(A_1\) 之后的部分不一定要求 \(\rm LIS\) 一定恰好为 \(|A| - 1\),因为 \(A_1\) 不是 \(1\)。
但我们发现此时 \(1\) 可以紧接着填在序列的第二个位置,证明方法同 \(A_1\) 放置。
那么此时就必须保证第 \(3\) 个位置开始之后的子串 \(\rm LIS\) 必为 \(|A| - 1\),又 \(A_1\) 不为 \(1\),因此这就是一个 \(|A'| = |A| - 1, n' = n - 2\) 的子问题。
于是我们可以考虑递归解决,可以直接循环实现,维护一个当前最小值位置的指针即可,复杂度 \(\mathcal{O}(n)\)。
D
考虑动态维护每个前缀局面每个位置结尾的合法串数量,不妨假设当前考虑到 \([1, s]\) 这个局面,\(f_i\) 为以 \(i\) 结尾的合法串数量。
容易发现对于以一种元素结尾的合法串必定只能出现在 \([1, s]\) 中最后一个出现的位置。
考虑如何扩展这个局面:记 \(l_i\) 为 \(i\) 左侧与其元素权值相同的第一个位置,有转移:
\]
然后发现仅需将 \(f_{l_i}\) 清空即可,使用树状数组维护,复杂度 \(\mathcal{O}(n \log n)\)。
E
不难建出网络流模型,考虑最大流转最小割,枚举每种边删去哪个集合,于是问题转化为:
给定三个序列 \(A, B, C\),最小化:
\]
显然 \(|S|\) 确定的时候一定选择最小的 \(|S|\) 个元素最优,于是将序列按照 \(A\) 排序,等价于求:
\]
此时有观察:\(T\) 集合内的元素选择是独立的,考虑将元素 \(x\) 从 \(T\) 中替换到 \(U_2 - T\) 当中,变化量为:\(-c_x + (n - i)b_x\) 我们希望其变小: \(-c_x + (n - i)b_x \le 0 \Longleftrightarrow \frac{c_x}{b_x} \ge n - i\),于是问题转换为求:
\]
排序后显然随 \(i\) 增合法的 \(j\) 有单调性,双指针维护,复杂度 \(\mathcal{O}(n \log n)\)。
F
首先不难得到一个暴力的做法:令 \(f_{i, j, k}\) 为考虑完前 \(i\) 个节点,当前选出了 \(j\) 个节点,当前选出节点的度数总和为 \(k\) 是否合法,直接转移复杂度 \(\mathcal{O}(n ^ 3)\)。
接下来貌似没有方法继续优化了?根据以往的经验,对于判定型的 \(\rm dp\),优化方法除了基本 \(\rm dp\) 优化方法以外,还有:压位转移和分析可行解的断点数量很少(通常表现为一段区间)。
我们对样例打表观察到 \((x, y)\) 的断点貌似挺多,于是可以考虑换一个量进行打表:\((x, y - x)\) 我们惊奇地发现当 \(y - x\) 固定的时候可行的 \(x\) 真的是一段区间!
考虑尝试证明一下这个结论:为了尽可能拟合上述的结论,我们先令 \(v_i = d_i - 1\) 那么这个时候的权值和就是原本的 \(y - x\)。
与此同时,由于 \((x, y)\) 与 \((x, y - x)\) 构成双射(下面称 \((x, y - x)\) 这样的点对为 \((x, s)\)),因此令 \(v_i = d_i - 1\) 后的问题与原问题的答案一致。
此时我们再来分析 \(s\) 固定时 \(x\) 的最小值 \(L(s)\) 与最大值 \(R(s)\)。
继续观察可以发现:\(L(s)\) 当中一定没有选任何一个 \(v = 0\) 的点,否则一定可以将点数减少;同理 \(R(s)\) 内一定将所有 \(v = 0\) 的点都选上了。
因此我们可以知道 \((L(s), s) \sim (L(s) + z, s), (R(s) - z, s) \sim (R(s), s)\) 一定都是合法的。
接下来我们有如下观察:
- 对于选定的任意的集合 \(S\),令 \(f(S)\) 为其权值和,\(z\) 为 \(v\) 为 \(0\) 的元素个数,那么都有:
\]
右侧的原因是:\(f(S) - |S| \le \sum\limits_{i \in S, v_i > 0} v_i - |S| \le \sum\limits_{v_i > 0} v_i - 1 = n - 2 - (n - z) = z - 2\)
根据上述的性质,不难发现:\(R(s) - L(s) = R(s) - s - (L(s) - s) \le 2z - 2\)。
又我们有第一个区间右端点和第二个区间左端点之差:
\]
这两个区间一定相交且易知包含 \([L(s), R(s)]\) 内的每个元素,因此原命题成立。
此时我们仅需求出权值为 \(s\) 时最少(多)选出的点数即可。
直接做复杂度是 \(\mathcal{O}(n ^ 2)\) 的,但观察到 \(\sum v_i = n - 2\) 因此本质不同的 \(v\) 仅有 \(\sqrt{n}\) 种,于是我们采用单调队列优化多重背包,复杂度 \(\mathcal{O}(n\sqrt{n})\)。
Atcoder ARC-125的更多相关文章
- 【题解】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 ...
随机推荐
- CSS实现鼠标移入时图片的放大效果以及缓慢过渡
transform:scale()可以实现按比例放大或者缩小功能. transition可以设置动画执行的时间,实现缓慢或者快速的执行动画,效果图如下: 源码: <!DOCTYPE html&g ...
- Understanding and Improving Fast Adversarial Training
目录 概 主要内容 Random Step的作用 线性性质 gradient alignment 代码 Andriushchenko M. and Flammarion N. Understandin ...
- KISS原则
Keep It Simple, Stupid 1. 模块性原则:写简单的,通过干净的接口可被连接的部件:2. 清楚原则:清楚要比小聪明好.3. 合并原则:设计能被其它程序连接的程序.4. 分离原则:从 ...
- [c++]对vector<T>容器求交集,并集,去重
#include "iostream" #include "vector" #include "algorithm" //sort函数.交并 ...
- 物联网大赛 - Android学习笔记(二)Andriod 应用界面编程
学习目标: Android的程序界面和View组件 View组件和ViewGroup组件 常见的布局管理器 文本框组件TextView和EditView 按钮组件Button 和ImageButton ...
- Ranger-Usersync安装
Ranger-Usersync安装, 配置数据源Unix,Usersync从Unix拉取Users/Groups的数据源, 对应的Ranger版本0.6.0. IP/机器名 安装软件 运行进程 zdh ...
- Git 远程分支常用操作
# 查看远程仓库推拉地址,分支信息,分支跟踪情况等 git remote show origin # 拉取远程仓库的变更内容到本地 git fetch origin # 拉取并合并仓库的变更内容到本地 ...
- sqlsugar freesql hisql 三个ORM框架性能测试对比
hisql与目前比较流行的ORM框架性能测试对比 总体测试结果 插入记录数 hisql(耗时) sqlsugar(耗时) freesql(耗时) 5条 0.0107秒 0.0312秒 0.02675秒 ...
- Django在使用logging日志模块时报错无法操作文件 logging error Permission Error [WinError 32]
产生原因: 这个问题只会在开发的时候遇到,而且配置是写入到setting.py配置文件,我们定义了日志文件大小,当日志满了的时候,这时候就会遇到这个问题, 因为在使用Pycharm运行django的时 ...
- SQL Server数据库出现“无法访问数据库XXX(objectExplorer)”的解决办法
数据库版本为2008R2,服务器异常重启并重新挂载iscsi后,数据库出现"无法访问数据库XXX(objectExplorer)"问题. 输入SQL命令查看数据库状态 1 sele ...