补题链接: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. 在路上---学习篇(一)Python 数据结构和算法 (2) -- 冒泡排序、选择排序、插入排序

    独白: 第一次接触算法排序, 充满了好奇并且渴望了解其中原理,今天先学习了三种排序的方法,分别是 冒泡排序.选择排序.插入排序.学完以后发现数学知识真的很重要,越牛逼的算法要求知识越多,越精.虽说刚接 ...

  2. PLC 和Modbus/串口设备现场总线通信及短信报警解决方案

    在实现 Modbus 设备与 PROFIBUS DP 协议 PLC 通讯的同时可以在手机端实时的接收报警短信,使客户足不出户了解设备与 PLC 的状态,及时处理现场中的问题. 系统组成 Modbus ...

  3. EXCEL中逆向查找的十种方法

    逆向查找在Excel中指的是根据某个数值或条件,查找该数值或条件所在的单元格位置.逆向查找可以帮助用户快速定位数据,对于数据分析和处理非常有用.下面将详细介绍在Excel中进行逆向查找的十种方法. 一 ...

  4. MINA框架

    一.小程序MINA框架分为三个部分: 有 View(视图层).App Service(逻辑层)和 Natice(系统层). 1.View(视图层) 视图层包含了小程序多个页面.每个页面都有WXML文件 ...

  5. 0x01.web请求、web环境、抓包技巧

    网站搭建 DNS解析 域名选择 http/https 证书 服务器 web应用环境架构 操作系统 linux windows 开发语言 php java ASP/ASPX python等 程序源码 C ...

  6. 【UniApp】-uni-app-修改组件主题和样式

    前言 好,经过上个章节的介绍完毕之后,了解了一下 uni-app-扩展组件 那么了解完了uni-app-扩展组件之后,这篇文章来给大家介绍一下 uni-app-修改组件主题和样式 首先不管三七二十一, ...

  7. 使用 PyTorch FSDP 微调 Llama 2 70B

    引言 通过本文,你将了解如何使用 PyTorch FSDP 及相关最佳实践微调 Llama 2 70B.在此过程中,我们主要会用到 Hugging Face Transformers.Accelera ...

  8. TCP连接断开:为什么要挥手四次

    本文分享自华为云社区<解密TCP连接断开:四次挥手的奥秘和数据传输的安全>,作者: 努力的小雨 . TCP 连接断开 在当今数字化时代,互联网已经成为了人们生活中不可或缺的一部分.而在互联 ...

  9. C++学习笔记一:windows系统配置C++开发环境(VS code+g++/clang++)

    1.下载vscode 官网下载地址: https://code.visualstudio.com/ 安装时选择把软件加入到环境变量中这个选项 2.打开vscode,安装c/c++扩展插件 3.下载gc ...

  10. Odoo16—国际化翻译

    开发odoo系统模块的时候,如果一开始就有国际化的需求,无论是模型的定义还是视图的构建,建议使用英语作为第一语言:一方面,英语本身就是一种国际化的语言:另一方面,odoo内置模型字段描述如Create ...