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 ...
随机推荐
- 开启生态新姿势 | 使用 WordPress 远程附件存储到 COS
在看到这篇文章前,你大概已经听说过 WordPress 了,它是使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设属于自己的网站,也可以把 WordPres ...
- Flutter Package: retry
Flutter package: retry 传送门 This package provides an easy way to retry asynchronous functions. This i ...
- 2024-12-21:从魔法师身上吸取的最大能量。用go语言,在一个神秘的地牢里,有 n 名魔法师排成一列。每位魔法师都有一个能量属性,有的提供正能量,而有的则会消耗你的能量。 你被施加了一种诅咒,吸
2024-12-21:从魔法师身上吸取的最大能量.用go语言,在一个神秘的地牢里,有 n 名魔法师排成一列.每位魔法师都有一个能量属性,有的提供正能量,而有的则会消耗你的能量. 你被施加了一种诅咒,吸 ...
- 在.NET Core中使用异步多线程高效率的处理大量数据的最佳实践
目录 一.引言 二.假设场景 三.解决方案 四.示例代码 一.引言 处理大量数据是一个常见的需求,传统的同步处理方式往往效率低下,尤其是在数据量非常大的情况下.本篇将介绍一种高效的多线程异步处理大数据 ...
- Qt开源作品31-屏幕截图控件
一.前言 屏幕截图控件在我的很多项目中都有用到,尤其是嵌入式的系统上的软件,因为在嵌入式系统中,基本上系统都很精简,甚至连UI都没有,开机之后直接运行的就是Qt程序,很多时候需要对软件进行截图保存下来 ...
- 11.10javaweb学习
- WxPython跨平台开发框架之列表数据的通用打印处理
在WxPython跨平台开发框架中,我们大多数情况下,数据记录通过wx.Grid的数据表格进行展示,其中表格的数据记录的显示和相关处理,通过在基类窗体 BaseListFrame 进行统一的处理,因此 ...
- 即时通讯技术文集(第31期):IM开发综合技术合集(Part4) [共13篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第31 期. [- 1 -] IM消息ID技术专题(一):微信的海量IM聊天消息序列号生成实践 ...
- 昔日移动端IM明星 “米聊” 即将停止服务
2021年1月19日,小米旗下米聊宣布,将于2021年2月19日12点停止米聊的服务. 1.以下消息来自米聊官网 2.关于米聊 米聊是小米科技出品的一款免费即时通讯工具,推出时间为:2010年12 ...
- Solution -「ZJOI 2010」「洛谷 P2570」贪吃的老鼠
\(\mathscr{Description}\) Link. 有 \(n\) 块奶酪,每块奶酪出现时段为 \([s_i,t_i]\),体积为 \(V_i\):有 \(m\) 只老鼠要吃奶酪, ...