Codeforces Round #724 (Div. 2)部分题解(A-D)

传送门:Dashboard - Codeforces Round #724 (Div. 2) - Codeforces

//暴力场……

A. Omkar and Bad Story(思维/暴力)
题意:给定数组,生成新数组使得其中存在自身和原数组中任意两数差的绝对值,2n100,100ai100,新数组大小不超过300
思路:硬模拟生成或者易得输出0-100存在所有可能。
 
B. Prinzessin der Verurteilung
题意:求给定字符串的MEX(定义MEX为子串中不存在的字典序最小串)(1n1000)
思路:粗估可得LEN(MEX)<5
代码:
ll t,n,m,k,ans,cnt,sum;
ll a[N],b[N],vis[30][30][30];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    //IO
    cin>>t;
    while(t--)
    {
        mem(vis,0);
        cin>>n;
        string s;
        cin>>s;
        rep(i,1,n)a[i]=s[i-1]-'a'+1;
        rep(i,1,n)
        {
            vis[a[i]][0][0]=1;
            if(i<n)vis[a[i]][a[i+1]][0]=1;
            if(i<n-1)vis[a[i]][a[i+1]][a[i+2]]=1;
        }
        string ans="*";
        rep(i,1,26)
        {
            if(vis[i][0][0]==0)
            {
                ans='a'+i-1;
                i=30;
            }
        }
        if(ans=="*")
        {
            rep(i,1,26)
            {
                rep(j,1,26)
                {
                    if(vis[i][j][0]==0)
                    {
                        ans='a'+i-1;
                        ans+='a'+j-1;
                        j=30;
                        i=30;
                    }
                }
            }
        }
        if(ans=="*")
        {
            rep(i,1,26)
            {
                rep(j,1,26)
                {
                    rep(k,1,26)
                    {
                        if(vis[i][j][k]==0)
                        {
                            ans='a'+i-1;
                            ans+='a'+j-1;
                            ans+='a'+k-1;
                            j=30;
                            i=30;
                            k=30;
                        }
                    }
                }
            }
        }
        cout<<ans<<endl;
    }
}
View Code

C. Diluc and Kaeya

题意:给定字符串由D和K组成,求对所有前缀子串最多可划分为几部分使得多余分割后任意两部分有(cnt_d(i):cnt_k(i))=(cnt_d(j):cnt_k(j))。

思路:map记录比例。

代码:

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    //IO
    cin>>t;
    while(t--)
    {
        map<double,ll>mp;
        cin>>n;
        char s[N];
        cin>>s+1;
        ll D=0,K=0;
        rep(i,1,n)
        {
            if(s[i]=='D')D++;
            else K++;
            mp[(double)(D)/K]++;
            cout<<mp[(double)(D)/K]<<" ";
        }
        cout<<endl;
    }
}
View Code

D. Omkar and Medians

题意:给定数组a,生成新数组使得新数组b[1]->b[i*2-1]的中位数=a[i]

思路:线段树/set

代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,flag=0;
        scanf("%d",&n);
        vector<int>b(n);
        for(int i=0;i<n;i++)scanf("%d",&b[i]);
        set<int>s{b[0]};
        for(int i=1;i<n;i++)
        {
            auto kk=s.insert(b[i]).first;
            if(b[i]!=b[i-1]&&*(b[i]>b[i-1]?prev(kk):next(kk))!=b[i-1])flag=1;
        }
        printf(flag?"NO":"YES");
        puts("");
    }
}
View Code

 

 

 

posted @ 2021-06-09 14:36  Geospiza  阅读(90)  评论(0)    收藏  举报