[Yandex Cup 2024 Qual F] Zeroth Rome 题解

news/2024/12/19 20:35:08/文章来源:https://www.cnblogs.com/physics212303/p/18617889

前言

English version of this editorial is provided after the sample code.

题意简述

本题为交互题,你需要猜 \(t\)\([0,2024]\) 间的非负整数 \(x_1,x_2,\ldots,x_t\),可以询问最多 \(15\) 次,每次询问形如“给定一个大小为 \(N(1\le N\le 2025)\) 的集合 \(S\) 满足 \(S\) 的每个元素都是 \([0,2024]\) 间的非负整数,交互库回答每个 \(x_i\) 是否在该集合内”。

注意,你的询问需要一次性全部给出,之后交互库再进行回答。但是,对于每个 \(x_i\),交互库会在最多一个询问上给出错误的回复,而你需要准确地找出每个 \(x_i\)

题目解法

如果交互库不会给出错误的回复,那么解决问题是简单的:考虑二进制拆位,对于每一位,询问值域中所有该位为 \(1\) 的数构成的集合,如果目标数存在于该集合内,代表目标数的该位为 \(1\),否则为 \(0\)。可以在 \(\lceil\log_2V\rceil\) 次询问内完成。

如果交互库会在最多一个询问上给出错误的回复呢?考虑给 \([0,2024]\) 间每个整数一个独特的“编号”:设整数 \(i\) 的编号为 \(a_i\),如果 \(\forall i\ne j,\mathrm{popcount}(a_i\oplus a_j)\ge 3\)(其中 \(\mathrm{popcount}\) 表示一个整数二进制下 \(1\) 的个数,\(\oplus\) 表示按位异或),那么使用上面的询问方法询问这些编号,一定会得出正确的答案。具体确定答案的方法为,假设询问中得到了一个数 \(x\),那么只要找到唯一一个 \(a_i\) 满足 \(\mathrm{popcount}(a_i\oplus x)\le 1\)\(a_i\)\(i\) 即为答案——可以证明这种编号构造方法能唯一确定答案。

现在的问题即为构造一组这样的 \(a_i\)。我们发现可以从 \(0\) 开始给每个数分配编号,将所有不合法的编号插入一个 std::set,之后找之中没出现过的最小非负整数,将其作为编号分配给下一个整数。用上面的方法进行暴力枚举,发现存在一组构造使得 \(a_i\le 32330\),可以在 \(15\) 次询问内找到答案。

示例代码(C++17)

#include<bits/stdc++.h>
using namespace std;
const int N=2024;
int main(){ios::sync_with_stdio(false);vector<int> a; set<int> s;for(int i=0,x=0;i<=N;i++){a.emplace_back(x),s.emplace(x);for(int j=0;j<15;j++)for(int k=0;k<15;k++)s.emplace(x^(1<<j)^(j==k?0:(1<<k)));while(s.find(x)!=s.end())x++;}cerr<<a.back()<<endl;for(int i=0;i<=N;i++)for(int j=i+1;j<=N;j++)assert(__builtin_popcount(a[i]^a[j])>=3);int t; cin>>t;vector<vector<int> > v(15);cout<<"15\n";for(int i=0;i<15;i++){for(int j=0;j<=N;j++)if(a[j]>>i&1)v[i].emplace_back(j);for(int j:v[i])cout<<j<<' ';cout<<endl;}while(t--){int c=0,r=-1;for(int i=0;i<15;i++){int x; cin>>x;if(x)c|=1<<i;}for(int i=0;i<=N;i++)if(__builtin_popcount(a[i]^c)<=1)r=i;cout<<r<<endl;}return 0;
}

English Version

Translated by ChatGPT

Problem

This is an interactive problem, where you need to guess $ t $ non-negative integers $ x_1, x_2, \ldots, x_t $ within the range \([0, 2024]\). You can ask at most \(15\) queries, and each query takes the form: "Given a set $ S $ of size $ N(1\le N\le 2025)$, where every element of $ S $ is a non-negative integer within \([0, 2024]\), does the interactor return whether each $ x_i $ is in this set or not?"

Note that you must provide all the queries at once, after which the interactor will respond. However, for each $ x_i $, the system will give incorrect feedback for at most one query, and your goal is to accurately identify each $ x_i $.

Solution

If the interactor never gave incorrect feedback, the solution would be straightforward: Consider the binary representation of each number. For each bit position, query a set consisting of all numbers in the range whose value in that bit position is \(1\). If the target number belongs to that set, then the corresponding bit is \(1\); otherwise, it is \(0\). This could be done in $ \lceil \log_2 V \rceil $ queries.

However, with the interactor potentially giving an incorrect response for up to one query, we need to take a different approach. We assign a unique "code" to each integer in the range \([0, 2024]\). Let the code for integer $ i $ be $ a_i $, and ensure that for all $ i \neq j $, we have $ \mathrm{popcount}(a_i \oplus a_j) \geq 3 $, where $ \mathrm{popcount} $ denotes the number of \(1\)s in the binary representation of an integer, and $ \oplus $ represents the bitwise XOR operation. By querying these codes in the method described earlier, we can guarantee a correct result.

To determine the answer, suppose we obtain a result $ x $ from the queries. We need to find the unique $ a_i $ such that $ \mathrm{popcount}(a_i \oplus x) \leq 1 $, which will give us the correct $ i $. This method ensures that we can uniquely identify the correct answer.

The problem now becomes constructing such a set of $ a_i $. We can assign codes starting from \(0\), and for each code, insert invalid codes into a std::set. Then, for each subsequent number, assign the smallest non-negative integer that has not yet been used as a code. Using brute force exploration, we find that there exists a set of codes such that $ a_i \leq 32330 $, which allows us to find the answer within \(15\) queries.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/855578.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java-递归查询部门下所有子部门(包括本部门)

Java-递归查询部门下所有子部门(包括本部门),会得到一个部门id的集合:List deptIds具体代码如下: //递归1public List<Long> queryAllSubInstitutionIds(Long institutionId) {List<Long> subInstitutionIds = new ArrayList<>();querySubInstitutionIds…

生物医学信息

生物信息学基础 生物医学信息学的概念的掌握生物信息学很大一部分工作体现在生物数据的收集、存储、管理与提供 利用多组学数据(基因组,转录组,表观遗传组、蛋白组等)和机器学习、数据挖掘的方法 ,挖掘潜在的生物学、医学的知识和模式,用于解决诊断和治疗。中心法则是什么…

5、导出表

5、导出表 typedef struct _IMAGE_EXPORT_DIRECTORY {DWORD Characteristics;DWORD TimeDateStamp;WORD MajorVersion;WORD MinorVersion;DWORD Name; // 指向 导出表的文件名DWORD Base; // 导出函数的起始序号DWORD NumberOfFunctions; // 所有导…

4、文件与内存转换相关

4、文件与内存转换相关 FileBufferToImageBuffer 也是一样的长话短说。这里涉及了一点,就是内存对齐 PE头与节区之间 节区与节区时间会发生内存对齐。在文件中有一个文件对齐 ​​ 在可选PE头中有这两个进行标识,之前也写过这个内存对齐的博客,这里就不多说了 下面贴几个代…

1、PE 初识

1、PE 初识 概论 首先 PE头部分主要是学习PE结构的前半部分,每一个是做什么的,以及重点是什么,每一个是做什么用的。并使用Cpp代码来解析该PE头 注意这里用了一个Windows.h的头文件,后面再说。 PE是Windows系统 PE结构(Portable Executable),即可移植可执行文件格式,是…

交换空间swap

交换空间: 交换空间是硬盘上的一部分,被用作虚拟内存,当系统的物理内存(RAM)不足时,系统会使用交换空间来存储暂时不用的数据。1.关闭交换空间 1)关闭所有交换空间 swapoff -a2)关闭特定的交换空间 swapoff /dev/sdb12.开启交换空间 1)开启所有交换空间 swapon -a2…

2024 IDEA 2024.3 安装使用教程(附激活至2099年,以及常见问题处理)

IntelliJ IDEA简介 IntelliJ IDEA是一款非常强大的Java集成开发环境(IDE),由JetBrains公司开发。它提供了丰富的功能和工具,帮助开发者更高效地编写、调试和部署代码。 下面这种方式仅供交流学习,如果有能力还请支持正版 下载安装 下载 IDEA 2024.3 版本的安装包 为了方便,也…

第十六次作业

1、通过华为云沃土云创计划免费薅云服务器 打开链接:https://developer.huaweicloud.com/programs/dev-program.html 使能⽅向选择个⼈在这个 计划权益中申请优惠券免费购买成功2、复现windows、linux权限维持技巧 windows权限维持: 隐藏⽂件:利⽤⽂件属性 ⽂件右键属性,勾…

OpenCL 编程步骤 2. 获取设备

clGetDeviceIDs 查询支持OpenCL设备列表: cl_int clGetDeviceIDs(cl_platform_id platform ,cl_device_type device_type ,cl_uint num_entries ,cl_device_id *devices ,cl_uint *num_devices )与clGetPlatformIDs函数类似,第一次调用时,devic…

记录一下:小华半导体HC32F448建立MDK工程

1.先到官网上下载文件 a>下载驱动库:HC32F448_DDL_Rev1.1.0.zip 驱动库中是包括了例程的。 b>下载样例:HC32F448_Template_Rev1.0.1.zip 可以直接复制官方的样例,就不用自己创建工程了。 c>下载芯片支持包:HC32F448_IDE_Rev1.0.1.zip 下载后双击安装即可。否则KEI…

4大应用场景揭秘:AI视频监控在养老院中的智能化管理与安全保障

随着人口老龄化的加剧,养老院的管理面临着越来越多的挑战。传统的人工巡查方式不仅难以做到全天候监控,而且存在响应迟缓、效率低下等问题。为了解决这些问题,思通数科推出的AI视频监控系统,利用人工智能技术提供了一种高效、智能化的解决方案。尤其在养老院的老人体征监控…