CF1617D1 Too Many Impostors (easy version) 题解

如果我们能找到一个好人和一个坏人,我们就可以在 n2n-2 次询问内确定每个人的身份。

如何找呢?我们对每三个相邻的人进行一次询问。由于 kk 的限制,所以必然存在两组三个相邻的人结果不同。而这两组中的其中两个人的身份不变,所以我们就可以找出那两个人。总共询问 n2n-2 次。

所以总共询问次数 2n42n-4 次,符合条件。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
using namespace std;

const int N = 1e4 + 5;

int t, n;

int id1, id2;
vector<int> v;

int query(int a, int b, int c)
{
	printf("? %d %d %d\n", a, b, c);
	fflush(stdout);
	int x;
	scanf("%d", &x);
	return x;
}

void solve()
{
	int last = -1;
	for (int i = 1; i + 2 <= n; i++)
	{
		int p = query(i, i + 1, i + 2);
		if (last != -1 && last != p)
		{
			id1 = i - 1, id2 = i + 2;
			if (p == 0) v.emplace_back(id2);
			else v.emplace_back(id1);
			break;
		}
		last = p;
	}
}

int main()
{
	scanf("%d", &t);
	while (t--)
	{
		scanf("%d", &n);
		v.clear();
		v.shrink_to_fit();
		id1 = id2 = 0;
		solve();
		for (int i = 1; i <= n; i++)
		{
			if (i != id1 && i != id2)
			{
				int p = query(id1, id2, i);
				if (p == 0) v.emplace_back(i);
			}
		}
		printf("! %d ", v.size());
		for (auto& i : v) printf("%d ", i);
		fflush(stdout);
	}
	return 0;
}
posted @   HappyBobb  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示