传送门
题目大意:
交互题,

n

(

4

n

1000

)

n(4\leq n\leq1000)

n(4≤n≤1000)个数字组成的数列

a

1

,

a

2

,

,

a

n

(

0

a

i

1

0

9

)

a_{1},a_{2},…,a_{n}(0\leq a_{i}\leq10^9)

a1​,a2​,…,an​(0≤ai​≤109),有且仅有

1

1

1个

0

0

0,每次询问

i

,

j

,

k

i,j,k

i,j,k,会给出

m

a

x

(

a

i

,

a

j

,

a

k

)

m

i

n

(

a

i

,

a

j

,

a

k

)

max(a_{i},a{j},a{k})-min(a_{i},a_{j},a_{k})

max(ai​,aj,ak)−min(ai​,aj​,ak​)的值,最多询问

2

n

2

2n-2

2n−2次,最后需要输出

i

,

j

i,j

i,j,使

a

i

,

a

j

a_{i},a_{j}

ai​,aj​当中有一个为

0

0

0。

思路:
题目可以转化为找出

n

2

n-2

n−2个绝对不会为

0

0

0的位置。我们考虑

4

4

4个数字

0

,

a

,

b

,

c

0,a,b,c

0,a,b,c,不妨设

0

<

a

b

c

0<a\leq b\leq c

0<a≤b≤c,那么在

4

4

4个数当中,我们记不选数字

a

a

a而选择了其他

3

3

3个数字询问而得到的答案记为

a

a'

a′,那么上面的例子中,

0

=

c

a

,

a

=

c

,

b

=

c

,

c

=

b

0'=c-a,a'=c,b'=c,c'=b

0′=c−a,a′=c,b′=c,c′=b,这

4

4

4个

a

n

s

ans

ans中最大的两个值所对应的位置一定不会为

0

0

0,因为如果为

0

0

0,那么舍弃掉既不是

0

0

0也不是这

4

4

4个当中最大值的两个位置中的一个去询问会得到的回答是这

4

4

4个数当中的最大值,一定比舍弃掉

0

0

0的询问更大,所以我们可以把

4

4

4个

a

n

s

ans

ans中最大的两个位置去掉,这样通过每轮

4

4

4个询问我们可以排除掉两个位置,(

4

4

4位置都没有

0

0

0的情况下也可以这样算,都不是

0

0

0去掉两个显然没有问题)当

n

n

n为偶数时,我们只需要询问

n

2

2

4

=

2

n

4

\frac{n-2}{2}*4=2n-4

2n−2​∗4=2n−4次,而如果为奇数,最后会剩余

3

3

3个没有去掉的位置,我们只需要把之前任意一个去掉过的位置拿过来凑够

4

4

4个再进行

1

1

1轮即可,总的询问次数时

n

3

2

4

+

4

=

2

n

2

\frac{n-3}{2}*4+4=2n-2

2n−3​∗4+4=2n−2,都可以满足要求。

代码:

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
//#define int LL
//#define endl '\n'
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#pragma warning(disable :4996)
const double eps = 1e-8;
const LL mod = 1000000007;
const LL MOD = 998244353;
const int maxn = 1010; int T, N;
bool used[maxn]; void solve()
{
PII res[4];
vector<int>num;
int lst = N, pos = 1, tmp, ans;
while (lst > 3)
{
while (num.size() < 4)
{
if (!used[pos])
num.push_back(pos);
pos++;
}
for (int i = 0; i < 4; i++)
{
cout << "? " << num[i] << ' ' << num[(i + 1) % 4] << ' ' << num[(i + 2) % 4] << endl;
cin >> ans;
res[i] = PII(ans, num[(i + 3) % 4]);
}
sort(res, res + 4);
int a = res[2].second, b = res[3].second;
used[a] = used[b] = true;
num.erase(find(num.begin(), num.end(), a)), num.erase(find(num.begin(), num.end(), b));
tmp = a;
lst -= 2;
}
if (lst == 2)
cout << "! " << num[0] << ' ' << num[1] << endl;
else
{
while (num.size() < 3)
{
if (!used[pos])
num.push_back(pos);
pos++;
}
num.push_back(tmp);
for (int i = 0; i < 4; i++)
{
cout << "? " << num[i] << ' ' << num[(i + 1) % 4] << ' ' << num[(i + 2) % 4] << endl;
cin >> ans;
res[i] = PII(ans, num[(i + 3) % 4]);
}
sort(res, res + 4);
int a = res[2].second, b = res[3].second;
used[a] = used[b] = true;
num.erase(find(num.begin(), num.end(), a)), num.erase(find(num.begin(), num.end(), b));
cout << "! " << num[0] << ' ' << num[1] << endl;
}
} int main()
{
IOS;
cin >> T;
while (T--)
{
cin >> N;
memset(used, false, sizeof(used));
solve();
} return 0;
}

Codeforces Round #770 (Div. 2)D的更多相关文章

  1. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  2. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  3. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  4. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  5. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  6. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

  7. Codeforces Round #262 (Div. 2) 1004

    Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...

  8. Codeforces Round #371 (Div. 1)

    A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...

  9. Codeforces Round #268 (Div. 2) ABCD

    CF469 Codeforces Round #268 (Div. 2) http://codeforces.com/contest/469 开学了,时间少,水题就不写题解了,不水的题也不写这么详细了 ...

随机推荐

  1. linux磁盘管理(全面解析)

    目录 一:磁盘管理 1.磁盘管理作用 2.磁盘挂载顺序 3.磁盘分区 4.Linux 磁盘管理常用命令 5.磁盘分区内容 二:linux中分区的意义 三:分区的步骤与顺序 1.添加磁盘 2.查看创建新 ...

  2. v76.01 鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式 | 百篇博客分析OpenHarmony源码

    百篇博客分析|本篇为:(共享内存篇) | 进程间最快通讯方式 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) | 同样 ...

  3. ==和equeals区别以及使用场景

    定义 ==:基本数据类型比较的是值或地址,引用数据类型比较的是地址. equals:在不重写的情况下,和==没有任何区别,重写,可以自定义比较规则,一般重写之后都让其比较值. Object类中的equ ...

  4. Nginx 配置 HTTPS 服务器

    Nginx 配置 HTTPS 服务器 Chrome 浏览器地址栏标志着 HTTPS 的绿色小锁头从心理层面上可以给用户专业安全的心理暗示,本文简单总结一下如何在 Nginx 配置 HTTPS 服务器, ...

  5. Eclipse 找不到或者无法加载主类

    最近因为频繁练习JDBC更换了几次驱动jar包,然后突然发现出现了找不到或者无法加载主类的错误, 项目上出现了一个感叹号. 解决方法: 项目-右键 properties-java Build Path ...

  6. NoSQL之Redis配置与优化

    NoSQL之Redis配置与优化 目录 NoSQL之Redis配置与优化 一.关系数据库和非关系数据库 1. 关系型数据库 2. 非关系型数据库 3. 非关系型数据库产生背景 4. 关系型数据库和非关 ...

  7. SpringBoot一览

    spring-boot入门 了解SpringBoot 为什么学习SpringBoot java一直被人诟病的一点就是臃肿.麻烦.当我们还在辛苦的搭建项目时,可能Python程序员已经把功能写好了,究其 ...

  8. 员工管理系统+字符编码+Python代码文件操作

    员工管理系统+字符编码+Python代码文件操作 1.员工管理系统 1.1  debug 代码调试 1.先使用鼠标左键在需要调试的代码左边点击一下(会出现一个红点)2.之后右键点击debug运行代码 ...

  9. python 2048游戏控制器

    2048游戏控制器 1 evaluate 要用程序来处理就得对现实的问题进行量化,用数字来表示.在2048游戏中,我们的输入是一个棋局,让我们输出一个移动方向,这样我们需要对棋局进行量化,即我们要评估 ...

  10. php base64格式的图片字符串和图片文件相互转换的代码

    在移动端上传图片的时候通常会将图片转换成base64格式的字符串提交,所以此时需要使用服务器端的程序进行转换成二进制的数据.如下PHP代码实现了图片文件和base64格式的图片字符串相互转换的方法,同 ...