ARC063(2020.7.16)

A

\(A\) 题如果洛谷评分很低就不看了。

B

可以发现一定是选择在一个地方全部买完然后在之后的一个地方全部卖完,那么我们就只需要即一个后缀最大值就可以计算答案了。但题目要求我们使得利润至少减一,实际上我们将买的地方价格提升 \(1\) 即可,因为 \(a_i\) 相异,那么每一对买卖价格都不会互相影响,题目问的实际上就是有多少个位置能获得最大利润,直接枚举买的位置即可。

C

首先我们可以发现这样一件事情,对于一对已经确定权值的点对 \((i, j)\),中间过程中点权的变化过程可以看作一个点再平面直角坐标系下往右上或者右下移动,于此同时我们在这两个点之间连一条边,可以发现实际上我们可以平移这些线段使得整个变化过程形成一个山峰状,这样一来我们可以看作是两个点互相往中间上升的一个过程,换句话说就是我们每次选择一个位置低的点把他往上挪一格,那么最终两个点一定能够相遇,于是我们就有了一个贪心的思路,那么这个思路放在多个点的情况下是否适用呢?答案是可以的,可以感受一下如果有多个点经过上述的贪心操作实际上是先选择了两个点打通,然后其余的点再和这条路径上的点打通的过程,因为我们每次贪心选择最小的点扩展,是一定能尽可能使得两个点在同一高度相遇的,于是利用上述的贪心我们就可以愉快地过掉这道题。

然而官方标算是这样的,可以发现我们可以求出每个点可以选择的取值范围(用父亲限定儿子或用儿子限定父亲做两次树形 \(dp\) ,于此同时每个点的奇偶性是确定的,我们还需要从每个点开始向周围 \(dfs\) 奇偶染色求出奇偶性,最终判断一下无解情况自上而下在取值范围内构造一组解即可。

D

首先我们可以发现原问题等价于求解这样一个问题:在一个大矩形内给定 \(n\) 个关键点,现在需要找到在大矩形内周长最大的一个矩形使得其内部(不含边界)不包括关键点。首先按照套路我们可以使用 \(\rm CDQ\) 分治,为了方便起见我们分别讨论跨过横中轴线的答案和跨过竖中轴线的答案,下面以跨过横中轴线的答案为例,竖的直接将 \(x, y\) 翻转即可。可以考虑枚举上边界和下边界,再下边界不断向下递减时顺便扫一遍左右边界的位置这样就可以做到 \(O(n ^ 2)\) 了。可以发现我们可以动态维护每个下边界的答案,枚举上边界计算答案,不难发现我们能选择的区间一定会越变越小,那么两边能选区间将会满足单调性,于是在枚举上边界的同时,我们可以考虑计算当前上边界的左右边界然后修改一段区间,因为修改实际上是将一段区间推平,首先可以线段树二分到最后一个需要修改的位置,然后这段区间的答案实际上之和右端点单独的答案有关,于是我们再记录一个右端点单独的答案即可,修改左端点时同理,那么这道题我们就可以 \(O(n \log ^ 2 n)\) 做完了,实际上是可以做到 \(O(n \log n)\) 的,不难发现我们可以选择一长条的矩形或者一竖条的矩形,这部分的答案就是 \(2 \times \max(h, w) + 2\) 如果我们选择的矩形不会经过横着的中线或者竖着的中线那么一定会在某个四分之一的小格中,那么这部分的答案最多是 \(2 \times (\frac{h}{2}, \frac{w}{2}) = h + w \le 2 \times \max(h, w) + 2\),因此我们选择的矩形一定会跨过中线,那么 \(\rm CDQ\) 就不需要了,于是复杂度就变成了 \(O(n \log n)\).

官方标算是这样一个做法,同样需要上面的转化和上面的性质,只是最终统计答案的时候有所不同。还是只考虑跨过横着的中线的情况,我们考虑将每个点按照横坐标排序,从左至右依次枚举每个点作为右端点的情况,用一颗线段树维护之前每个点左端点竖着能到达的最远距离减去横坐标的最大值,那么我们每次维护这颗线段树只需要将一个点左边第一个比他小的位置右边所有点的答案在线段树上修改即可,这个寻找的过程可以使用单调栈,具体过程看代码。

Atcoder ARC-063的更多相关文章

  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. 「物流跟踪管理系统」 · Java Swing + MySQL JDBC开发,美和易思结业考试机试试题

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

  2. 如何下载安装JDBC_jar包,MySQL_JDBC_jar包的下载与使用(Windows)

    一. 下载 (1) 打开MySQL_JDBC的下载网站:https://dev.mysql.com/downloads/connector/j/ (2) 选择操作系统:Platform Indepen ...

  3. Python两处容易理解错误的设计

    函数内部修改可变类型的变量时不会视作局部变量(除非函数内有该变量的赋值运算符),因为如果做局部变量处理则修改语句势必报错,此处的理解不会有歧义: s = 'test' d = {True:1,2:'S ...

  4. Java常用的几种设计模式

    本来想写点spring相关的东西的,想来想去,先写点设计模式的东西吧 什么是设计模式?套用百度百科的话解释吧 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设 ...

  5. update sql时,常记错同时更新多个参数用and,正确是用逗号

    记录一下,经常记错的一个点,在update多个参数时,多个参数之间用and连接,这个时候,语句就会报错了 其实,正确的是用逗号隔开, 使用SQL中的update更新多个字段值,set后面的条件要用逗号 ...

  6. HttpRunner_参数化进阶

    一.获取返回包数据   在提取参数时,当 HTTP 的请求响应结果为 JSON 格式,则可以采用.运算符的方式,逐级往下获取到参数值:响应结果的整体内容引用方式为 content 或者 body,如上 ...

  7. How to run a batch file each time the computer loads Windows

    https://www.computerhope.com/issues/ch000322.htm#:~:text=Press Start%2C type Run%2C and press Enter. ...

  8. i++ 和 ++i 区别

    i++:是先把i拿出来使用,然后再+1: ++i :是先把i+1,然后再拿出来使用:

  9. Leetcode系列之两数之和

    Leetcode系列之两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你 ...

  10. [BJDCTF2020]EzPHP-POP链

    那次某信内部比赛中有道pop链问题的题目,我当时没有做出来,所以在此总结一下,本次以buu上复现的[MRCTF2020]Ezpop为例. 题目 1 Welcome to index.php 2 < ...