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)

Codeforces Round #784 (Div. 4)

Codeforces Round #340 (Div. 2) B