Codeforces Round #843 (Div. 2) A ~ C 题解

news/2024/11/24 1:54:52/

A1&A2 Gardener and the Capybaras

题意

简单版本: A1
困难版本: A2
一个字符串,只包含a和b两种字母,请将这个字符串划分为三个非空字符串,使得第二个字符串的字典序最大或最小。困难版本的数据范围要求此题在线性时间复杂度下解决。

思路

就是用分类讨论的思想去构造,具体的构造方法见代码。这种构造题的构造方法很多,顺水推舟就能做出来。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 5e5 + 5;
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);ll t;cin>>t;while(t--){string s;cin>>s;ll n=s.length()-1;if(s[0]=='a'&&s[n]=='a'){cout<<"a"<<" ";for(ll i=1;i<n;i++)cout<<s[i];cout<<" ";cout<<"a"<<endl;}else if(s[0]=='b'&&s[n]=='b'){cout<<"b"<<" ";for(ll i=1;i<n;i++)cout<<s[i];cout<<" ";cout<<"b"<<endl;}else if(s[0]=='a'&&s[n]=='b'){cout<<"a"<<" ";if(s[1]=='a'){cout<<"a"<<" ";for(ll i=2;i<=n;i++)cout<<s[i];cout<<endl;}else{for(ll i=1;i<n;i++)cout<<s[i];cout<<" ";cout<<"b"<<endl;}}else{cout<<"b"<<" ";if(s[1]=='a'){cout<<"a"<<" ";for(ll i=2;i<=n;i++)cout<<s[i];cout<<endl;}else{for(ll i=1;i<n;i++)cout<<s[i];cout<<" ";cout<<"a"<<endl;}}}return 0;
}

B. Gardener and the Array

题意

题目链接
就是给你一个数组,这个数组中的数都是大数,用二进制位表示。问能不能选出两个不同的子数组,使得这两个子数组各自所有的数按位或的值相同。

思路

由于是大数,而且数据范围不够明确,这个题需要开动态数组和键值对存储。说白了,对于某一个大数的每一位,都满足:如果这一位是1,而且其他大数中至少有一个在这一位上也是1,那就符合题意。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 1e5 + 5;
vector<ll> v[maxn];
map<ll,ll> cnt;
int main(){//ios::sync_with_stdio(0);//cin.tie(0),cout.tie(0);ll t;scanf("%lld",&t);while(t--){ll n;scanf("%lld",&n);for(ll i=1;i<=n;i++)v[i].clear();cnt.clear();ll bit = -1e9;for(ll i=1;i<=n;i++){ll k;scanf("%lld",&k);for(ll j=0;j<k;j++){ll x;scanf("%lld",&x);bit=max(bit,x);v[i].push_back(x);}}for(ll i=1;i<=n;i++){for(auto j: v[i]){cnt[j]++;}}bool flag=false;for(ll i=1;i<=n;i++){bool f=true;for(auto j: v[i]){if(cnt[j]==1){f=false;break;}}if(f==true){flag=true;break;}}if(flag==true)printf("Yes\n");else printf("No\n");}return 0;
}

C. Interesting Sequence

题意

题目链接
求出最小的 m ≥ n m≥n mn,使得 n & ( n + 1 ) & … … & m = x n\&(n+1)\&……\&m=x n&(n+1)&……&m=x

思路

分四种情况讨论,分别看对于某一位 i i i的具体情况:
n i = 0 , x i = 0 n_{i}=0,x_{i}=0 ni=0,xi=0,对答案不构成影响。
n i = 1 , x i = 0 n_{i}=1,x_{i}=0 ni=1,xi=0,说明在 [ n , m ] [n,m] [n,m]范围内,至少存在一个数的第 i i i位是 0 0 0
n i = 0 , x i = 1 n_{i}=0,x_{i}=1 ni=0,xi=1,无解,输出 − 1 -1 1
n i = 1 , x i = 1 n_{i}=1,x_{i}=1 ni=1,xi=1,说明在 [ n , m ] [n,m] [n,m]范围内,所有数的第 i i i位都是 1 1 1

对于④,一旦存在有更高位的②,那么就不合法。因为在逐个 & \& &的过程中必然会遇上 0 0 0的情况。即高位有进位,那么低位也必然都变成 0 0 0

所有②的最高位是影响最大的,我们需要找到这个位。然后判断是否在比这个位小的位上存在④。如果存在,输出 − 1 -1 1

假设最高位的②是 p o s pos pos,那么最终答案就是:
原来 n n n上位置比 p o s pos pos大的 p o s + 1 pos+1 pos+1这一位置 1 1 1,这一位前面都是 0 0 0,后面就是原来 n n n的二进制位数值。如果原来 n n n上的 p o s + 1 pos+1 pos+1这一位就是 1 1 1,那么 p o s pos pos位是 0 0 0 p o s + 1 pos+1 pos+1位必然产生进位,那么这一位原来的 1 1 1必然成为 0 0 0,就不满足④,因此输出 − 1 -1 1

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 64 + 5;
ll bitn[maxn],bitx[maxn],m[maxn];
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);ll t;cin>>t;while(t--){ll n,x;cin>>n>>x;memset(bitn,0,sizeof(bitn));memset(bitx,0,sizeof(bitx));ll cntn=0,cntx=0;ll nn=n,xx=x;while(nn){bitn[cntn++]=(nn&1);nn=nn>>1;}while(xx){bitx[cntx++]=(xx&1);xx=xx>>1;}bool flag=true;for(ll i=0;i<max(cntn,cntx);i++){if(bitn[i]==0&&bitx[i]==1){flag=false;break;}}ll pos=-1;for(ll i=0;i<max(cntn,cntx);i++){if(bitn[i]==1&&bitx[i]==0)pos=i;}for(ll i=0;i<max(cntn,cntx);i++){if(bitn[i]==1&&bitx[i]==1){if(pos>i){flag=false;break;}}}if(flag==false)cout<<-1<<endl;else{if(pos==-1)cout<<n<<endl;else if(bitn[pos+1]==1&&bitx[pos+1]==1)cout<<-1<<endl;else{for(ll i=0;i<=pos;i++)m[i]=0;m[pos+1]=1;if(pos+1==cntn)cntn++;for(ll i=pos+2;i<cntn;i++)m[i]=bitn[i];ll ans = 0;for(ll i=0;i<cntn;i++)ans+=(1LL<<i)*m[i];cout<<ans<<endl;}}}return 0;
}

心得

这场比赛的题风格很相似,基本就是二进制位或者两个字符的操作,非常考验分类讨论和梳理脉络的思想。每个题细节都很多,比赛时需要在草稿纸上对每种情况逐个理清,多分析几个样例。


http://www.ppmy.cn/news/685586.html

相关文章

834

每天时间过的很快&#xff0c;许多点点滴滴如同昨天发生过一样。忙忙碌碌也不知道自己怎么一步步走到今天。但是每天结束的时候&#xff0c;回想一下发生的事情&#xff0c;收获一天的收获&#xff0c;也会体会到幸福。

Codeforces Round #843 (Div. 2)

Gardener and the Capybaras (easy version) 题目集链接 简单版本就是字符串的长度很小&#xff0c;可以用n2的时间复杂度来算&#xff0c;因为n<100 所以我们可以先枚举a的终点&#xff0c;这时候b的起点就有了&#xff0c;然后我们再枚举b的终点&#xff0c;这时候c的起点…

总结843

学习目标&#xff1a; 5月&#xff08;张宇强化18讲&#xff0c;背诵25篇短文&#xff0c;熟词僻义300词基础词&#xff09; 每日必复习&#xff08;5分钟&#xff09; 做记录本上3道题 学习内容&#xff1a; 暴力英语&#xff1a;回环诵读&#xff0c;继续背一篇阅读理解&…

22中科大843考研经验

22考研&#xff0c;初试总分390&#xff0c;其中信号135。我本科在一所末流211&#xff0c;排名保研边缘&#xff0c;无竞赛无项目&#xff0c;本科期间能水的课全水过去了&#xff0c;纯纯躺了三年。下面我给大家分享一下我个人的一些经验&#xff0c;本经验帖仅供各位参考&am…

中科大843信号与系统中国科学技术大学843信号与系统138,总分420+上岸经验帖

中科大843信号与系统中国科学技术大学上岸经验帖 ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; ​ 数学&#xff1a;&#xff08;多动手&#xff0c;多计算&#xff0c;多总结&#xff0c;打好基础&#xff09; &#xff08;1&…

实现解决843端口安全策略问题心得

首先我这遇到一个问题&#xff0c;就是解决&#xff18;&#xff14;&#xff13;端口安全策略文件的问题。 因为不了解&#xff18;&#xff14;&#xff13;端口安全策略文件的&#xff0c;百度查找资料 搜索关键字 “&#xff18;&#xff14;&#xff13;端口” 有一个貌…

【sentinel】Sentinel与其他框架的适配

HTTP Client适配 Sentinel提供Apache HttpClient的适配模块sentinel-apache-httpclient-adapter&#xff0c;可以针对HTTP client请求进行流控和熔断。使用时需引入以下模块&#xff08;以Maven为例&#xff09;&#xff1a; <dependency><groupId>com.alibaba.c…

ModaHub魔搭社区:向量数据库Milvus产品问题(二)

目录 为什么向量距离计算方式是内积时&#xff0c;搜索出来的 top1 不是目标向量本身&#xff1f; 对集合分区的查询是否会受到集合大小的影响&#xff0c;尤其在集合数据量高达一亿数据量时&#xff1f; 如果只是搜索集合中的部分分区&#xff0c;整个集合的数据会全部加载…