Codeforces Round 866 (Div. 2) (A~C)

A. Yura's New Name

分析

只有两个_的时候中间需要加^,注意的点,当_在首位时需要在_的左边加上^,其次特判"^"凑成^^即可。

代码实现

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
const int N = 100010,mod = 1e9+7;
int n,m;

void solve()
{
    string s;
    cin >> s;
    int ans = 0;
    if(s[0] == '^' && s.size() == 1)
    {
        cout << 1 << '\n';
        return ;
    }
    for(int i = 0;i < s.size(); i++)
    {
        if(s[i] == '_')
        {
            if(i == 0) ans++;
            if(i + 1 < s.size() && s[i+1] != '^') ans++;
            else if(i + 1 == s.size()) ans++;
        }
    }
    cout << ans << '\n';
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int tt;
    cin >> tt;
    while(tt--)
    {
        solve();
    }
    return 0;
}

B. JoJo's Incredible Adventures

分析

通过画图,发现了一些特点,比如011110的表已在Note中解释,011110和111001其实一样的答案,只是表的顺序不一样就是将倒数第二行当了第一行,矩形的长最长是连续一的个数(求的时候看成环),我们求的是矩形的最大面积,设矩形最长的边为k我们可以知道矩形的面积可以是1*k,2*(k-1),3*(k-2)...,后来我就分情况猜测了下答案,当k==n是答案k*k,其余情况分k为奇偶,奇数答案(k+2)/2*(k+2)/2,k为偶数答案(k+2)/2*k/2,证明我不怎么会。

 代码实现

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
const int N = 200010,mod = 1e9+7;
int n,m;

void solve()
{
    string s;
    cin >> s;
    n = s.size();
    s = s + s + s;
    int len = 0;
    for(int i = 0;i < s.size(); i++)
    {
        if(s[i] == '0') continue;
        int j = i;
        while(s[j] == '1' && j < s.size())
        {
            j++;
        }
        len = max(len,min(j - i,n));
        i = j - 1;
    }
    ll ans = 0;
    if(len == n) ans = 1ll * n * n;
    else 
    {
        if(len & 1) ans = 1ll * (len / 2 + 1) * (len / 2 + 1);
        else ans = 1ll * len / 2 * (len / 2 + 1);
    }
    cout << ans << '\n';
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int tt;
    cin >> tt;
    while(tt--)
    {
        solve();
    }
    return 0;
}

C. Constructive Problem

分析

假设当前mex值为cur,我可以对某一连续子区间全改为某一个值能不能是现在的mex值为cur+1。首先我们要求出cur,思考怎么能让mex变为cur+1,一定是将某些值变为cur,因为原先数组中不含cur,分情况讨论,如果当前数组含有cur+1,又因为是对连续子区间操作,所有其中的数都要修改,如果不含cur+1,那就看0~cur-1中有没有重复的数或者是大于cur+1的数,进行操作后需要对其验证的看0~cur是否都有,有即输出Yes,否则输出No。

代码实现

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
const int N = 200010,mod = 1e9+7;
int n,m;
int a[N];

void solve()
{
    map<int,int> mp;
    cin >> n;
    for(int i = 1;i <= n; i++) 
    {
        cin >> a[i];
        mp[a[i]]++;
    }
    int cur;
    for(int i = 0;i <= n; i++)
    {
        if(!mp[i])  
        {
            cur = i;
            break;
        }
    }
    int cnt = 0;
    if(mp[cur + 1])
    {
        for(int i = 1;i <= n; i++)
        {
            if(a[i] == cur + 1)
            {
                mp[cur] = 1;
                int j = i;
                while(mp[cur + 1])
                {
                    mp[a[j]]--;
                    j++;
                }
                break;
            }
        }
    }
    else 
    {
        int flag = 0;
        for(int i = 1;i <= n; i++)
        {
            if(mp[a[i]] >= 2 || a[i] > cur) flag = 1;
        }
        if(flag) mp[cur] = 1;
    }
    for(int i = 0;i <= cur; i++)
    {
        if(!mp[i]) 
        {
            cout << "No" << '\n';
            return ;
        }
    }
    cout << "Yes" << '\n';
}

int main()
{
    // ios::sync_with_stdio(false);
    // cin.tie(nullptr);
    int tt;
    cin >> tt;
    while(tt--)
    {
        solve();
    }
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值