写的详细的就是我不会做的。。。

A

显然至多有一次移动距离 \(> 1\) 只需判断这个位置在哪里即可。

复杂度 \(\mathcal{O}(n)\)。

B

令 \(x ^ 2 - y = z ^ 2 \Longrightarrow y = (x + z)(x - z)\)。

考虑枚举 \(y\) 计算合法的 \(x\) 的数目,不难发现 \(x\) 合法的充要条件为:

\[\begin{cases}
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_i = \sum\limits_{j = l_i} ^ {i - 1} f_j + [l_i = 0]
\]

然后发现仅需将 \(f_{l_i}\) 清空即可,使用树状数组维护,复杂度 \(\mathcal{O}(n \log n)\)。

E

不难建出网络流模型,考虑最大流转最小割,枚举每种边删去哪个集合,于是问题转化为:

给定三个序列 \(A, B, C\),最小化:

\[\min\limits_{S \subseteq U_1, T \subseteq U_2} A(S) + C(T) + (n - |S|)B(U_2 - T)
\]

显然 \(|S|\) 确定的时候一定选择最小的 \(|S|\) 个元素最优,于是将序列按照 \(A\) 排序,等价于求:

\[\min\limits_{0 \le i \le n, T \subseteq U_2} \sum\limits_{j = 1} ^ i A_j + C(T) + (n - i)B(U_2 - T)
\]

此时有观察:\(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\),于是问题转换为求:

\[\min\limits_{0 \le i \le n} \sum\limits_{j = 1} ^ i A_j + \sum\limits_{\frac{c_j}{b_j} \le n - i} c_j + (n - i)\sum\limits_{\frac{c_j}{b_j} > n - i}b_j
\]

排序后显然随 \(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\) 的元素个数,那么都有:
\[-z \le f(S) - |S| \le z - 2
\]

右侧的原因是:\(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(z) + z - R(s) + z \ge 2z - (2z - 2) \ge 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的更多相关文章

  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. <数据结构>XDOJ323.判断有向图中是否有环

    问题与解答 问题描述 判断有向图中是否有环. 输入格式 输入数据第一行是一个正整数,表示n个有向图,其余数据分成n组,每组第一个为一个整数,表示图中的顶点个数n,顶点数不超过100,之后为有向图的邻接 ...

  2. 编写Java程序,用户在网上购买商品(good),当用户买了一本书(book)、一顶帽子(hat)或者买了一双鞋子(shoe),卖家就会通过物流将商品邮寄给用户,使用简单工厂模式模拟这一过程。

    查看本章节 查看作业目录 需求说明: 编写Java程序,用户在网上购买商品(good),当用户买了一本书(book).一顶帽子(hat)或者买了一双鞋子(shoe),卖家就会通过物流将商品邮寄给用户, ...

  3. Java Swing 如何设置图片大小

    如下两行代码搞定: Image image = new ImageIcon("Img/ackground.jpg").getImage();// 这是背景图片 .png .jpg ...

  4. 简单的制作ssl证书,并在nginx和IIS中使用

    2020年最后一篇博文收官,提前祝各位园友新年快乐 现在的后端开发,动不动就是需要https,或者说是需要ssl证书,既然没有正版的证书,那么我们只能自己制作ssl的证书了. 说明:证书的制作采用的是 ...

  5. SpringBoot 之 Dao层模拟数据库操作

    单表操作: # src/main/java/com/wu/dao/DepartmentDao .java @Repository public class DepartmentDao { privat ...

  6. YCSB_对mongodb做性能测试

    1.YCSB介绍 YCSB,全称为"Yahoo!Cloud Serving Benchmark",是雅虎开发的用来对云服务进行基础测试的工具,其内部涵盖了常见的NoSQL数据库产品 ...

  7. KMP算法解题模板(更新)

    /* kmp算法的主要作用在于对next数组的运用,所以这里只给出next数组的模板 性质1:对于每一个长度len的子串,该子串的最小循环节为len-next[len] 性质2:kmp的next不断向 ...

  8. kafka学习笔记(七)kafka的状态机模块

    概述 这一篇随笔介绍kafka的状态机模块,Kafka 源码中有很多状态机和管理器,比如之前我们学过的 Controller 通道管理器 ControllerChannelManager.处理 Con ...

  9. Python与Javascript相互调用超详细讲解(2022年1月最新)(三)基本原理Part 3 - 通过C/C++联通

    目录 TL; DR python调javascript javascript调python 原理 基于Node.js的javascript调用python 从Node调用python函数 V8 嵌入P ...

  10. Android官方文档翻译 十四 3.2Supporting Different Screens

    Supporting Different Screens 支持不同的屏幕 This lesson teaches you to 这节课教给你 Create Different Layouts 创建不同 ...