洛谷 P10034 「Cfz Round 3」Circle

news2024/12/23 16:18:51

[Problem   Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription]

在这里插入图片描述

[Solution] \color{blue}{\texttt{[Solution]}} [Solution]

这是道好题。

建图,对每一个 i → p i i \to p_{i} ipi 都建立一个有向边,就可以得到一个 n n n 个点 n n n 条边组成的图。题目所需要满足的条件可以等价于从任何一个 S i S_{i} Si 1 \texttt{1} 1 的边出发走 l l l 步都能回到自身,且图中不存在自环。

显然,如果存在一个大小为 g g g 的环(点数一定等于边数,因为每个点的入度和出度均为 1 1 1),且 g g g l l l 的约数,那么这个环上的任意一点均可以走 l l l 步后回到自身。

根据这个想法,我们就可以判定是否有解:把 l l l 所有的大于 1 1 1 的约数找出来,假设记为 d 1 , d 2 , d 3 , ⋯   , d m d_{1},d_{2},d_{3},\cdots,d_{m} d1,d2,d3,,dm,有解等价于存在自然数(包括 0 0 0)序列 a 1 … m a_{1 \dots m} a1m,满足:

∑ i = 1 m a i d i = β \sum\limits_{i=1}^{m} a_{i}d_{i}=\beta i=1maidi=β

其中 β \beta β k k k n n n 的任意一个整数( k k k 表示 S S S 1 \texttt{1} 1 的点的个数)。 β \beta β 表示我们需要将有限制的 k k k 个点和无限制的点中任意的 ( β − k ) (\beta - k) (βk) 个一起组成若干个大小为 d i d_{i} di 的环(如果 a i a_{i} ai 0 0 0,则不存在大小为 d i d_{i} di 的环)。假设环的大小分别为 D 1 , D 2 , ⋯   , D M D_{1},D_{2},\cdots,D_{M} D1,D2,,DM

显然,我们用背包即可判断是否有解。同时还可以知道我们需要构造哪些大小的环。

注意: β \beta β 不能等于 n − 1 n-1 n1。如果 β = n − 1 \beta=n-1 β=n1,那么剩下的那一个没有限制的点需要形成自环,不合题意。

如果判断有解,剩下的事情就比较简单了:只要依次挑出 D i D_{i} Di 个点首尾相连形成大小为 D i D_{i} Di 的环即可。这部分比较简单,具体看代码。

[Notice] \color{blue}{\texttt{[Notice]}} [Notice]

  1. 如果 k = 0 k=0 k=0,即没有有限制的点,那么一定有解( 1 → 2 , 2 → 3 , ⋯   , n → 1 1 \to 2,2 \to 3, \cdots, n \to 1 12,23,,n1 即可)。不然会 WA on test 10 10 10
  2. 只有 ( n − 1 ) (n-1) (n1) 是不合要求的,大小为 n n n 的环是符合要求的。写代码时要注意这一点,不然会 WA on test 13 13 13
  3. dp 的时候找到了解就要及时退出,减少代码运行量,不然会 TLE on test 14 14 14
  4. 记得及时清空数组,毕竟是多测。

Code \color{blue}{\text{Code}} Code

const int N=5e5+100;

bool f[N],limit[N];
char s[N];long long l;
int T,n,k,p[N],lst[N];
int Div[N],dcnt,beg;
int unlimit[N];

void initdata(){
	for(int i=1;i<=n;i++){
		p[i]=lst[i]=Div[i]=0;
		f[i]=limit[i]=false;
		unlimit[i]=0;
	}
	k=dcnt=beg=0;
}

int main(){
	scanf("%d",&T);
	while (T--){
		scanf("%d%lld",&n,&l);
		scanf("%s",s+1);
		
		initdata();
		
		for(int i=1;i<=n;i++)
			if (s[i]=='1'){
				k++;//统计有限制的点的个数
				limit[i]=true;
			}
		
		for(int i=2;i<=n;i++)
			if (l%i==0&&i!=n-1){
				f[i]=true;
				Div[++dcnt]=i;
				lst[i]=i;//别忘了这个
			}
		
		for(int i=1,flag=1;i<=dcnt&&flag;i++)
			for(int j=Div[i];j<=n;j++)
				if (f[j-Div[i]]&&!f[j]){
					f[j]=true;
					lst[j]=Div[i];
					if (k<=j&&j<=n&&j!=n-1){
						flag=1;break;//及时退出
					}
				}
		
		for(int i=k;i<=n;i++)
			if (f[i]&&i!=n-1){
				beg=i;//对应解析里的 beta
				break;
			}
		
		if (beg!=0){
			for(int i=1,l=0;l<n-beg;i++)
				if (!limit[i]) unlimit[++l]=i;
			if (beg!=n){
				for(int i=1;i<n-beg;i++)
					p[unlimit[i]]=unlimit[i+1];
				p[unlimit[n-beg]]=unlimit[1];
			}//多余的无限制的点也要连成环(不过环的大小没限制啦是真的)
			
			int l=0,r=0,cnt=0,tmp=beg;
			for(int i=1;i<=n;i++)
				if (!p[i]){
					if ((++cnt)==lst[tmp]){
						p[r]=i;
						tmp-=lst[tmp];
						cnt=0;
					}
					
					p[i]=l;l=i;
					if (cnt==1) r=i;
				}//构造解
		}
		
		if (k==0){
			for(int i=1;i<n;i++)
				printf("%d ",i+1);
			printf("1\n");
		}
		else if (!beg) printf("-1\n");
		else{
			for(int i=1;i<=n;i++)
				printf("%d%c",p[i],(i==n?'\n':' '));
		}
	}
	
	return 0;
}

Wish You Good Luck!

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

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

相关文章

记一次学习--[网鼎杯 2018]Comment二次注入

目录 本文章只展示二次注入过程&#xff0c;后续获取flag并不展示 靶场 网站流程、密码的破解和目录的查询以及对于源代码获取 密码暴力破解 网站目录扫描 网站源代码获取 网站流程 尝试注入 注入代码 本文章只展示二次注入过程&#xff0c;后续获取flag并不展示 靶场…

IntelliJ IDEA 2024.2 夏季大版本发布,不得不说,更强了!

因 CSDN 上传大小限制&#xff0c;本文推荐微信中阅读&#xff0c;动图更完整&#xff0c;微信中阅读&#xff0c;请欢迎关注公众号&#xff1a;CodeFit 创作不易&#xff0c;如果你觉得这篇文章对您有帮助&#xff0c;请不要忘了 点赞、分享 和 关注&#xff0c;为我的 持续创…

Katalon Studio 使用教程——自动获取元素定位功能

这个功能很实用&#xff0c;简单来讲可以形容为&#xff0c;想要哪里点哪里&#xff0c;so easy。 比如你想定位某个输入框&#xff0c;只需要按住【Alt】&#xff0c;点一下输入框&#xff0c;系统就自动记录下来这个输入框叫什么&#xff0c;它的xpath是什么。你想要按钮就点…

arXiv2024.8.6 | LLaVA-OneVision:Easy Visual Task Transfer

Comment: Project Homepage: https://llava-vl.github.io/blog/2024-08-05-llava-onevision/ 论文标题&#xff1a;LLaVA-OneVision&#xff1a;Easy Visual Task Transfer 论文地址&#xff1a;https://arxiv.org/abs/2408.03326 GitHub&#xff1a;https://llava-vl.githu…

4岁小孩孤独症的表现

在儿童的成长过程中&#xff0c;孤独症&#xff08;也称自闭症&#xff09;的早期识别与干预至关重要。对于4岁的孩子而言&#xff0c;孤独症的表现可能已经开始显现&#xff0c;家长和教育者需保持高度敏感&#xff0c;以便及时采取措施。 社交互动障碍&#xff1a;4岁孤独症儿…

Stable Diffusion绘画 | 图生图-上传重绘蒙版

上传重绘蒙版&#xff0c;可以弥补局部重绘的缺点&#xff0c;能够更精细的修改画面中的指定区域 使用PS制作的蒙版图片为耳朵下方区域&#xff0c;可以为图片中的女生带上不同款式的耳环。 参数配置&#xff1a; 调整提示词&#xff1a; 生成图片如下所示&#xff1a; 调整提…

龙腾CMS downloadFile接口任意文件读取漏洞复现 [附POC]

文章目录 龙腾CMS downloadFile接口任意文件读取漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现龙腾CMS downloadFile接口任意文件读取漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技术从事非…

分享一个基于数据可视化的交通感知与车辆检测协同系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

【SQL】产品销售分析 I

目录 题目 分析 代码 题目 销售表 Sales&#xff1a; -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | ---------------…

【省流】入网,继续更!

大家好&#xff0c;我是一名默默学习的计算机小菜菜 在几分钟前我决定继续学习计算机知识和写博客 在这之前我已经停写了很久了&#xff0c;因为我真的找不到相关工作啊啊啊&#xff0c;有点萎靡&#xff0c;经常性精神内耗&#xff0c; 而之所以我死灰复燃&#xff08;可能不…

NeRF的代码复现以及人工智能入门

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

Effective-Java-Chapter4

https://github.com/clxering/Effective-Java-3rd-edition-Chinese-English-bilingual/tree/dev/Chapter-4 准则一 减少类和成员的可访问性 如果一个方法覆盖了超类方法&#xff0c;那么它在子类中的访问级别就不能比超类 [JLS, 8.4.8.3] 更严格非零长度的数组总是可变的&am…

3、pnpm yarn npm

项目里实际上就只有这些依赖 node module 里却有很多的包 原因&#xff1a; 比如说vue&#xff0c;vue内部有依赖了其余的包。工具又依赖了别的依赖 造成的问题&#xff1a;我可以直接去用这个包&#xff0c;但是这个包在package.json中却没有看到-----幽灵依赖 那如果说别…

Python 绘图入门

数据可视化的概念及意义 数据可视化有着久远的历史&#xff0c;最早可以追溯至10世纪&#xff0c;至今已经应用和发展了数百年。不知名的天文学家是已知的最早尝试以图形方式显示全年当中太阳&#xff0c;月亮和行星的位置变化的图。 图1 数据可视化的发展历程 什么是数据可视…

就医陪诊小程序项目开发功能介绍

陪诊小程序通常是指一种通过智能手机应用程序提供陪同就医服务的平台。其主要功能可以包括 预约挂号服务&#xff1a; 用户可以通过小程序预约医院或特定科室的就诊时间&#xff0c;避免排队等待。 陪同就医&#xff1a; 提供专业的陪诊员工作&#xff0c;陪同用户到医院就诊&…

如何理解 Java 中的阻塞队列:从基础到高级的深度解析

提到阻塞队列&#xff0c;许多人脑海中会浮现出 BlockingQueue、ArrayBlockingQueue、LinkedBlockingQueue 和 SynchronousQueue。尽管这些实现看起来复杂&#xff0c;实际上阻塞队列本身的概念相对简单&#xff0c;真正挑战在于内部的 AQS&#xff08;Abstract Queuing Synchr…

javaweb_04:SpringBoot

一、SpringBoot快速入门 官网&#xff1a;https://spring.io/ spring提供了若干个子项目&#xff0c;每个项目用于完成特定的任务。 1、创建springboot工程&#xff0c;并勾选web开发相关依赖。 注意这里type要选成maven: 2、定义helloController类&#xff0c;添加方法h…

QT多语言工具实现支持生成ts文件,ts文件和xlsx文件互转

一. 工具介绍 1.如果你是Qt项目,为多语言发愁的话,看到这篇文件,恭喜你有福啦!工具截图如下:​ 2.在项目开发的过程中,尽量将所有需要翻译的文本放在一个文件中,qml翻译用一个文件,cpp用一个,如下: test.h #pragma once /******************************************…

Python:jupyter 模型可视化(VS)

step1:打开vs安装扩展 安装后重新启动vs 建立可视化模型 import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn import treemusic_data pd.read_csv(music.csv)Xmusic_data.drop(columns[genre]) Ymusic_data[genre]modelDecisionTreeClassifie…

吴恩达机器学习 笔记四十 寻找相关特征 协同过滤的限制

寻找相关特征&#xff1a; 要找到其他和 x(i) 相关的项&#xff0c;即找到一个 item k&#xff0c; x(k) 与 x(i) 相似。x 是一个向量&#xff0c;判断相似用的是下图中的式子 &#xff0c;即 x(k) 和 x(i) 之间的平方距离&#xff0c;有时也写成下面那种形式。 协同过滤的缺点…