CF2067D Object Identification
CF2067D - Object Identification
题目大意
有一个对你公开的 \(x\) 数组和一个对你隐藏的 \(y\) 数组,保证没有任何两个相同的 \(\{x_i, y_i\}\),并且 \(x_i \neq y_i\),对于这两个数组,有以下两种可能:
- A:一个有 \(n\) 个结点的有向图,每一条边从 \(x_i\) 指向 \(y_i\)。
- B:一个二维坐标系中的一些点,每个点的坐标为 \((x_i, y_i)\)。
你可以对这个图进行询问:
- 若这个图是一个有向图,则你的询问 \(i, j\) 为从结点 \(i\) 到结点 \(j\) 的最短路径长度。
- 若这个图是一个二维坐标系,则你的询问 \(i, j\) 为从点 \((x_i, y_i)\) 到 \((x_j, y_j)\) 的曼哈顿距离 \(|x_i - x_j| + |y_i - y_j|\)。
现在,你有最多 \(2\) 次询问机会,来确定这个图到底是一个有向图,还是一个二维坐标系。
思路
很好的一个交互题,一看题目,居然只给 \(2\) 次询问?!有意思。
要区分这两种图,我们要从二者分别的特征入手:
- 有向图:所有的边是单向的,不可反向行走,因此两个结点正着走和反着走的距离不一定相同。
- 二维坐标系:所有的点两两之间的曼哈顿距离是相同的,因此正着走和反着走的距离都相同,并在该题目条件下,不存在重合的两个点,因此距离一定不为 \(0\)。
因此,这里有一个初步的思路,挑选两个数字,正着问一次,反着问一次,判断两次询问的距离是否相同。
但很遗憾,就算是有向图,正着和反着的距离也有可能会相同(如下图中的 \(1\) 和 \(3\))。

因此,若问出来距离相同,仍然无法判断为有向图还是二维坐标系。
那么,有没有什么更特殊的点,能直接作为判断标志呢?
有的,在有向图(不含自环)中,若一个结点的出度为 \(0\),也就是这个结点没有任何的出边,那么该结点无法到达任何其他结点,即距离为 \(0\)!
也就是说,如果有 \(1\) 到 \(n\) 中的某一个数在数组 \(x\) 中一次也没有出现,那么这个结点的出度一定为 \(0\),此时,只需要把它作为询问的第一个数,再任意询问另一个数,如果距离为 \(0\),则是有向图,如果距离不为 \(0\),则是二维坐标系。
当然,不难发现,还有一种情况会发生,那就是 \(1\) 到 \(n\) 中的所有数字均在 \(x\) 数组中出现,并且一定只会出现一次(如果有某个数字出现两次及以上,则一定会有一个数字不出现)。
在这种情况中,如果是有向图,则不存在出度为 \(0\) 的结点,又应该如何判断呢?
这里我们就要用到我们 \(x\) 数组的信息了,由于 \(x\) 数组是已知的,再结合曼哈顿距离的定义,我们可以得出下面这个显而易见的结论:\(d(i, j) \geq |x_j - x_i|\)。
因此,我们可以用这个不等式来区分有向图和二维坐标系,那选用哪两个数字来询问呢?
这里我们选取 \(1\) 和 \(n\) 在 \(x\) 数组中的位置 \(a,b\),因为 \(d(a, b) \geq n - 1\),而我们的有向图中一共有 \(n\) 个结点,任意两点的距离最大值只可能达到 \(n - 1\),因此如果询问 \(1\) 和 \(n\) 在 \(x\) 数组中的位置后,如果得到的答案 \(> n - 1\),则一定是二维坐标系,如果得到的答案 \(< n - 1\),则一定是有向图。
如此一番操作后,我们还剩下一次询问机会,并且如果这个时候还没有得出答案,则只剩下一种情况:\(d(a, b) = n - 1\)!
再仔细观察可以发现,在有 \(n\) 个结点的有向图中,每个结点的出度均为 \(1\),两点最短路径长为 \(n - 1\),那这时候先不管终点 \(b\) 的那一条出边,此时这个图,一定是一个以 \(a\) 为起点,\(b\) 为重点的链!
此时,我们仅剩一条边没有连接,也就是数字 \(n\) 对应的 \(b\) 结点,我们注意到题目给出的数据范围 \(n \geq 3\),因此,\(b\) 结点要么向其他结点连边,无法到达结点 \(a\),要么向 \(a\) 连边,但 \(d(b, a) = 1 \neq d(a, b)\),所以一定是有向图。
因此这时只需要再询问一次 \(d(b, a)\),判断 \(d(a, b)\) 是否等于 \(d(b, a)\),若等于,则是二维坐标系,否则是有向图,总询问次数 \(2\) 次,通过!
AC CODE
const int N = 2e5 + 9;
int a[N];
int p[N];
int cnt[N];
int ask(int x, int y) {
cout << "? " << x << ' ' << y << endl;
int op;cin >> op;
return op;
}
void solve()
{
int n;cin >> n;
for(int i = 1;i <= n;i ++)cin >> a[i];
for(int i = 1;i <= n;i ++)cnt[i] = 0;
for(int i = 1;i <= n;i ++)cnt[a[i]] ++, p[a[i]] = i;
for(int i = 1;i <= n;i ++) {
if(!cnt[i]) {
if(ask(i, (i % n + 1)) == 0) {
cout << "! A" << endl;
} else {
cout << "! B" << endl;
}
return;
}
}
int ck = ask(p[1], p[n]);
if(ck >= n) {
cout << "! B" << endl;
return;
}
if(ck < n - 1) {
cout << "! A" << endl;
return;
}
int dk = ask(p[n], p[1]);
if(dk == ck) {
cout << "! B" << endl;
} else {
cout << "! A" << endl;
}
}
CF2067D Object Identification的更多相关文章
- SAP IDOC-Segment E1EDP19 Document Item Object Identification
PO创建时,通过IDOC EDI 接口自动创建SO 案例. BD54 配置逻辑系统 SCC4 给集团分配逻辑系统 SM59 新建RFC 链接 WE21 创建IDOC 处理端口 we20 创建合作伙伴 ...
- [OpenCV] Identify and Track Specific Object
Abstract—Augmented Reality (AR) has become increasingly popular in recent years and it has a widespr ...
- [Object Tracking] Identify and Track Specific Object
Abstract—Augmented Reality (AR) has become increasingly popular in recent years and it has a widespr ...
- Global Average Pooling Layers for Object Localization
For image classification tasks, a common choice for convolutional neural network (CNN) architecture ...
- Attribute-based identification schemes for objects in internet of things
Methods and arrangements for object identification. An identification request is received from diffe ...
- Object Creation
Although using the object constructor or an object literal are convenient ways to create single obje ...
- EEG: electrode positions & Broadmann atlas
Source: http://www.brainm.com/software/pubs/dg/BA_10-20_ROI_Talairach/nearesteeg.htm Area LEFT RIG ...
- QTP常用功能
1.QTP录制过程的截图 查看录制脚本过程中QTP的截图可以在QTP中查找,在关键字视图中点击每一步都对应一个截图 2.在关键字视图中为测试步骤添加注释 在关键字视图中表格列头中单击鼠标右键,选择 ...
- QTP之delphi试用感想一(自动化测试)
这两天一直在琢磨自动化测试,自动化测试,其实与单元测试有一些相同之处,单元测试的目的也是可以一次写,多次运行,对于测试驱动及后期维护真是有非常多的好处,用自动化测试工具也是如何,主要目的是为了回归测试 ...
- wavecom短信猫常用AT命令
wavecom短信猫常用AT命令 一.一般命令 1. AT+CGMI 给出模块厂商的标识. 2. AT+CGMM 获得模块标识.这个命令用来得到支持的频带 (GSM 900,DCS 1800 或PCS ...
随机推荐
- Dapr-4: 交通管制示例应用
第 4 章 交通管制示例应用 Introduction to the Traffic Control sample application | Microsoft Docs 在前面的章节种,你已经学习 ...
- 重建sln的项目层级
编写包含多个 csproj 的程序时,随着项目数量的持续增加,可能涉及一些文件夹的变动,手动添加项目或者变动会变得非常麻烦,这个时候,可以利用 dotnet cli 帮助我们完成. 如果从零开始,我们 ...
- nginx如何配置代理转发
Nginx是个厉害的服务器,可以配置多个服务器,一个server就是一个服务器server { listen 80; server_name *.yourdomain ...
- Springboot+Vue进行Web开发时特别需要注意的小事项
Springboot+Vue进行Web开发时特别需要注意的小事项: 1.在测试页面效果时,如果没有特别设置安全Http访问,在输入url请求测试网页时,只能使用http://......,而不能使用h ...
- 跟着源码学IM(八):万字长文,手把手教你用Netty打造IM聊天
本文作者芋艿,原题"使用 Netty 实现 IM 聊天贼简单",本底价有修订和改动. 一.本文引言 上篇<跟着源码学IM(七):手把手教你用WebSocket打造Web端IM ...
- Solution Set - Codeforces Global Round 1~8
目录 Codeforces Global Round 1 A. Parity B. Tape C. Meaningless Operations D. Jongmah E. Magic Stones ...
- CentOS扩容boot分区并升级内核
本文作者CVE-柠檬i:https://www.cnblogs.com/CVE-Lemon 前言 由于安装k8s需要升级内核,但我自己的的boot分区只有200M大小,无法安装新内核,所以干脆把swa ...
- 转换流:InputStreamReader、OutputStreamWriter
1.转换流涉及到的类:属于字符流InputStreamReader:将一个字节的输入流转换为字符的输入流解码:字节.字节数组 --->字符数组.字符串 OutputStreamWriter:将一 ...
- idea 构建项目 编译失败: 内部 java 编译器错误
昨天编译还好好的项目,今天不能构建运行了.尝试多种办法没有解决,咨询一位趟过坑的资深同事得到解决.(猜是由于项目不断增加依赖包,内存不够用了.) IDEA 文件|设置(Ctrl+Alt+S)|构建.执 ...
- Q: USB无线网卡搜不到路由器WiFi,但也能搜索到少部分信号。
原因分析:一般在路由器的配置的无线信道是自动,路由器的2.4G频段有13个左右交叠的信道.由于USB无线网卡的设置信道区间可能不在无线信道范围内,导致无线网卡搜索不到对应wifi. 解决问题:鼠标右键 ...