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

目录

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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

商品推荐系统浅析 | 京东云技术团队

一、综述 本文主要做推荐系统浅析&#xff0c;主要介绍推荐系统的定义&#xff0c;推荐系统的基础框架&#xff0c;简单介绍设计推荐的相关方法以及架构。适用于部分对推荐系统感兴趣的同学以及有相关基础的同学&#xff0c;本人水平有限&#xff0c;欢迎大家指正。 二、商品…

独立站如何进行Facebook广告投放?关于广告投放策略的真相

谷歌广告是独立站卖家推广引流的首选渠道&#xff0c;那么谷歌广告该如何投放&#xff1f;在这个过程中有哪些需要特别注意的吗&#xff1f; 创建Facebook广告账户&#xff1a; 访问Facebook广告管理平台&#xff08;Ads Manager&#xff09;并创建一个广告账户。您需要提供一…

Towards Open World Object Detection【论文解析】

Towards Open World Object Detection 摘要1 介绍2 相关研究3 开放世界目标检测4 ORE:开放世界目标检测器4.1 对比聚类4.2 RPN自动标注未知类别4.3 基于能量的未知标识4.4 减少遗忘 5 实验5.1开放世界评估协议5.2 实现细节5.3 开放世界目标检测结果5.4 增量目标检测结果 6 讨论…

【ArcGIS Pro二次开发】(56):界址点导出Excel

界址点成果表是地籍测绘中的一种表格&#xff0c;用于记录地块的界址点坐标和相关属性信息。 这个工具的目的就是为了将地块要素导出为界址点成果表。 一、要实现的功能 如上图所示&#xff0c;在【数据处理】组—【Excel相关】面板下&#xff0c;点击【界址点导出Excel】工具。…

linux文件I/O之 open() 函数用法

#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> typedef unsigned int mode_t ; int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 函数功能 打开或创建一个文件 返回值 成功…

21、springboot的宽松绑定及属性处理类的构造注入

springboot的宽松绑定及属性处理类的构造注入 ★ 如何使用属性处理类所读取的属性 属性处理类最终变成了Spring容器中的一个Bean组件&#xff0c;因此接下来Spring即可将该Bean组件注入任意其他组件。 这种做法的好处是&#xff1a;可以将大量的配置信息封装一个对象——所以…

JavaScript的三大组成部分是什么?JavaScript的核心组成部分解析:语法、BOM和DOM

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【uniapp】封装一个全局自定义的模态框

【需求描述】 在接口401处&#xff0c;需要实现全局提示并弹出自定义模态框的功能。考虑到uni-app内置的模态框和app原生提示框的自定义能力有限&#xff0c;我决定自行封装全局自定义的模态框&#xff0c;以此为应用程序提供更加统一且个性化的界面。 【效果图】 【封装】 主…

Python-OpenCV中的图像处理-几何变换

Python-OpenCV中的图像处理-几何变换 几何变换图像缩放图像平移图像旋转仿射变换透视变换 几何变换 对图像进行各种几个变换&#xff0c;例如移动&#xff0c;旋转&#xff0c;仿射变换等。 图像缩放 cv2.resize() cv2.INTER_AREAv2.INTER_CUBICv2.INTER_LINEAR res cv2.r…

MySQL面试1

Mysql的面试突击1 Mysql的体系结构是什么样子的&#xff08;查询语句怎么进行执行的&#xff09; mysql的架构&#xff1a;单进程多线程的架构模式 CLient -----> Server架构 Mysql的链接方式有没有性能优化的点 2个点 查询缓存(Query Cache) MySQL 内部自带了一个缓存模…

Direct path read LOB

Table full scan &#xff1a; wait event Direct path read because of LOB "Direct path read" Wait Event During LOB Access (Doc ID 2287482.1)​编辑To Bottom In this Document Symptoms Changes Cause Solution References APPLIES TO: Oracle Database …

数据结构--栈和队列

文章目录 栈的概念和结构栈的实现栈的数据结构栈的初始化和销毁出栈和入栈获取栈顶、大小&#xff0c;判空 队列的概念和结构队列的实现队列的数据结构队列的初始化和销毁队列的插入 队列的删除获取队头和队尾的数据获取队列长度和判空 栈和队列的一些题目1.有效的括号2.用队列…

教你连接本地树莓派

如何连接本地树莓派 文章目录 如何连接本地树莓派前言1. 操作流程2. 打开树莓派SSH功能3. 确认树莓派信息后 安装相应SSH客户端 前言 树莓派作为一款以教育为目的推出的硬件系统&#xff0c;也是超低功耗的微型“准系统”&#xff0c;能够提供基础的电脑应用体验。而得益于其极…

微信开发之获取标签详情的技术实现

简要描述&#xff1a; 获取标签列表 请求URL&#xff1a; http://域名地址/getContactLabelList 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选…

服务限流治理

一、基础概念 1.什么是服务限流&#xff1f; 限流在日常生活中也很常见&#xff0c;比如节假日你去一个旅游景点&#xff0c;为了不把景点撑爆&#xff0c;管理部门通常会在外面设置拦截&#xff0c;限制景点的进入人数&#xff08;等有人出来之后&#xff0c;再放新的人进去…

为什么还有很多人不喜欢使用微信电话?让人感到困扰

尽管微信电话在技术上非常便利和实用&#xff0c;但仍然有很多人不太喜欢使用它。这引发了一个问题&#xff1a;为什么还有这么多人对微信电话感到困扰呢&#xff1f; 一、容易造成隐私泄露 在很多情况下&#xff0c;我们经常会收到好友的微信电话。然而&#xff0c;如果在这个…

(Python)Requests+Pytest+Allure接口自动化测试框架从0到1搭建

前言&#xff1a;本文主要介绍在企业使用Python搭建接口自动化测试框架&#xff0c;数据驱动读取excel表里的数据&#xff0c;和数据库方面的交互&#xff0c;包括关系型数据库Mysql和非关系型数据库MongDB&#xff0c;连接数据库&#xff0c;读取数据库中数据&#xff0c;最后…

MySQL事务:ACID特性实现原理

事务是MySQL等关系型数据库区别于NoSQL的重要方面&#xff0c;是保证数据一致性的重要手段。本文将首先介绍MySQL事务相关的基础概念&#xff0c;然后介绍事务的ACID特性&#xff0c;并分析其实现原理。 MySQL博大精深&#xff0c;文章疏漏之处在所难免&#xff0c;欢迎批评指…

Eudic欧路词典 for Mac v4.4.5增强版

欧路词典 (Eudic)是一个功能强大的英语学习工具&#xff0c;它包含了丰富的英语词汇、短语和例句&#xff0c;并提供了发音、例句朗读、单词笔记等功能。 多语种支持&#xff1a;欧路词典支持多种语言&#xff0c;包括英语、中文、日语、法语等等&#xff0c;用户可以方便地进…

【计算机网络】概述及数据链路层

每一层只依赖于下一层所提供的服务&#xff0c;使得各层之间相互独立、灵活性好&#xff0c;已于实现和维护&#xff0c;并能促进标准化工作。 应用层&#xff1a;通过应用进程间的交互完成特定的网络应用&#xff0c;HTTP、FTP、DNS&#xff0c;应用层交互的数据单元被称为报…