首页 > 其他分享 >Codeforces Round 966 (Div. 3)

Codeforces Round 966 (Div. 3)

时间:2024-08-14 08:56:18浏览次数:15  
标签:966 int text ++ cin Codeforces -- solve Div

Abstract

第二次打 CodeForce 。


A. Primary Task

Idea

签到题。
意思就是说给一个字符串,要你判断一下前两位是不是 10 ,除去前两位后后面的部分是不是一个大于等于 2 的数(不能有前导零)。

Code

#include <bits/stdc++.h>
using namespace std;

void solve()
{
    string text;
    cin >> text;
    if (text.length() <= 2)
    {
        cout << "NO" << endl;
        return;
    }
    if (!(text[0] == '1' && text[1] == '0'))
    {
        cout << "NO" << endl;
        return;
    }
    if (text[2] == '0')
    {
        cout << "NO" << endl;
        return;
    }
    else if (text[2] == '1')
    {
        if (text.length() == 3)
        {
            cout << "NO" << endl;
            return;
        }
    }
    cout << "YES" << endl;
    return;
}

signed main()
{
    ios::sync_with_stdio(0), cin.tie(nullptr);
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

B. Seating in a Bus

Idea

签到题。
给你一个序列,第 i 项表示第 i 个上车的人坐的位置,除了第一个人以外,其余的人必须坐在其他人旁边。不难发现所有人必须分布在一个连续区间上,那么我们只用维护左右端点就可以了,时间复杂度是 O(n) 的。

Code

#include <bits/stdc++.h>
using namespace std;
int a[10000000];
void solve()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    int l = a[0], r = a[0];
    for (int i = 1; i < n; i++)
    {
        if (a[i] == l - 1)
        {
            l--;
        }
        else if (a[i] == r + 1)
        {
            r++;
        }
        else
        {
            cout << "NO" << endl;
            return;
        }
    }
    cout << "YES" << endl;
    return;
}

signed main()
{
    ios::sync_with_stdio(0), cin.tie(nullptr);
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

C. Numeric String Template

Idea

签到题。
按顺序遍历字符串,用两个 map 给字母和数字建立起一一映射就可以了。

Code

#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[10000000];
void solve()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    int m;
    cin >> m;
    while (m--)
    {
        map<int, char> q1;
        map<char, int> q2;
        string text;
        cin >> text;
        if (text.length() != n)
        {
            cout << "NO" << endl;
            continue;
        }
        bool ok = 1;
        for (int i = 0; i < n; i++)
        {
            if (q1[a[i]])
            {
                if (text[i] != q1[a[i]])
                {
                    cout << "NO" << endl;
                    ok = 0;
                    break;
                }
            }
            if (q2[text[i]])
            {
                if (a[i] != q2[text[i]])
                {
                    cout << "NO" << endl;
                    ok = 0;
                    break;
                }
            }
            q1[a[i]] = text[i], q2[text[i]] = a[i];
        }
        if (ok)
        {
            cout << "YES" << endl;
        }
    }
    return;
}

signed main()
{
    ios::sync_with_stdio(0), cin.tie(nullptr);
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

D. Right Left Wrong

Idea

这一题不再是简单的模拟了,需要一点贪心。
首先,由于 a[i] >= 1 ,所以我们总是希望尽可能多的取数,对于下面这个序列,我们要如何取数呢?
1 2 3 4 5 6
L L L R R R
我们希望每一个数字被取的次数尽可能多,那么最优的方案就是找到最左边的 L 和 最右边的 R ,之后,再找到剩余的项中,最左边的 L 和最右边的 R ,以此类推。
这显然是双指针,所以时间复杂度是 O(n) 。

Code

#include <bits/stdc++.h>
using namespace std;
#define int long long

int a[10000000];
void solve()
{
    int n;
    cin >> n;
    cin >> a[0];
    for (int i = 1; i < n; i++)
    {
        int m;
        cin >> m;
        a[i] = a[i - 1] + m;
    }
    string text;
    cin >> text;
    int l = -1, r = text.length();
    int ans = 0;
    while (1)
    {
        for (l++; l <= text.length() - 1; l++)
        {
            if (text[l] == 'L')
            {
                break;
            }
        }
        for (r--; r >= 0; r--)
        {
            if (text[r] == 'R')
            {
                break;
            }
        }
        if (l <= r)
        {
            ans += a[r] - a[l - 1];
        }
        else
        {
            break;
        }
    }
    cout << ans << endl;
    return;
}

signed main()
{
    ios::sync_with_stdio(0), cin.tie(nullptr);
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

E. Photoshoot for Gorillas

Idea

一道有点烦人的数学题。
最优的排列是不难找到的。我们可以将矩阵上每一个格子的分值都计算出来,然后从大到小排列,将大猩猩按照从高到低的顺序依次往里面放就可以。
计算矩阵分值的时间复杂度是 O(n*m) ,考虑到对于所有测试样例 n*m <= 2*1e5,可以接受。
最后提一下怎么计算矩阵分值。
对于第 i 行第 j 列的单元格,我们假设方阵的左边位于第 L 列,那么不难得出以下约束条件。

  1. L >= 1
  2. L + k - 1 <= m
  3. L <= j <= L + k - 1

由此,可以得出 L 的取值范围的大小,记作 SL 。
同理可以求出方阵上边界的取值范围,记作 SU ,那么这个单元格的分值就是 SU * SL 。

Code

#include <bits/stdc++.h>
using namespace std;
#define int long long

int n, m, k;
int s;
int h[10000000];
int q[10000000];

void solve()
{
    cin >> n >> m >> k;
    cin >> s;
    int cnt = 0;
    map<int, bool> vis;
    for (int i = 0; i < s; i++)
    {
        cin >> h[i];
    }
    sort(h, h + s);
    map<int, int> times;
    int maxH = 0;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            int R = min(j, m - k + 1);
            int L = max(1LL, (j - k + 1));
            if (R < L)
            {
                continue;
            }
            int U = max(1LL, i - k + 1);
            int D = min(n - k + 1, i);
            if (D < U)
            {
                continue;
            }
            times[(D - U + 1) * (R - L + 1)]++;
            if (!vis[(D - U + 1) * (R - L + 1)])
            {
                q[++cnt] = (D - U + 1) * (R - L + 1);
                vis[(D - U + 1) * (R - L + 1)] = 1;
            }
            maxH = max(maxH, D - U + 1) * (R - L + 1);
        }
    }
    sort(q + 1, q + 1 + cnt);
    int res = 0;
    int cur = cnt;
    for (int i = s - 1; i >= 0; i--)
    {
        if (times[q[cur]])
        {
            times[q[cur]]--;
            res += h[i] * q[cur];
        }
        else
        {
            cur--;
            times[q[cur]]--;
            res += h[i] * q[cur];
        }
    }
    cout << res << endl;
    return;
}

signed main()
{
    ios::sync_with_stdio(0), cin.tie(nullptr);
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

标签:966,int,text,++,cin,Codeforces,--,solve,Div
From: https://www.cnblogs.com/carboxylBase/p/18358105

相关文章

  • Codeforces Round 947 (Div. 1 + Div. 2)
    [传送门](Dashboard-CodeforcesRound947(Div.1+Div.2)-Codeforces)###A.枚举一个位置,把他前面和后面反转一下判断就行。###B.找到最小的数和最小的不是它的倍数的数当作$i$和$j$,判断合不合法即可。###C.不知道怎么就模出来了操作长度一定小于等于3,然后......
  • Codeforces Round 946 (Div. 3)
    ###G.一眼看上去很想个背包,然后发现好像不大能做。考虑反悔贪心。对于当前的$c_i$,如果到现在攒的钱足够买这个,那就直接买了它。如果钱不够,就从之前的买过的里面把一个最大的给退掉,然后买这个,优先队列维护即可。```c++#include<bits/stdc++.h>#defineintlonglongu......
  • Codeforces Round 964 (Div. 4)
    ###A.```c++#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+7;voidsolve(){  intx;  cin>>x;  cout<<x/10+x%10<<endl;}intmain(){  intT;  cin>>T;  while(T--)solve();......
  • 【做题记录】Codeforces Round 915 (Div. 2)/CF1905A-F
    @目录A.ConstructiveProblems(800)B.Begginer'sZelda(1100)C.LargestSubsequence(1400)D.CyclicMEX(2000)E.One-X(2400)F.FieldShouldNotBeEmpty(2600)提交记录A.ConstructiveProblems(800)注意到,对于\(n\timesn\)的矩阵,只需要把对角线全染黑即可。推广到\(......
  • Codeforces Round 903 (Div. 3) F. Minimum Maximum Distance
    https://codeforces.com/contest/1881/problem/F不难发现一件事情,我们这里最后的答案所在的点是1和3号点。我们有没有发现一个性质:就是这两个点都是红点间的路径上的,而且最后的答案就是最长的红点间的距离的长度除以二上取整。那么,我们怎么找到最长的红点间的距离呢?很显......
  • Codeforces Round 964 (Div. 4)
    CodeforcesRound964(Div.4)标题CodeForces1999A.A+BAgain?时限1second空限256megabytes题目描述给定一个两位数的正整数\(n\),求其数字之和。输入第一行包含一个整数\(t\)(\(1\leqt\leq90\))——测试用例的数量。每个测试用例的唯一一行包含一个两位数的正......
  • [题解]P3966 [TJOI2013] 单词
    P3966[TJOI2013]单词用\(p[i]\)来表示经过节点\(i\)的字符串个数。那么节点\(u\)的答案就是fail树上,以\(u\)为根的子树的\(p\)之和。由于我们已经计算了\(p[i]\),所以字符串\(i\)作为模式串本身&模式串前缀的情况已经考虑了。还需考虑\(i\)作为模式串后缀的情况,而只有fail树上......
  • 报错:2024-08-12T18:39:35.313+08:00 ERROR 29668 --- [demo2] [ main] o.s.
    org.springframework.beans.factory.BeanDefinitionStoreException:Failedtoparseconfigurationclass[com.example.demo.DemoApplication]atorg.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:179)~[spring-con......
  • AGC182 C - Sum of Number of Divisors of Product
    题目大意:求长度为1,2,...N,的好序列因数个数。好序列满足每个元素\(1\leqx\leqM\)\(N\leq1e18,M\leq16\)很容易想到维护所有好序列质因数的指数+1的乘积。\(\prodb_i,1\leqi\leq6\).考虑每个数对这个乘积的影响。假设我们只有2,3,5这三个质数,序列末端添加15,......
  • 965div2补题
    A.FindKDistinctPointswithFixedCenter思路简单构造,我居然在这个题上因为没看懂英文还有机翻英太过逆天导致我WA了好几发......ACcode:#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;voidsolve(){intx,y,k;cin>>x>>y>>k;in......