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

news2024/12/22 15:33:12

题目

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.coloradmin.cn/o/1715807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于java实现图片中任意封闭区域识别

需求&#xff1a; 在浏览器中给用户呈现一张图片&#xff0c;用户点击图片中的某些标志物&#xff0c;需要系统给出标志物的信息反馈&#xff0c;达到一个交互的作用。 比如下图中&#xff0c;点击某个封闭区域时候&#xff0c;需要告知用户点击的区域名称及图形形状特性等等。…

Django之rest_framework(九)

一、分页-PageNumberPagination类 REST framework提供了分页的支持 官网:Pagination - Django REST framework 1.1、全局设置 # settings.py REST_FRAMEWORK = {DEFAULT_PAGINATION_CLASS: rest_framework.pagination.PageNumberPagination,PAGE_SIZE: 100 # 每页数目 }提示…

相对论表明速度越快时间越慢,为什么速度会影响时间?

在物理学的宏伟殿堂中&#xff0c;相对论以其深邃的洞察力&#xff0c;挑战了我们对时间和空间的传统认识。1905年&#xff0c;阿尔伯特爱因斯坦提出了狭义相对论&#xff0c;揭示了在所有惯性参照系中&#xff0c;光速是常数的惊人事实。 随后在1915年&#xff0c;他进一步发展…

ABAP 在增强中COMMIT

前言 呃&#xff0c;又是很磨人的需求&#xff0c;正常情况下是不允许在增强中COMMIT的&#xff0c;会影响源程序本身的逻辑&#xff0c;但是这个需求就得这么干… 就是在交货单增强里面要再调用一次交货单BAPI&#xff0c;通过SO的交货单自动创建STO的交货单&#xff0c;如果…

uniapp h5项目切换导航栏及动态渲染按钮颜色

1.效果图 2.html,动态渲染按钮样式---三元判断 <!-- 切换栏 --><view class"statusList"><block v-for"(item,index) in list" :key"index"><view class"swiper-tab-list" :class"current item.id?activ…

基于扩散模型的,开源世界模型DIAMOND

日内瓦大学、微软研究院和爱丁堡大学的研究人员联合开源了&#xff0c;基于扩散模型的世界模型—DIAMOND。 研究人员之所以选择扩散模型作为基础&#xff0c;是因为可以更好地捕捉视觉细节&#xff0c;同时具有建模复杂多模态分布的能力&#xff0c;以便在不同的环境下进行训练…

网络融合的力量:企业如何通过“一网多用”提升业务效率

随着企业业务的不断扩展&#xff0c;网络需求变得日益复杂。需要的是一种能够统一承载办公、生产、销售和运营等多业务需求的网络架构。这种“一网多用”的架构&#xff0c;不仅简化了网络部署和管理&#xff0c;还提升了效率并降低了成本。 “一网多用”架构的实际应用&#x…

[ C++ ] 深入理解模板( 初 阶 )

函数模板 函数模板格式 template <typename T1, typename T2,......,typename Tn> 返回值类型 函数名(参数列表){} 注意&#xff1a; typename是用来定义模板参数关键字&#xff0c;也可以使用class(切记&#xff1a;不能使用struct代替class) 函数模板的实例化 模板参数…

文件预览的实现

1.pdf预览 使用iframe 如果是预览本地文件&#xff0c;且是vue项目&#xff0c;pdf文件需要放在public文件夹下。 调试环境&#xff1a;vue、vant、js <template><div style"height: 100%;width: 100%"><iframe :src"pageUrl" style&quo…

Docker容器测试-常见问题+解决

前言 问题1&#xff1a;创建 nginx 容器尝试挂载 nginx.conf 文件时报错&#xff1a; mounting “/root/nginx.conf” to rootfs at “/etc/nginx/nginx.conf” caused: mount through procfd: not a directory: 在自己的服务器上想通过 nginx 镜像创建容器&#xff0c;并挂载…

ROS | C++和python实现发布结点和订阅结点

发布者结点&#xff1a; 代码实现&#xff1a; python: C: C和Python发布结点的差异&#xff1a; python: 发布结点pub 大管家rospy调用publisher函数发布话题 (话题,类型&#xff0c;话题长度&#xff09; C: 先定义一个大管家&#xff1a;NodeHandle 然后大管家发布话题…

【leetcode——栈的题目】——1003. 检查替换后的词是否有效python

题目&#xff1a; 给你一个字符串 s &#xff0c;请你判断它是否 有效 。 字符串 s 有效 需要满足&#xff1a;假设开始有一个空字符串 t "" &#xff0c;你可以执行 任意次 下述操作将 t 转换为 s &#xff1a; 将字符串 "abc" 插入到 t 中的任意位置…

Dinky MySQLCDC 整库同步到 MySQL jar包冲突问题解决

资源&#xff1a;flink 1.17.0、dinky 1.0.2 问题&#xff1a;对于kafka相关的包内类找不到的情况 解决&#xff1a;使用 flink-sql-connector- 胖包即可&#xff0c;去掉 flink-connector- 相关瘦包&#xff0c;解决胖瘦包冲突 source使用 flink-sql-connector- 胖包&#…

2024年西安交通大学程序设计校赛

A题 签到题 代码如下 //A #include<iostream> #include<algorithm> #define int long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); using namespace std; signed main() {IOSint a,b,c,d;cin>>a>>b>>c…

景源畅信:抖音小店如何开橱窗?

在当今数字化时代&#xff0c;社交媒体平台不仅仅是人们交流和分享生活的工具&#xff0c;更成为了商家们展示和销售产品的重要场所。抖音作为一款流行的短视频社交应用&#xff0c;其内置的电商功能——抖音小店&#xff0c;为众多商家和个人提供了便捷的在线销售途径。其中&a…

geotrust通配符证书600元且赠送一个月

GeoTrust作为国际知名的数字证书颁发机构&#xff0c;旗下有RapidSSL、QuickSSL等子品牌经营着各种类型的SSL数字证书&#xff0c;其中RapidSSL旗下的SSL数字证书都是入门级的&#xff0c;性价比高。审核速度也比较快&#xff0c;证书的适用范围也比较广泛。今天就随SSL盾小编了…

一款开箱即用的Markdown 编辑器!【送源码】

开源的 Markdown 编辑器 Cherry Markdown Editor 是一款前端-markdown-编辑器-组件&#xff0c;具有开箱即用、轻量简洁、易于扩展等特点&#xff0c;它可以运行在浏览器或服务端 (NodeJs). 当 Cherry Markdown 编辑器支持的语法不满足开发者需求时&#xff0c;可以快速的进行…

在WHM中如何调整max_upload_size 参数大小

今日我们在搭建新网站时需要调整一下PHP参数max_upload_size 的大小&#xff0c;我们公司使用的Hostease的美国独立服务器产品默认5个IP地址&#xff0c;也购买了cPanel面板&#xff0c;因此联系Hostease的技术支持&#xff0c;寻求帮助了解到如何在WHM中调整PHP参数&#xff0…

蓝桥杯物联网竞赛_STM32L071KBU6_对于EEPROM的新理解

EEPROM写函数&#xff1a; void Function_GetEepromData(){Function_EepromRead(4, BUFF);OLED_ShowChar(0, 0, BUFF[0] 0);OLED_ShowChar(0, 2, BUFF[1] 0); BUFF[0] ;BUFF[1] ;HAL_FLASHEx_DATAEEPROM_Unlock();HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_WOR…

《STM32Cube高效开发教程基础篇》- 安装软件/Demo3_1LED

文章目录 下载两个软件安装问题记录在STM32CubeMX中新建项目编辑代码在CudeMX中完成图形化设置在CudeIdea中编码在CLion中编码&#xff08;智能化&#xff09; 效果图 下载两个软件 百度网盘链接&#xff1a;https://pan.baidu.com/s/1uXLWIIVCJbF4ZdvZ7k11Pw 提取码&#xff1…