Codeforces Round #731 (Div. 3)

Posted zjj0624

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #731 (Div. 3)相关的知识,希望对你有一定的参考价值。

A. Shortest Path with Obstacle
题意
给你三个点, a x , a y , b x , b y , f x , f y a_x,a_y,b_x,b_y,f_x,f_y ax,ay,bx,by,fx,fy从a点到b点,f点是障碍物,问最少需要多少步。
思路
直接模拟就可以了。
代码

#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
const int N = 1e6+10;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int xa,ya,xb,yb,xf,yf;
        cin>>xa>>ya>>xb>>yb>>xf>>yf;
        int ans=abs(xa-xb)+abs(ya-yb);
        //cout<<xa<<" "<<xb<<" "<<xf<<endl;
        if(xa==xb&&xb==xf)
        {
            int maxx=max(ya,yb);
            int minn=min(ya,yb);
            if(minn<=yf&&yf<=maxx) ans+=2;
        }
        if(ya==yb&&yb==yf)
        {
            int maxx=max(xa,xb);
            int minn=min(xa,xb);
            if(minn<=xf&&xf<=maxx) ans+=2;
        }
        cout<<ans<<endl;
    }
    return 0;
}

B - Alphabetical Strings
题意
给你一个字符串,让你判断是不是由题目中的条件拼接出来的。
条件:在这里插入图片描述
思路
找到字母a,然后从这个点用两个指针向两边看是否有满足条件的字母。
代码

#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
const int N = 1e6+10;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        string s;
        cin>>s;
        bool flag=true;
        int id=-1;
        int len=s.length();
        for(int i=0 ; i<len ; i++)
            if(s[i]=='a')
            {
                id=i;
                break;
            }
        if(id==-1) flag=false;
        if(!flag)
        {
            cout<<"NO"<<endl;
            continue;
        }
        int l=id-1,r=id+1;
        char c='b';
        int cnt=1;
        while(cnt<len)
        {
            //cout<<l<<" "<<r<<" "<<c<<endl;
            bool flag1=false;
            if(l>=0&&l<len)
            {
                if(s[l]==c)
                {
                    l--,cnt++,c++;
                    flag1=true;
                    continue;
                }
            }
            if(r<len&&r>=0)
            {
                if(s[r]==c)
                {
                    r++,cnt++,c++;
                    flag1=true;
                    continue;
                }
            }
            if(!flag1)
            {
                flag=false;
                break;
            }
        }
        if(flag) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

C - Pair Programming
题意
给你两个数组a和b,如果 a i = 0 ∣ ∣ b i = 0 a_i=0||b_i=0 ai=0bi=0是相当于加一行代码,如果 a i > 0 或 者 b i > 0 a_i>0或者b_i>0 ai>0bi>0就表明修改 a i 或 b i a_i或b_i aibi行的代码,但是要确定这一行有代码。
把两个数组拼接在一起,尽量使 a i > 0 ∣ ∣ b i > 0 a_i>0||b_i>0 ai>0bi>0的时候有代码。
思路
让两个数组中为0的排在前面,如果没有0就把两个较小的放在前面。
代码

#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
const int N = 1e6+10;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
int a[110],b[110],ans[110];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        memset(ans,0,sizeof ans);
        int k,n,m;
        cin>>k>>n>>m;
        for(int i=1 ; i<=n ; i++) cin>>a[i];
        for(int i=1 ; i<=m ; i++) cin>>b[i];
        int i=1,j=1;
        bool flag=true;
        for(int z=1 ; z<=n+m ; z++)
        {
            if(a[i]==0&&i<=n)
            {
                ans[z]=a[i],i++,k++;
                continue;
            }
            if(b[j]==0&&j<=m)
            {
                ans[z]=b[j],j++,k++;
                continue;
            }
            if(k>=a[i]&&i<=n)
            {
                ans[z]=a[i],i++;
                continue;
            }
            else if(k>=b[j]&&j<=m)
            {
                ans[z]=b[j],j++;
                continue;
            }
            else flag=false;
        }
        if(flag)
        {
            for(int z=1 ; z<=n+m ; z++) cout<<ans[z]<<" ";
            cout<<endl;
        }
        else cout<<"-1"<<endl;
    }
    return 0;
}

D. Co-growing Sequence
题意
定义一种递增序列,如果 a i a_i ai& a i + 1 = a i a_{i+1}=a_i ai+1=ai那就说明这个序列是递增的。
现在给你一个序列x,让你对x进行构造,使成为递增序列,构造的方式是
x i x_i xi= x i x_i xi^ y i y_i yi,让你找出最小的y的序列。
思路
直接模拟就可以了。
代码

#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
const int N = 1e6+10;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
int a[N],ans[N];
int qmi(int n,int k)
{
    int res=1;
    while(k)
    {
        if(k&1) res*=n;
        n*=n;
        k>>=1;
    }
    return res;
}
int f(int x,int y) {
    int x_b[35];
    int y_b[35];
    int x_b1[35];
    int y_b1[35];
    memset(x_b,0,sizeof x_b);
    memset(y_b,0,sizeof y_b);
    int cnt_x=0,cnt_y=0;
    while(x)
    {
        x_b[++cnt_x]=x%2;
        x/=2;
    }
    while(y)
    {
        y_b[++cnt_y]=y%2;
        //cout<<y_b[cnt_y]<<endl;
        y/=2;
    }
    for(int i=1 ; i<=cnt_x ; i++)
    {
        x_b1[i]=x_b[cnt_x-i+1];
    }
    for(int i=1 ; i<=cnt_y ; i++)
    {
        y_b1[i]=y_b[cnt_y-i+1];
    }
    int ans=0;
    /*for(int i=1 ; i<=30 ; i++) cout<<x_b[i]<<" ";
    cout<<endl;
    for(int i=1 ; i<=30 ; i++) cout<<y_b[i]<<" ";
    cout<<endl;*/
    for(int i=1 ; i<=30 ; i++)
    {
        if(x_b[i]==1&&y_b[i]==0) ans+=qmi(2,i-1);
    }
    return ans;
}
int main()
{
    

以上是关于Codeforces Round #731 (Div. 3)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #731 (Div. 3)

Codeforces Round #731 (Div. 3) E题解

Codeforces Round #731 (Div. 3) B. Alphabetical Strings

Codeforces Round #731 (Div. 3) E. Air Conditioners

Codeforces Round #731 (Div. 3) F. Array Stabilization (GCD version)

Codeforces Round #731 (Div. 3) F. Array Stabilization (GCD version)