做题随笔:P10451

news/2025/2/6 18:03:51/文章来源:https://www.cnblogs.com/Tenil/p/18701484

Solution

题意

原题链接

定义二元关系 \(\text{S}\),其满足反对称性且不满足传递性。

现有互异元素 \(N(N \le 1000)\) 个,可以进行不多于 \(10000\) 次提问,每次提问可以得知两指定元素 \(a,b\)\(a \, \text{S} \, b\) 结果。求序列 \(a_N\) 满足:对任意 \(x_i,x_{i+1} \in a_N\),有 \(x_i \, \text{S} \, x_{i+1}\)

解释一下:

反对称性:对集合 \(X\) 上的二元关系 \(\text{S}\),对任意 \(x_1,x_2 \in X(x_1 \ne x_2)\),若 \(x_1 \, \text{S} \, x_2\),则 \(x_2 \, \text{S} \, x_1\) 不成立。

例如:“小于”是实数集上的二元关系,它满足反对称性,即有:对任意 \(x_1,x_2 \in R(x_1 \ne x_2)\),若 \(x_1 < x_2\),则 \(x_2 <x_1\) 不成立。

传递性:对集合 \(X\) 上的二元关系 \(\text{S}\),对任意 \(a,b,c \in X\)\(a,b,c\) 互不相等),若 \(a \, \text{S} \, b\)\(b \, \text{S} \, c\),则有 \(a \, \text{S} \, c\) 成立。

例如:“小于”是实数集上的二元关系,它满足传递性,即有:对任意 \(a,b,c \in R\)\(a,b,c\) 互不相等),若 \(a<b\)\(b<c\),则有 \(a<c\) 成立。

由此可见,本题题面所述“小于”并非正常理解的小于,而是一种比较特殊的二元关系。基于图的思想和题目提示,我们可以尝试用图转化问题:

元素->节点 \(\hspace{1.5cm}\) 二元关系 \(\text{S}\)->边(\(a \, \text{S} \, b\) 为真->有一条从 \(a\)\(b\) 的有向边)

满足反对称性->没有无向边 \(\hspace{1.5cm}\) 不满足传递性->要求最终结果为链

所以,原题即为:在只能得知指定的 \(10000\) 条边的有向完全图(或称竞赛图)中找一条 \(\text{Hamilton}\) 路径。

分析

1.有向完全图一定存在 \(\text{Hamilton}\) 路径的证明(可跳过)

为了论述的严谨性,我们先证明有向完全图一定存在 \(\text{Hamilton}\) 路径。(当然,可以直接从百度百科找定理秒,百科链接)

以下是一个自认比较简单,十分粗糙但相对好懂的证明(若有不完备还请指出):

考虑归纳法:

设有一个 \(n(n \ge 2)\) 阶有向完全图。

\(n =2\),显然成立;

\(n=k\) 时成立,对 \(n=k+1\),考虑如何添加一个点:

(如图,只画了 \(6\) 个点,但假设中间还有很多点,除了 \(\text{Hamilton}\) 路径和 $ <1,6> $ 间的边外的边省略)




\(\hspace{1cm}\) 图1(顺接) \(\hspace{0.5cm}\) 图2(逆接) \(\hspace{1.5cm}\) 图3 \(\hspace{3cm}\) 图4

现在考虑一下链首尾连接的情况:对于图1这种成环的情况(情况 A),任意一点以任意取向都可以接入(如图3(7-6-1-2-3-4-5)图4(1-2-3-4-5-6-7)),直接不用看。重点是不成环的。


对左图情况,若新加点连边为 $ <8,1> $ 或 $ <6,7>$,则直接成立(情况 B);若为右图情况,考虑链上任意一点(此例为 3),若 3 与 7 之间连边为 $ ❤️,7> $,则 3,4,5,6,7 部分与整体形似,可以类似上述考虑方式地分隔,直至达成情况 A 或情况 B,或者分隔出的联通块阶数为 2,一定成立。 3 与 7 之间连边为 $ <7,3> $ 同理。

于是 \(n=k+1\) 时成立,故结论得证。

2.算法思路

根据上述论述过程,我们也能够得到一种方法:在已有链上插入新加点,在不能直接接上链头和链尾时,可以枚举中间某点缩小一定存在可以插入处的链范围。于是我们可以想到一种形似二分的写法:每次插入新点时,提问 \(mid=(l+r) \div 2\) 与新加点的边的取向,从而确定某部分一定有可插入处,缩小范围直至确定,然后直接插入即可。

预计最大提问次数为 \(\sum_{i=1}^N {log_2i} \approx 8529<10000\),而且貌似数据比较弱,既是每次都先枚举 \(l,r\) 最大提问次数约 \(4+\sum_{i=3}^N {[log_2(i-2)+2]} \approx 10513>10000\) 也能过(笑)。

不算插入的话时间复杂度为 \(Θ(nlogn)\),数组暴力插入,于是成了 \(Θ(n^2)\)。但对于 \(N \le 1000\) 也是绰绰有余了。

实现

先选两个点进数组,然后进行拓展:每次拓展选取数组内现有数的中间一个,和新加点进行提问,根据方向缩小区间,直至可以直接连入时,暴力连入即可。

Code

#include <iostream>
#include <cstdio>
#include <cctype>using namespace std;typedef long long ll;ll fr() {ll x=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-') f=-1;c=getchar();}while(isdigit(c)) {x=(x<<3)+(x<<1)+(c^48);c=getchar();}return x*f;
}//只读一个也要写快读的屑bool compare(int a, int b)
{cout << "? " << a << ' ' << b << endl;bool t;cin >> t;return t;
}const int maxn=1e3+100;
ll n,ans[maxn];int main(){n=fr();ans[1]=1;for(register int i = 2; i <= n; i++){if(compare(i,ans[1])) {for(register int j = i; j > 1; j--) {ans[j]=ans[j-1];}ans[1]=i;}else{int l=1,r=i;while(l+1 < r){//逆天边界,卡我2.5年int mid=(l+r)>>1;if(compare(i,ans[mid])){r=mid;}else{l=mid;}}for(register int j = i; j > r; j--) {ans[j]=ans[j-1];}ans[r]=i;}}printf("!");for(register int i = 1; i <= n; i++) printf(" %lld",ans[i]);return 0;
}

闲话

如果觉得有用,还请点个赞吧!

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

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

相关文章

腾讯云nodejs SDK打包体积过大吐槽事件

💖简介 2025年2月1日有位开发同学batchor在GitHub上提出了issue(你们是把***打包了吗?)对腾讯云Node.js的SDK打包体积过大进行吐槽(言语偏贴吧风格略显激进),SDK打包体积接近100MB,而相比之下其他云服务公司的SDK通常只有十几到二十MB,引起开发者的不满,在GitHub上遭到…

一键生成毛茸萌宠形象,基于函数计算极速部署 ComfyUI 生图系统

本次方案将带领大家使用阿里云产品函数计算 FC,只需简单操作,就可以快速部署 ComfyUI 大模型,创造出你的专属毛茸茸萌宠形象。内置基础大模型+常用插件+部分 Lora,以风格化图像生成为例让用户体验键部署的简单与方便,后续您可根据自己的需要更换需要的模型、Lora、增加插件…

Windows 本地虚拟磁盘

本文介绍如何本地创建虚拟磁盘 虚拟磁盘vhdx是类似物理硬盘一样的磁盘,可以被格式化、内部添加分区,可以指定系统文件格式如NTFS、exFAT 一个vhdx文件对应一个虚拟磁盘,下面我们来操作vhdx文件 1.创建VHDX vhdx磁盘映像文件 windows开始菜单-运行,输入“diskpart”打开磁盘…

$_Windows相关

Windows 终端美化 fluent terminal oh-my-posh 获取文件hash值 Get-FileHash -Algorithm <算法> -Path <文件路径># SHA256 winget hash -f <文件路径># CertUtil -hashfile -? CertUtil -hashfile <文件路径> <算法>快捷键win + tab 切换任务w…

13 测试质量保证

21.软件质量保证 21.1质量是免费的 一致性费用和非一致性费用,也就是一次性计划和执行测试相关的全部费用,如果非一致性费用是花时间分离、报告和回归测试以保证得以修复21.2工作现场的测试和质量保证 21.2.1软件测试 软件测试不负责软件质量,只是报告事实,全力发现缺陷,保…

12 测试成效/测试报告

20.成效评价 20.1使用软件缺陷跟踪数据库中的信息 考虑: A)什么区域缺陷最多,哪里最少? B)交给某个测试员时已解决多少软件缺陷? C)测试员计划时间内缺陷能修复吗? D)本周软件缺陷数量,本月,整个项目的数量 E)是否在规定时间做完 20.2在日常测试中使用的度量 如统计…

25.2.6小记

控制反转今天听课的时候对于这个概念听的有点云里雾里的,在这里重点解释一下。 反转控制(Inversion of Control,IoC)可以用一个生活中的比喻来理解: 传统模式:你主动控制一切 想象你是一个顾客去餐馆吃饭。在传统模式下,你需要: 自己走到厨房门口喊:“我要点菜!” 盯…

AI 场景下,函数计算 GPU 实例模型存储最佳实践

本文将对函数计算的 GPU 模型存储的优缺点及适用场景进行对比分析,以期为您的模型存储决策提供帮助。作者:有松 当前,函数计算 FC 已被广泛应用在各种 AI 场景下,函数计算支持通过使用容器镜像部署 AI 推理应用,并且提供多种选项来访问训练好的模型。为了帮助开发者高效地…

Docker快速部署Zabbix7.0教程

安装Docker 本教程基于Centos7。其余Linux发行版操作理论上无特别差异。#关闭Selinux#临时关闭setenforce 0#永久关闭sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config#关闭防火墙(方便测试)systemctl stop firewalld#安装Docker#执行如下命令,即可自动D…

10 测试用例

18.1 测试用例计划的目标 仔细计划测试用例,编写 xmind组织,有效的审查和实用 重复性,方便重复原有的测试 跟踪计划多少个测试用例? 最终执行了多少测试用例? 多少通过? 多少失败? 被忽略的测试用例?测试(或不测试)证实,测试用例计划提供了证明测试内容的手段18.2 测…

数字化时代,中小企业如何选对团队协作工具?

在团队协作工具市场竞争日益激烈的今天,板栗看板凭借其在安全性、易用性和成本效益方面的核心竞争力,成为了中小企业私有化部署的最佳选择之一。无论是数据安全的保障、简洁高效的设计,还是灵活的定价策略,板栗看板都充分考虑了中小企业的实际需求。如果你正在寻找一款既安…

如何蒸馏 Deepseek-R1

如何蒸馏 Deepseek-R1 深度学习模型已经彻底改变了人工智能领域,但其庞大的规模和计算需求可能成为现实世界应用的瓶颈。模型蒸馏是一种强大的技术,通过将知识从大型复杂模型(教师)转移到较小、更高效的模型(学生)来解决这一挑战。 在这篇博客中,这里将介绍如何使用 LoR…