Codeforces Round 866 (Div. 2) ABC
Posted Vivian-0918
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round 866 (Div. 2) ABC相关的知识,希望对你有一定的参考价值。
https://codeforces.com/contest/1820
A. Yura\'s New Name
题目大意:
给定一个字符串,每次这个表情^^或者这个表情^_^就是合法的
问我们这个字符串至少要添加多少东西使得怎么看都是合法的?
input
7
^______^
___^_^^^_^___^
^_
^
^_^^^^^_^_^^
___^^
_
output
5
5
1
1
0
3
2
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18,MINN=-MAXN,INF=0x3f3f3f3f;
const LL N=1e7+10,M=4023;
const LL mod=998244353;
const double PI=3.1415926535;
#define endl \'\\n\'
LL a[N];
int main()
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
cin>>T;
while(T--)
LL sum=0;
string s;
cin>>s;
if(s=="^") cout<<"1"<<endl;
else
for(int i=0;i<s.size();i++)
if(s[i]==\'^\') ;
else if(s[i]==\'_\')
if(i==0||s[i-1]==\'_\') sum++;
if(i==s.size()-1||s[i+1]==\'_\') sum++;
s[i]=\'^\';
//cout<<sum<<endl;
cout<<sum<<endl;
return 0;
B. JoJo\'s Incredible Adventures
题目大意:
给定一个字符串,这个字符串每次可以从后面拉一个字符到前面形成一个新的字符串
这样每次组成的字符串就成了一个矩阵
问这个矩阵里面可以组成的最矩形面积是多少?
input
5
0
1
101
011110
101010
output
0
1
2
6
1
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18,MINN=-MAXN,INF=0x3f3f3f3f;
const LL N=1e7+10,M=4023;
const LL mod=998244353;
const double PI=3.1415926535;
#define endl \'\\n\'
LL a[N];
int main()
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
cin>>T;
while(T--)
string s;
cin>>s;
LL one=0;
for(int i=0;i<s.size();i++)
if(s[i]==\'1\') one++;
if(one==s.size()) cout<<s.size()*s.size()<<endl;
else
LL maxn=0,sum=0;
for(int i=0;i<s.size();i++)
if(s[i]==\'0\') sum=0;
else sum++;
maxn=max(maxn,sum);
sum=0;
for(int i=0;i<s.size();i++)
if(s[i]==\'0\') break;
else sum++;
for(int i=s.size()-1;i>=0;i--)
if(s[i]==\'0\') break;
else sum++;
maxn=max(maxn,sum);
if(maxn%2==1) cout<<(maxn/2+1)*(maxn/2+1)<<endl;
else cout<<(maxn/2)*(maxn/2+1)<<endl;
return 0;
C. Constructive Problem
题目大意:
给定一组数据,问我们能不能改一排数据,使得刚好mex+1。
input
4
3
1 2 1
4
0 2 2 0
4
3 2 0 2
1
0
output
Yes
Yes
No
No
思路:如果每个数都连续且只有一个,那么必定不可能;
如果每个数连续且任意一个不只一个,就可以把这个数字改成更大的数,从而把mex变大一个;
如果当前数组中的mex+1存在,那么必须把这一排都改了,不然要么出现越来越大的mex,要么出现不变的mex,从而判断一下,满足条件(这一排之间不能出现小数被删没了的情况)即可;
如果mex+1不存在,但是比mex+1还大的数字存在,直接随便改,一个也行,几个都行。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18,MINN=-MAXN,INF=0x3f3f3f3f;
const LL N=1e7+10,M=4023;
const LL mod=998244353;
const double PI=3.1415926535;
#define endl \'\\n\'
LL a[200010];
int main()
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
cin>>T;
while(T--)
LL n;
cin>>n;
map<LL,LL> num;
map<LL,PII> mp;
LL b[200010],cnt=0;
for(int i=1;i<=n;i++)
cin>>a[i];
num[a[i]]++;
if(num[a[i]]==1)
b[++cnt]=a[i];
mp[a[i]].first=i;
mp[a[i]].second=i;
LL mex=0;
sort(b+1,b+1+cnt);
//for(int i=1;i<=cnt;i++) cout<<b[i]<<" "; cout<<endl;
LL idx=-1;
for(int i=1;i<=cnt;i++)
if(b[i]==mex) mex++;
else
idx=i;
break;
LL ans=0;
if(idx==-1)//说明已经是顺序排列的情况
bool flag2=false;
for(int i=1;i<=cnt;i++)
if(num[b[i]]>1)
flag2=true;
break;
if(flag2==false) cout<<"No"<<endl;//直接瞄准有无多余数字可供修改
else cout<<"Yes"<<endl;
else if(idx!=-1)
ans=b[idx];
//cout<<mex<<" "<<idx<<" "<<ans<<endl;
if(ans-mex>=2) cout<<"Yes"<<endl;
else
bool flag=true;
for(int i=mp[ans].first;i<=mp[ans].second;i++)
if(a[i]<ans)
num[a[i]]--;
if(num[a[i]]<=0)
flag=false;
break;
if(flag==true) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
Codeforces Round #705 (Div. 2)
Codeforces Round #705 (Div. 2) 链接:https://codeforces.com/contest/1493 D :GCD of an Array 题意: 给定一个长度为 \\(n\\) 的序列,\\(q\\) 次操作: 每次操作将 \\(a_x\\) 乘上 \\(d\\) 。每次操作
以上是关于Codeforces Round 866 (Div. 2) ABC的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #705 (Div. 2)
Codeforces Round #774 (Div. 2)
Codeforces Round #808 (Div. 1)(A~C)
Codeforces Round #717 (Div. 2)