Codeforces Round #770 (Div. 2)D
传送门
题目大意:
交互题,
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的更多相关文章
- 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 ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- Codeforces Round #279 (Div. 2) ABCDE
Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name A Team Olympiad standard input/outpu ...
- 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 ...
- 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 ...
- Codeforces Round #371 (Div. 1)
A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...
- Codeforces Round #268 (Div. 2) ABCD
CF469 Codeforces Round #268 (Div. 2) http://codeforces.com/contest/469 开学了,时间少,水题就不写题解了,不水的题也不写这么详细了 ...
随机推荐
- memcached 小记
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串.对象).这些数据可以是数据库调用.API ...
- 如何在 VS Code 中搭建 Qt 开发环境
前言 VS Code 高大上的界面.强大的智能联想和庞大的插件市场,着实让人对他爱不释手.虽然可以更改 Qt Creator 的主题,但是 Qt Creator 的代码体验实在差劲.下面就来看看如何在 ...
- IPsec协议簇简析
简介 IPsec协议簇是应用在网络层上的,来保护IP数据报的一组网络传输协议的集合.它是IETF(Internet Engineering Task Force)制定的一系列协议,它为IP数据报提供了 ...
- Xml的一些基本概念(摘抄自w3school.com.cn)
一个Xml的文档示例: 点击查看代码 <?xml version="1.0" encoding="ISO-8859-1"?> <note> ...
- 布客·ApacheCN 编程/大数据/数据科学/人工智能学习资源 2020.2
特约赞助商 公告 我们愿意普及区块链技术,但前提是互利互惠.我们有大量技术类学习资源,也有大量的人需要这些资源.如果能借助区块链技术存储和分发,我们就能将它们普及给我们的受众. 我们正在招募项目负责人 ...
- 014 Linux 线上高频使用以及面试高频问题——如何查找大文件并安全的清除?
目录 1 案例描述? 2 命令一(目录统计排序最佳命令) 3 命令二(最实用,目录和文件一起统计排序) (1)命令详情和说明 (2)du.head.sort.awk 详细说明参考已有文章附录 (3)L ...
- Solution -「国家集训队」「洛谷 P2619」Tree I
\(\mathcal{Description}\) Link. 给一个 \(n\) 个点 \(m\) 条边的带权无向图,边有权值和黑白颜色,求恰选出 \(K\) 条白边构成的最小生成树. ...
- aspnetcore 使用serilog日志
而在实际项目开发中,使用第三方日志框架来记录日志也是非常多的,首先一般基础的内置日志记录器在第三方日志框架中都有实现,然后很多第三方日志框架在功能上更强大和丰富,能满足我们更多的项目分析和诊断的需求. ...
- shell脚本批量配置多台主机静态ip
关于脚本 服务器使用之前,都需要先配置静态IP,那就将这种简单重复的工作,交给脚本来处理吧,让我们运维有更多的时间喝茶看报刷微博 脚本使用 sh ssh.sh ip.txt ssh.sh 为脚本的名称 ...
- CentOS7 下 ldap 部署
环境准备 # 关闭防火墙以及selinux,生产环境中,以实际需求为准 [root@localhost ~]# hostnamectl --static set-hostname ldap-serve ...