补题链接:Here

A - 2nd Greatest Distance

二维坐标图中有 \(n\) 个房子,现在规定两房子距离定义为: \(max(|x_i−x_j|,|y_i−y_j|)\)

求第二大的距离值


【解法一】对 \(x,y\) 进行排序寻找

#define f first
#define s second
const int N = 2e5 + 10;
pair<int, int>x[N], y[N];
int n;
void solve() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> x[i].f >> y[i].f, x[i].s = y[i].s = i;
sort(x + 1, x + 1 + n);
sort(y + 1, y + 1 + n);
int t = (x[n].s == y[n].s && x[1].s == y[1].s ? 0 : min(x[n].f - x[1].f, y[n].f - y[1].f));
cout << max(x[n].f - x[2].f, max(x[n - 1].f - x[1].f, max(y[n].f - y[2].f, max(y[n - 1].f - y[1].f, t))));
}

【解法二】官方题解

我们没有时间计算 \(\frac{N(N - 1)}{2}\) 个距离中的每一个,并在 \(O(N^2log N)\) 时间内对它们进行排序。

这里要更多地利用距离的属性。 考虑找出以下问题:

  • 两所房子 x 坐标的最大差异 两所房子 y 坐标的最大差异
  • 两所房子 x 坐标的第二大差异 两所房子 y 坐标的第二大差异

我们可以很容易地 找出它们中的前两个,x 坐标的第二大差异是以下之一:

  • 第二大 x 坐标减去最小的 x 坐标 最大的 x 坐标减去第二小的 x 坐标 我们可以找到 y 坐标的第二大差异类似。

现在,我们可以只打印四个差异中的第二大值吗? 不幸的是,如果同一对房屋在其中出现两次,则可能是错误的。

为了解决这个问题,让我们列出出现在这四对中的所有房屋,并找出列表中每对房屋之间的距离。 由于列表最多包含 8 个房子,一个有效的实现将在 \(O (N)\) 时间内完成。

#define f first
#define s second
const int N = 2e5 + 10;
pair<int, int>x[N], y[N];
int n;
void solve() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> x[i].f >> y[i].f, x[i].s = y[i].s = i;
sort(x + 1, x + 1 + n);
sort(y + 1, y + 1 + n);
int t = (x[n].s == y[n].s && x[1].s == y[1].s ? 0 : min(x[n].f - x[1].f, y[n].f - y[1].f));
cout << max(x[n].f - x[2].f, max(x[n - 1].f - x[1].f, max(y[n].f - y[2].f, max(y[n - 1].f - y[1].f, t))));
}

B - RGB Matching

给狗狗按 R,G,B分组排序,如果是 3偶 则可以直接输出 \(0\) ,对于 1偶2奇

  • R 偶数,考虑 GB 的最小值在另一组的大小关系
  • G 偶数,考虑 RB 的最小值在另一组的大小关系
  • B 偶数,考虑 RG 的最小值在另一组的大小关系
#include<bits/stdc++.h>
#define int long long
using namespace std;
int const N = 233333;
int n;
vector<int>dog[3];
int sub(vector<int>a, vector<int>b) {
int ans = 1e18;
for (int i = 0; i < a.size(); i++) {
int p = lower_bound(b.begin(), b.end(), a[i]) - b.begin();
if (p < b.size())ans = min(ans, abs(a[i] - b[p]));
if (p > 0)ans = min(ans, abs(a[i] - b[p - 1]));
}
return ans;
}
signed main() {
ios::sync_with_stdio(0);
cin >> n;
for (int i = 1; i <= 2 * n; i++) {
int x; char c;
cin >> x >> c;
switch (c) {
case'R': dog[0].push_back(x); break;
case'G': dog[1].push_back(x); break;
case'B': dog[2].push_back(x);break;
}
}
for (int i = 0; i < 3; i++)sort(dog[i].begin(), dog[i].end());
int k0 = dog[0].size() % 2, k1 = dog[1].size() % 2, k2 = dog[2].size() % 2;
if (!k0 && !k1 && !k2) {cout << 0; return 0;}
int s01 = sub(dog[0], dog[1]), s02 = sub(dog[0], dog[2]), s12 = sub(dog[1], dog[2]);
if (!k0)cout << min(s12, s01 + s02);
if (!k1)cout << min(s02, s01 + s12);
if (!k2)cout << min(s01, s02 + s12);
return 0;
}

AtCoder Regular Contest 121 (AB题解)的更多相关文章

  1. AtCoder Regular Contest 121 D - 1 or 2

    题目链接:点我点我 Problem Statement Snuke has a blackboard and NN candies. The tastiness of the ii-th candy ...

  2. 2018.09.02 Atcoder Regular Contest 102简要题解

    比赛传送门 T1 Triangular Relationship 分析之后发现有两种情况: 1. n为奇数,那么所有数都是k的倍数. 2. n为偶数,那么所有数都是k/2的倍数. 然后就可以愉快A题了 ...

  3. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

  4. AtCoder Regular Contest 096

    AtCoder Regular Contest 096 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个 ...

  5. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  6. AtCoder Regular Contest 092

    AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...

  7. AtCoder Regular Contest 093

    AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...

  8. AtCoder Regular Contest 094

    AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...

  9. AtCoder Regular Contest 095

    AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...

  10. AtCoder Regular Contest 102

    AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...

随机推荐

  1. 根据子节点ID获取结构树中该子节点的所有父节点ID

    数据源: let adreeJson = [{ cat_id: 1, cat_name: '大家电', cat_pid: 0, cat_level: 0, cat_deleted: false, ch ...

  2. 利用Jdk动态代理模拟MyBatis的Mapper功能

    本文将先介绍jdk动态代理的基本用法,并对其原理和注意事项予以说明.之后将以两个最常见的应用场景为例,进行代码实操.这两个应用场景分别是拦截器和声明性接口,它们在许多开发框架中广泛使用.比如在spri ...

  3. Java自定义ClassLoader实现插件类隔离加载

    为什么需要类隔离加载 项目开发过程中,需要依赖不同版本的中间件依赖包,以适配不同的中间件服务端 如果这些中间件依赖包版本之间不能向下兼容,高版本依赖无法连接低版本的服务端,相反低版本依赖也无法连接高版 ...

  4. springMvc报错

    这个报错困扰了我大概一天,主要是刚开始没抓到主要原因,是因为自己的项目结构出现了问题, 导致找不到应有的东西,另一方面就是maven的问题,将maven解决后这个就能用了. 具体解决在https:// ...

  5. 流媒体服务器ZLMediaKit与FFmpeg

    流媒体服务器ZLMediaKit与FFmpeg overview 关键字:ZLMediaKit.FFmpeg.srt.vlc 如果想快速拥有自己的流媒体服务器,那么可以使用开源项目自己搭建.开源的流媒 ...

  6. Spring 七种事务传播性介绍

    作者:vivo 互联网服务器团队 - Zhou Shaobin 本文主要介绍了Spring事务传播性的相关知识. Spring中定义了7种事务传播性: PROPAGATION_REQUIRED PRO ...

  7. 火爆全网的Log4j 漏洞复现GetShell

    目录: 一.搭建环境 1. 首先拉一个docker镜像 2. 然后启动环境 二.获取shell 首先,试验一下DNSLog 1. 准备JNDI注入工具 下载 进入目录打包成jar包 2. 利用 生成p ...

  8. quill富文本编辑器quill粘贴图片上传服务器

    强大的富文本编辑器:quill github:32k start++,:https://github.com/quilljs/quill quill粘贴图片上传服务器 <link href=&q ...

  9. 微信小程序实时噪声分贝

    为了做一个能够检测实时噪声分贝的小程序,网上找了很多例子,基本没有完整的代码,手写了一个,话不多说直接上效果图 实现实时录音的功能,并且能够根据声音分贝大小转动仪表盘显示实时的分贝,运用echart实 ...

  10. K8S系列一:概念入门

    K8S系列一:概念入门 写在前面 本文组织方式: K8S的架构.作用和目的.需要首先对K8S整体有所了解. K8S是什么? 为什么是K8S? K8S怎么做? K8S的重要概念,即K8S的API对象.要 ...