Codeforces Round 948 (Div. 2) E. Tensor(思维题-交互)

题目

n(3<=n<=100)个点的有向图,

图的边的关系未知,但保证以下两点:

1. 只存在j->i(i<j)的边

2. 对于任意三个点i、j、k(i<j<k),要么k可以到达i,要么k可以到达j,要么j可以到达i

每次你可以询问两个点,? i j(i<j),如果j可以到达i,返回YES,否则返回NO

你需要将图染成黑白两色,

使得黑色的任意两个点x、y(x<y),都满足y可到达x,

且白色的任意两个点x、y(x<y),都满足y可到达x

你有最多2n次询问机会,可以证明答案一定存在

最终输出n个点染色的情况,输出0表示染黑色,为1表示染白色

图不是交互式的,也就是说图一开始是固定下来的,不会随询问的改变而动态变更

实际t(t<=100)组样例,但保证sumn不超过1000

思路来源

乱搞ac

题解

其实也不完全是算乱搞,一开始wa了,后来看了下数据的反例修了下就过了

首先原图肯定可以拆分成两条链,这样对于三个点,一定存在两点共链,就满足题意了

然后考虑这个图的形状可能是怎样的,一开始是想的双螺旋结构的

维护两条链,开始只有点n,然后点n-1如果在点n下游就接上去,否则就新开一条链,

然后这两条链可以汇集在一点,后续在这点之后继续扩,类似Y型,

然后Y型后续还能拆成两个分支,再成两条链,后续两条链再能合并成一个点,重复若干次

然后输出的话,就沿着点n,往下找一个下游,直接找齐一条链,这样另一条链就自然另一种颜色

但是,遇到了一个反例

可以发现,在点5形成Y字型,后接点4之后,新来的点3并没有续到点4上,

也没有续到点5上,而是续到了点6上,

此时我找的链是10->9->6->5->4->1,就使得另一条链8->7和3->2不连通

而此时应该是10->9->6->3->2,另一条链8->7->5->4->1

这表明,当出现Y形状的交点时(也就是图中的5点)后,代表两条链合成了一条链(合并)

这时候这条链往下接了点4,

新来的点3,可以接在点4后,也可以接在点5后,也可以接在点6后,也可以接在点7后,

这四种情况,都能使原图被划分成两条链,

对于5->4链上有多个点的情况,不妨只视为有Y字形交点(点5)、Y字形尾部点(点4)两个点

因为在链中间的点后面续新的点,都可以看成是在交点后面续新的点,不影响两条链的性质

此外注意到,点3的出现,使得一条链又变成了两条链(拆分)

这两条链后续仍然可能再形成新的Y字形,也就是分分合合的过程可能出现若干次

所以,做法是:

1. 初始时,点n当第一条链的链尾

2. 当前如果有两条链,记他们的链尾分别为f和s,当前要续的点是i,

(1)i如果能同时往f和s后面续,代表两条链合成了一条

(2)否则,如果能往第一条链后面续,就往第一条后面续

(3)否则,如果能往第二条链后面续,就往第二条后面续

(4)否则,两条链都续不了,记两条链上一次合并成Y字形交点(也就是上图的点5)为las,如果能往las后面续,就往las后面续

(5)否则,记las的两个父亲为f1、f2(也就是上图的点6、点7),如果能往f1后面续,就往f1后面续

(6)否则往f2后面续

3. 如果当前只有一条链,能续则续,不能续的时候,新开一条链即可

代码里加了如果不存在则为-1的情况,以及加了询问的记忆化,统一了部分情况的分类讨论

询问次数想了一下,是不超过2n的,因为最极端的情况是上图点3不能续到点4后面的情况

此时有4种情况,需要最多询问3次才能确认是哪种情况,

而这种情况的出现,说明前面有一个只询问了1次的点,也就是在点5下面的点4,

这两个点均摊一下,平均次数就不超过2了

代码

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
using namespace std;
const int N=105;
int t,n,col[N];
vector<int>e[N];
int mp[N][N];
char s[10];
void clr(int x){if(x<0)return;e[x].clear();
}
void add(int x,int y){if(x<0)return;e[x].pb(y);
}
bool ask(int i,int j){if(i>j)return 0;if(~mp[i][j])return mp[i][j];printf("? %d %d\n",i,j);fflush(stdout);scanf("%s",s);return mp[i][j]=(strcmp(s,"YES")==0);
}
void out(){printf("! ");rep(i,1,n){printf("%d%c",col[i]," \n"[i==n]);}fflush(stdout);
}
int main(){sci(t);while(t--){memset(col,0,sizeof col);memset(mp,-1,sizeof mp);sci(n);rep(i,1,n)e[i].clear();int f=n,s=-1,las=-1,f1=-1,f2=-1;bool x,y;per(i,n-1,1){x=ask(i,f),y=ask(i,s);if(x && y){add(f,i);add(s,i);las=i,f1=f,f2=s;f=i,s=-1;}else if(x){add(f,i);f=i;}else if(y){add(s,i);s=i;}else{if(las==-1)s=i;else{y=ask(i,las);if(y){add(las,i);s=i;continue;}y=ask(i,f1);if(y){clr(f1);add(f1,i);s=i;}else{clr(f2);add(f2,i);s=i;}}}}for(int i=n;;i=e[i][0]){col[i]=1;if(e[i].empty())break;}out();}return 0;
}

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

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

相关文章

开源数据库同步工具DBSyncer

前言&#xff1a; 这么实用的工具&#xff0c;竟然今天才发现&#xff0c;相见恨晚呀&#xff01;&#xff01;&#xff01;&#xff01; DBSyncer&#xff08;英[dbsɪŋkɜː]&#xff0c;美[dbsɪŋkɜː 简称dbs&#xff09;是一款开源的数据同步中间件&#xff0c;提供M…

如何使用 ArcGIS Pro 计算水库库容量

计算水库库容量可以在前期规划的时候协助水库的选址和预估水库的规模&#xff0c;这里为大家介绍一下在 ArcGIS Pro 中如何计算水库的库容量&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM数据&#xff0c;除了DEM数据&#xff0c;常见…

opencascade AIS_Circle AIS_ColoredDrawer AIS_CameraFrustum 源码学习 圆

类AIS_Circle 构造圆形基准面&#xff0c;用于构建复合形状。 AIS_Circle() [1/2] AIS_Circle::AIS_Circle ( const Handle< Geom_Circle > & aCircle ) 初始化用于构造 AIS 圆形基准面的算法&#xff0c;并初始化圆形 aCircle。 AIS_Circle() [2/2] AIS_Circ…

Java设计模式:享元模式实现高效对象共享与内存优化(十一)

码到三十五 &#xff1a; 个人主页 目录 一、引言二、享元设计模式的概念1. 对象状态的划分2. 共享机制 三、享元设计模式的组成四、享元设计模式的工作原理五、享元模式的使用六、享元设计模式的优点和适用场景结语 [参见]&#xff1a; Java设计模式&#xff1a;核心概述&…

算法的时间复杂度(详解)

前言&#xff1a; 算法(Algorithm):就是定义良好的计算过程&#xff0c;他取一个或一组的值为输入&#xff0c;并产生出一个或一组值作为 输出。简单来说算法就是一系列的计算步骤&#xff0c;用来将输入数据转化成输出结果 一、算法效率 1.1 如何衡量一个算法的好坏 如何衡…

轻量级 C Logger

目录 一、描述 二、实现效果 三、使用案例 四、内存检测 一、描述 最近实现一个 WS 服务器&#xff0c;内部需要一个日志打印记录服务器程序的运行过程&#xff0c;故自己实现了一个轻量级的 logger&#xff0c;主要包含如下特征&#xff1a; 可输出 debug、info、warn、er…

支付功能、支付平台、支持渠道如何测试?

有学员提问&#xff1a;作为一个支付平台&#xff0c;接入了快钱、易宝或直连银行等多家的渠道&#xff0c;内在的产品流程是自己的。业内有什么比较好的测试办法&#xff0c;来测试各渠道及其支持的银行通道呢&#xff1f; 作为产品&#xff0c;我自己办了十几张银行卡方便测…

echarts-dataset,graphic,dataZoom, toolbox

dataset数据集配置数据 dataset数据集&#xff0c;也可以完成数据的映射&#xff0c;一般用于一段数据画多个图表 例子&#xff1a; options {tooltip: {},dataset: {source: [["product", "2015", "2016", "2017"],["test&q…

网工内推 | 国企信息安全工程师,CISP认证优先

01 浙江省公众信息产业有限公司 &#x1f537;招聘岗位&#xff1a;安全运营工程师 &#x1f537;职责描述&#xff1a; 1. 负责公司内部安全运营平台及其子系统的安全事件管理、事件发现分析、应急响应和系统维护等&#xff1b; 2. 负责风险和漏洞管理&#xff0c;包括漏洞预…

如何在中国网上发布文章

随着互联网的迅猛发展&#xff0c;网上发布文章已经成为一种重要的传播方式。而在中国&#xff0c;作为世界上最大的互联网市场&#xff0c;如何在中国网上发布文章成为了许多人关注的焦点。媒介多多网发稿平台作为一个专业的发稿平台&#xff0c;为广大作者提供了很好的发布文…

上下文视觉提示实现zero-shot分割检测及多visual-prompt改造

文章目录 一、Closed-Set VS Open-set二、DINOv2.1 论文和代码2.2 内容2.3 安装部署2.4 使用效果 三、多visual prompt 改造3.1 获取示例图mask3.2 修改函数参数3.3 推理代码3.4 效果的提升&#xff01; 四、总结 本文主要介绍visual prompt模型DINOv&#xff0c;该模型可输入八…

基于STM32单片机老人体温心率血氧跌倒定位短信报警

一.硬件及设计功能 以STM32F103C8T6为中央处理器&#xff0c;GPS模块用采集数据&#xff0c;将数据发送给单片机后&#xff0c;单片机根据定位计算公式得出当前位置的经纬度信息和时间信息。经过LCD显示器处理后得出和时间信息SIM800模块发送短信到设定的手机号上&#xff0c;将…

基于心电疾病分类的深度学习模型部署应用于OrangePi Kunpeng Pro开发板

一、开发板资源介绍 该板具有4核心64位的处理器和8TOPS的AI算力&#xff0c;让我们验证一下&#xff0c;在该板上跑深度学习模型的效果如何&#xff1f; 二、配网及远程SSH登录访问系统 在通过microusb连接串口进入开发板调试&#xff0c;在命令行终端执行以下命令 1&#…

Verilog HDL基础知识(一)

引言&#xff1a;本文我们介绍Verilog HDL的基础知识&#xff0c;重点对Verilog HDL的基本语法及其应用要点进行介绍。 1. Verilog HDL概述 什么是Verilog&#xff1f;Verilog是IEEE标准的硬件描述语言&#xff0c;一种基于文本的语言&#xff0c;用于描述最终将在硬件中实现…

antd table列选中效果实现

前言 开发中有一个需要呈现不同时间点各个气象要素的值需求&#xff0c;我觉得一个table可以实现这类数据的展示&#xff0c;只是因为时间点时关注的重点&#xff0c;所以需要列选中效果&#xff0c;清晰的展示时间点下的要素数据。我选择的是antd的table组件&#xff0c;这个…

el-pagination在删除非第一页的最后一条数据遇到的问题

文章目录 前言一、问题展示二、解决方案三、源码解析1、elementui2、elementplus 总结 前言 这个问题是element-ui中的问题&#xff0c;可以从源码中看出来&#xff0c;虽然页码更新了&#xff0c;active也是对的&#xff0c;但是未调用current-change的方法&#xff0c;这里就…

【C语言训练题库】杨辉三角(下三角型和金字塔型)

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 题目&#xff1a;打印杨辉三角 1. 下三角型 1.1 图例: 1.2. 解析: 1.3. 代码: 1.4. 运行&#xff1a; 2. 金字塔型 2.1 图例 2.2. 解析 2.2.1. 打印金…

Liunx学习随笔

Linux学习随笔 Linux学习随笔一.前期准备1.安装Vmware Workstation软件2.下载linux镜像3.安装操作系统4.配置静态ip5.下载安装远程连接工具 二.语法2.1 linux哲学思想(原则)2.2 小命令 夕阳无限好&#xff0c;只是近黄昏&#xff0c;时隔一年&#xff0c;重新提笔 没有比脚更远…

装机必备——截图软件PixPin安装教程

装机必备——截图软件PixPin安装教程 软件下载 软件名称&#xff1a;PixPin 1.5 软件语言&#xff1a;简体中文 软件大小&#xff1a;30.1M 系统要求&#xff1a;Windows7或更高&#xff0c; 64位操作系统 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM2G或更高 下载通道①迅…

Kafka原生API使用Java代码-生产者-发送消息

文章目录 1、生产者发送消息1.1、使用EFAK创建主题my_topic31.2、根据kafka官网文档写代码1.3、pom.xml1.4、KafkaProducer1.java1.5、使用EFAK查看主题1.6、再次运行KafkaProducer1.java1.7、再次使用EFAK查看主题 1、生产者发送消息 1.1、使用EFAK创建主题my_topic3 1.2、根…