2023牛客暑期多校训练营7(C/I/M)

news2024/11/26 0:29:54

目录

C.Beautiful Sequence

I.We Love Strings 

M.Writing Books


C.Beautiful Sequence

思路:显然若得到了a[1],则整个序列a我们都知道了。所以我们要求出第k大的a[1],这个可以利用序列a为不递减序列的性质来得出。

首先,由题意可得:

a[2]=a[1]^b[1]

a[3]=a[2]^b[2]=(a[1]^b[1])^b[2]

a[4]=a[3]^b[3]=((a[1]^b[1])^b[2])^b[3]

......

得出a[i]=a[1]^(序列b的前缀i异或和)

我们把序列b的前缀i异或和定义为f[i],因为序列a不递减,所以:

a[i]<=a[i+1]

=>   a[1]^f[i-1] <= a[1]^f[i]

首先我们先初始化a[1]二进制位为-1,这代表a[1]的这个位可以是0,也可以是1。然后我们再根据a[1]^f[i-1] <= a[1]^f[i] 这个公式来得出a[1]的哪些位它是确定的,不能是-1。

我们需要从高位往低位贪心,因为如果a[1]^f[i-1]的一个高位如果是1,而a[1]^f[i]的这个位是0,那么低位再怎么变,a[1]^f[i-1]也必然小于a[1]^f[i]。比如两个二进制数1????和0????,就算左边的低位全是1,右边的高位全是0,也就是变成10000和01111,左边依然大于右边。

然后我们从高位到低位怎么贪心呢?找f[i]的f[i-1]的从高位到低位,第一个不同的位即可,我们设这个是第k位。此时a[1]的第k位必须和f[i]第k位的值相同,这样子就能让f[i]^a[1]的第k位是0,f[i+1]^a[1]第k位是1,保证了前者小于后者。在此之前a[i]的第k位必须等于-1或者等于f[i]的第k位,否则输出-1。

此时我们得到了n个-1的值,我们我们最多能表示第2的n次方大的值,此时我们只需将(k-1)拆分成二进制依次填入-1的位置即可。具体实现见代码。

代码:

void solve() {
	a[1]=0;
	mem(now,-1);
	int n,k;
	cin>>n>>k;
	for(int i=1; i<n; i++) {
		cin>>b[i];
		f[i]=(f[i-1]^b[i]);
	}
	for(int i=0; i<n-1; i++) {
		for(int j=29; j>=0; j--) {
			if((f[i]>>j&1ll)!=(f[i+1]>>j&1ll)) {//找到高位第一个不相等的二进制位
				if(now[j]==-1)now[j]=(f[i]>>j&1ll);
				else if(now[j]==(f[i+1]>>j&1ll)) {//如果该位已经确定,并且与想要填的数相反,则输出-1
					cout<<-1<<endl;
					return;
				}
				break;//高位比上一个大了之后,就不用再管低位了
			}
		}
	}
	k--;//去掉初始不变的情况,方便替换-1
	int maxx=0;
	for(int i=0; i<30; i++) {
		if(now[i]==-1)maxx=maxx*2+1;
	}
	if(maxx<k) {
		cout<<-1<<endl;
		return;
	}
	vector<int>v;
	while(k) {//将k转换为二进制填入
		v.push_back({k%2});
		k/=2;
	}
	reverse(v.begin(),v.end());
	for(int i=0; i<30; i++) {
		if(!v.size())break;//填完了就退出
		if(now[i]==-1) {//依次填入
			now[i]=v.back(),v.pop_back();
		}
	}
	for(int i=0; i<30; i++)now[i]=max(now[i],0ll);//把没填的-1变成0
	for(int i=29; i>=0; i--) a[1]=a[1]*2+now[i];;//得出a[1]的值
	cout<<a[1]<<" ";
	for(int i=2; i<=n; i++)cout<<(b[i-1]^a[i-1])<<" ",a[i]=(b[i-1]^a[i-1]);//根据a[1]得出整个序列a
	cout<<endl;
}

I.We Love Strings 

思路:因为字符串长度不相同的字符串,两两之间肯定不能匹配,所以我们根据字符串长度大小来求解。在lenth<=20时我们暴力枚举字符串所有情况进行求解,而在lenth>20的时候我们暴力容斥来求解。

那么为什么这个临界值为20呢?

我们设临界值为N,暴力枚举所有情况的复杂度主要由字符串长度决定,复杂度为:

而容斥的复杂度主要由容斥的集合大小决定,而这个集合的最大大小又由n的最大值和N共同决定,它的复杂度为:

总的复杂度为他们两个相加。

此时N取太大或者取太小,都会使得一方的复杂度过大,此时取400的根号,也就是N=20,是最好的。

具体实现见代码。

代码:

int pp(vector<int>v,string s,int n) {
	for(int i=0; i<n; i++) {
		if(s[i]!='?'&&v[i]!=s[i]-'0')return 0;//如果两个串确定有位置不同了,则匹配失败 
	}
	return 1;//匹配成功 
}
int f1(int n) {
	int sum=0;
	for(int i=0; i<(1<<n); i++) {//枚举这个长度01串的所有可能。 
		vector<int>s;
		for(int j=0; j<n; j++) {
			s.push_back((i>>j&1ll));
		} //将枚举的串存入vector 
		for(int i=0; i<v[n].size(); i++) {
			if(pp(s,v[n][i],n)) {//如果有一个串能和这个枚举的串匹配,答案+1 
				sum++;
				break;
			}
		}
	}
	return sum;
}
int f2(int n) {
	int m=v[n].size(),ans=0;
	//注意i要从1开始,若从0开始则会使答案增加 
	for(int i=1; i<(1ll<<m); i++) {//枚举集合内的串
		int sum=1;
		for(int j=0; j<n; j++) {//枚举串的每个位 
			int cnt0=0,cnt1=0;
			for(int k=0; k<m; k++) {//表示这是集合内第几个串 
				if((i>>k&1ll)) {
					if(v[n][k][j]=='0')cnt0++;
					if(v[n][k][j]=='1')cnt1++;
				}
			}
			if(cnt0&&cnt1) {//若该位上确定的数不一致,则不能进行容斥 
				sum=0;
				break;
			}
			if(!cnt0&&!cnt1)sum=sum*2%mod;//该位上全是?,贡献*2 
		}
		int now=__builtin_popcount(i); 
		if(now%2)ans=(ans+sum)%mod; //进行容斥 
		else ans=(ans-sum+mod)%mod;
	}
	return ans;
}
void solve() {
	int n,ans=0;
	cin>>n;
	for(int i=1; i<=n; i++) {
		string s;
		cin>>s;
		v[(int)s.size()].push_back(s);//将字符串根据长度分类 
	}
	for(int i=1; i<=400; i++) {
		if(!v[i].size())continue;
		if(i<=20)ans=(ans+f1(i))%mod;//若长度<=20则暴力求解 
		else ans=(ans+f2(i))%mod;//否则暴力容斥 
	}
	cout<<ans<<endl;
}

M.Writing Books

思路:显然1~9对于答案的贡献为1*9,10~99对于答案的贡献为2*90,100~999对于答案的贡献为3*900......。分块求出贡献即可。

代码:

void solve() {
	int n,l=1,r=10,now=1,ans=0;
	cin>>n;
	while(l<=n){
		if(n>=r-1)ans+=(r-l)*now;
		else ans+=(n-l+1)*now;
		now++,l=r,r*=10;
	}
	cout<<ans<<endl;
}

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

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

相关文章

Unity开发笔记:将Texture2D裁剪出指定圆角用来输出png等图片

学习记录整理&#xff0c;自用&#xff0c;也希望能帮助到有相同需求的人。 圆角原理见大佬的博客&#xff1a; 圆角原理 简单来说就是将图片分成四个区域&#xff0c;找出拐角处的拐子的设置为透明 ![](https://img-blog.csdnimg.cn/a788825545614816895a9cca42ddc4a9.png 如…

Feign实现远程调用

文章目录 Feign引入依赖添加注解编写Feign的客户端测试自定义配置配置文件方式Java代码方式 Feign使用优化引入依赖配置连接池 总结 Feign Feign是一个基于Java的声明式Web服务客户端&#xff0c;由Netflix开发。它简化了使用RESTful API进行远程服务调用的过程&#xff0c;并…

SketchUp Pro 2023 for Mac(草图大师)

SketchUp Pro 2023 for Mac提供了简单易学的用户界面和强大的工具集&#xff0c;使用户可以快速创建复杂的3D模型。其中包括智能绘图工具、自动生成几何体、高级纹理编辑器、实时阴影、交互式地形建模工具等功能。 一、创建形象化您的想法 手工绘制的乐趣。超级智能的3D建模软…

IDEA搭建Springboot项目

一、配置Maven&#xff08;参考Maven配置教程&#xff09; 注意&#xff1a; 1.maven版本的选择&#xff0c;一般情况下&#xff0c;不建议下载最新版本&#xff0c;这种会遇见很多没有必要的麻烦&#xff01;如我在使用最新版本apache-maven-3.9.0的时候就遇见了不知名BUG。 …

【C++】开源:abseil-cpp基础组件库配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍abseil-cpp基础组件库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#…

亚马逊公告:订单存档政策调整,超过两年将于9月起存档

站斧浏览器获悉&#xff1a; 亚马逊新公告&#xff1a;2023年9月起&#xff0c;亚马逊美国站和欧洲站宣布将调整订单数据存档政策。这一政策的调整旨在保护客户的个人隐私和数据安全&#xff0c;从而提高客户的购物体验。据悉&#xff0c;所有历时超过两年以上的订单将按月进行…

【C++】AVL(平衡二叉搜索树)树的原理及实现

文章目录 一、引言 二、AVL树的概念 三、AVL树的插入 3、1 AVL树的简单插入 3、2 旋转分类 3、2、1 新节点插入较高右子树的右侧&#xff1a;左单旋 3、2、2 新节点插入较高左子树的左侧&#xff1a;右单旋 3、2、3 新节点插入较高左子树的右侧&#xff1a;左右双旋&#xff08…

【Eureka技术指南】「SpringCloud」从源码层面让你认识Eureka工作流程和运作机制(下)

原理回顾 Eureka Server 提供服务注册服务&#xff0c;各个节点启动后&#xff0c;会在Eureka Server中进行注册&#xff0c;这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息&#xff0c;服务节点的信息可以在界面中直观的看到。Eureka Client 是一个Java 客…

SAP Fiori 将GUI中的自开发报表添加到Fiori 工作台

1. 首先我们在workbench 中开发一个GUI report 这里我们开发的是一个简单的物料清单报表 2. 分配一个事务代码。 注意这里的SAP GUI for HTML 要打上勾 3. 创建语义对象&#xff08; Create Semantic Object&#xff09; 事物代码&#xff1a; path: SAP NetWeaver ->…

MyBatis学习——第六篇(mybatisPlus)

1&#xff1a;什么是mybatisPlus 1.1&#xff1a;mybatisPlus介绍 mybatisPlus官网&#xff1a;MyBatis-Plus mybatisPlus是一个mybatis的增强工具&#xff0c;只做增强&#xff0c;不做改变。目的是为了简化开发代码&#xff0c;提高效率而生的。 1.2&#xff1a;mybatisPl…

【Android】在Windows11系统上运行VisualStudioEmulator forAndroid

这是一个x86架构处理器的安卓模拟器&#xff0c; 在Visual Studio开发工具上用的&#xff0c;也是运行在Hyper-V虚拟机上的&#xff0c;相比其它的模拟器的性能好&#xff0c;占用磁盘空间小&#xff0c;操作简洁方便&#xff0c;非常适合开发人员调试安卓手机模拟。 安装 首…

网络:路由

1. 路由器 路由器工作在三层&#xff0c;每个接口都处于不用的网段中&#xff0c;即不同的广播域。但大多情况下&#xff0c;两台路由器直接相连的接口是同一个广播域&#xff0c;即一个网段。 2. 路由 通俗地说&#xff0c;去往目标的路径。网络中是指导IP报文转发的路径信息…

APP外包开发的iOS开发语言

学习iOS开发需要掌握Swift编程语言和相关的开发工具、框架和技术。而学习iOS开发需要时间和耐心&#xff0c;尤其是对于初学者。通过坚持不懈的努力&#xff0c;您可以逐步掌握iOS开发技能&#xff0c;构建出功能丰富、优质的移动应用。今天和大家分享学习iOS开发的一些建议方法…

k8s(七) 叩丁狼 service Ingress

负责东西流量&#xff08;同层级/内部服务网络通信&#xff09;的通信 service的定义 apiVersion: v1 kind: Service metadata:name: nginx-svclabels:app: nginx-svc spec:ports:- name: http # service 端口配置的名称protocol: TCP # 端口绑定的协议&#xff0c;支持 TCP、…

logstash 采集nginx 日志

简单安装nginx [rootelkstack03 ~]# yum install -y nginx ## 主配置文件 [rootelkstack03 ~]# cat /etc/nginx/nginx.conf user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; include /usr/share/nginx/modules/*.conf; event…

【MySQL】ER模型(十六)

&#x1f697;MySQL学习第十六站~ &#x1f6a9;本文已收录至专栏&#xff1a;MySQL通关路 ❤️文末附全文思维导图&#xff0c;感谢各位点赞收藏支持~ ⭐学习汇总贴&#xff0c;超详细思维导图&#xff1a;【MySQL】学习汇总(完整思维导图) 一.引入 数据库设计是牵一发而动全…

极智开发 | 龙芯3a4000机器安装银河麒麟系统

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文介绍一下 龙芯3a4000机器安装银河麒麟系统。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq 前几天淘了台龙芯3a4000 的…

机器学习、深度学习项目开发业务数据场景梳理汇总记录四

本文的主要作用是对历史项目开发过程中接触到的业务数据进行整体的汇总梳理&#xff0c;文章会随着项目的开发推进不断更新。 这里是续文&#xff0c;因为CSDN单篇文章内容太大的话就会崩溃的&#xff0c;别问我怎么知道的&#xff0c;问就是血泪教训&#xff0c;辛辛苦苦写了一…

【面试八股文】每日一题:谈谈你对异常的理解

每日一题-Java核心-谈谈你对异常的理解【面试八股文】 异常是程序在运行过程中出现的错误或不正常的情况。当程序执行过程中遇到无法处理的错误或者不符合预期的情况&#xff0c;就会抛出异常。异常可以分为两种类型&#xff1a;受检异常和非受检异常。 受检异常是指在程序编译…